STM32 CubeMX 利用设置串口UART采用DMA接收

一、踩过的坑

1、CubeMX 生成工程的时候询问是否升级固件F103的1.61版本库,可以直接忽略,选择本地已经安装的1.60。否则不会导入HAL库到工程中。

2、产生代码的最后一步,选择对每个外设分别生成.c/.h文件,项目结构更清晰。

3、要启用下载的话必须在Pinout页面选择PA13和PA14,为调试接口,以STM32F103RB为例。

4、接口配置Configuration 中选择SYS,启用DEBUG为Serial Wire,时基选择SysTick. (1ms)。

5、要使用RTC的话,需要选择RCC 外部低速时钟LSE为:Crystal.

6、创建好工程需要对项目进行设置,配置调试和下载SW,选择为J-Link/J-Trace Cortex, Port为SW, FlashDownload 选上Reset and Run.

7、CUBEMX的串口数据位数包括校验位,有校验在8位位宽的时候数据设置为9,无校验设置为8.

8、生成工程中需要增加以下代码:

(1)stm32f1xx_it.c 在对应的USART1_IRQHandler添加中断入口USART1_ReceiveIDLE();

(2)usart.c 中完成USART1_ReceiveIDLE():

     uint32_t temp;  

    if((__HAL_UART_GET_FLAG(&huart1,UART_FLAG_IDLE) != RESET))  

    {

      __HAL_UART_CLEAR_FLAG(&huart1,UART_FLAG_IDLE);

        temp = huart1.Instance->SR;

        temp = huart1.Instance->DR;            

        HAL_UART_DMAStop(&huart1);  

        temp = huart1.hdmarx->Instance->CNDTR;  

        Usart1_RX.rx_len =  UART1_BUFF_SIZE - temp;   

        Usart1_RX.receive_flag=1;  

        HAL_UART_Receive_DMA(&huart1,Usart1_RX.RX_Buf,UART1_BUFF_SIZE);                  

    }     

(3)usart.c中添加void USART1_ClearIT()主要是启用  HAL_UART_Receive_DMA和 __HAL_UART_ENABLE_IT。

{

    __HAL_UART_DISABLE_IT(&huart1,UART_IT_PE);

    __HAL_UART_DISABLE_IT(&huart1,UART_IT_TXE);

    __HAL_UART_DISABLE_IT(&huart1,UART_IT_TC);

    __HAL_UART_DISABLE_IT(&huart1,UART_IT_RXNE);

    __HAL_UART_DISABLE_IT(&huart1,UART_IT_LBD);

    __HAL_UART_DISABLE_IT(&huart1,UART_IT_CTS);

    __HAL_UART_DISABLE_IT(&huart1,UART_IT_ERR);

    

    __HAL_UART_CLEAR_FLAG(&huart1,UART_FLAG_IDLE);                 

        HAL_Delay(10);

    __HAL_UART_CLEAR_FLAG(&huart1,UART_FLAG_TC);                  

      HAL_UART_Receive_DMA(&huart1, Usart1_RX.RX_Buf, UART1_BUFF_SIZE); 

  __HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);                 

}

(4)在Main.c中 启用接收中断,调用void USART1_ClearIT()。然后就可以通过Usart1_RX.receive_flag和 Usart1_RX.rx_len来处理数据了。

记录于【2018-11-6】

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在使用STM32CubeMX进行DMA串口接收的过程中,可以使用以下方法: 首先,在烧录完成后打开串口调试助手,同样搜索我们的串口,然后将HEX文件添加进去。 其次,在代码中,可以创建两个功能函数来实现串口发送和接收的功能。 串口发送功能函数可以使用DMA方式发送数据,通过调用HAL_UART_Transmit_DMA函数来发送数据。 而串口接收功能函数可以使用DMA方式接收数据,通过调用HAL_UART_Receive_DMA函数来重新打开DMA接收。 这样就可以实现在STM32CubeMX中使用DMA方式进行串口接收了。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [使用stm32cubeMX进行串口DMA收发](https://blog.csdn.net/boomboomy/article/details/121147873)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [【STM32】HAL库 STM32CubeMX教程十一---DMA (串口DMA发送接收)](https://blog.csdn.net/as480133937/article/details/104827639)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值