• STM32串口DMA+空闲中断接收数据-基于CubeMX创建


    串口空闲中断(UART_IT_IDLE):串口接收数据,超过一个字节的时间内没有再接收到数据的时候发生的

    好处:与传统的判断'\r','\n'为结束位相比,空闲中断判断串口数据接收完毕准确且迅速

    缺点:串口持续不断的发送数据时,无法进入空闲中断。因此需要间隔一个字节以上的时间,间歇式的发送数据。这个缺点在正常使用中,根本不是问题

    下面进入主题


    打开STM32CubeMX,配置如下:

    程序中配置:

    usart.c文件中创建接收数组和处理函数:

    1. #define USART1_RX_MAX 2148
    2. uint8_t Rxbuf[USART1_RX_MAX];
    3. uint16_t Rxlen=0;
    4. void Usart_Receive_Data(UART_HandleTypeDef *huart)
    5. {
    6. if(RESET != __HAL_UART_GET_FLAG(huart, UART_FLAG_IDLE)) //判断是否是空闲中断
    7. {
    8. //清除空闲中断标志(否则会一直不断进入中断)
    9. __HAL_UART_CLEAR_IDLEFLAG(huart);
    10. //计算接收到的数据量
    11. Rxlen = (USART1_RX_MAX) - (__HAL_DMA_GET_COUNTER(&hdma_usart1_rx));
    12. //停止接收
    13. HAL_UART_DMAStop(huart);
    14. }
    15. }

    这里需要注意添加: HAL_UART_DMAStop(huart);//停止接收

    不添加的话,DMA接收不会停止,重新开启DMA接收,RX缓存将不会从0开始接收数据

    stm32f1xx_it.c文件中调用Usart_Receive_Data()

    1. void USART1_IRQHandler(void)
    2. {
    3. /* USER CODE BEGIN USART1_IRQn 0 */
    4. /* USER CODE END USART1_IRQn 0 */
    5. HAL_UART_IRQHandler(&huart1);
    6. /* USER CODE BEGIN USART1_IRQn 1 */
    7. Usart_Receive_Data(&huart1);//调用函数
    8. /* USER CODE END USART1_IRQn 1 */
    9. }

    main.c文件中的main()函数中开启空闲中断启动DMA

    main()函数中,判断Rxlen大于0,则开始处理串口数据:

    1. int main(void)
    2. {
    3. //初始化
    4. __HAL_UART_ENABLE_IT(&huart1,UART_IT_IDLE);//开启空闲中断
    5. HAL_UART_Receive_DMA(&huart1,Rxbuf,USART1_RX_MAX); //启动DMA接收
    6. while(1)
    7. {
    8. if(Rxlen>0){
    9. //处理串口数据
    10. //清空串口缓存并Rxlen=0
    11. memset(Rxbuf,0,USART1_RX_MAX);
    12. Rxlen=0;
    13. //重新开启DMA接收
    14. HAL_UART_Receive_DMA(&huart1,Rxbuf,USART1_RX_MAX); //启动DMA接收
    15. }
    16. }
    17. }

  • 相关阅读:
    031——Lambda表达式
    vxe-table添加排序
    2023NOIP A层联测32
    分享OpenTiny总结VUE目录结构
    U-net详解
    LNMP架构安装及搭建Discuz论坛
    2023年电赛---运动目标控制与自动追踪系统(E题)OpenMV方案
    PHP中=>和->有什么区别?
    单目标应用:墨西哥蝾螈优化算法(Mexican Axolotl Optimization,MAO)求解微电网优化MATLAB
    一起Talk Android吧(第四百一十三回:使用三角函数绘制正弦波)
  • 原文地址:https://blog.csdn.net/oHuanCheng/article/details/132718356