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】

你可能感兴趣的:(嵌入式,STM32,CubeMX,串口,DMA)