嵌入式开发--STM32用DMA+IDLE中断方式串口接收不定长数据--之2

在我之前 的文章 嵌入式开发--STM32用DMA+IDLE中断方式串口接收不定长数据 中,介绍过用DMA+IDLE中断来接收不定长数据,就是利用DMA来接收数据,当一帧传送完成后,总线上出现一个完整的空闲帧的时间长度后,STM32会将IDLE标志置位,并产生一个中断。响应这个中断就可以接收不定长度的一帧了。

现在介绍一个更简单的方法,工作逻辑是一样的,但是更简明些。

HAL_UARTEx_ReceiveToIdle_DMA()函数,其原型如下:

HAL_StatusTypeDef HAL_UARTEx_ReceiveToIdle_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size),使用时需要使能串口中断,并开启IDLE中断

CubeMX中设置如下:

开启中断

设置DMA

然后就是软件

c 复制代码
  HAL_UARTEx_ReceiveToIdle_DMA(&huart3, uart3_rxbuf, UART3_RXBUF_LEN);
  __HAL_UART_ENABLE_IT(&huart3, UART_IT_IDLE);	//开启IDLE中断

最后需要重写回调函数

c 复制代码
// 接收事件回调函数,Size是本次接收到的数据长度
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
{    
  u16 i;
  //调试接口uart3收到数据
  if (huart->Instance == USART3) 
  {
    // 1. 停止DMA传输
    HAL_UART_DMAStop(huart);

    // 2. 清除接收缓冲区
    for(i=0; i<Size; i++)
    {
      uart3_rxdata[i] = uart3_rxbuf[i];   //从接收缓冲区提取数据
      uart3_rxbuf[i] = 0;		//这一行可以注释掉,留着它完全是为了调试时看得方便
    }
    // 3. 重新启动接收,DMA指针会自动归零,从头开始接收
    HAL_UARTEx_ReceiveToIdle_DMA(huart, uart3_rxbuf, UART3_RXBUF_LEN);
      
    uart3_rx_len = Size;                      //接收到的数据长度
  }
}

此时,在uart3_rxbuf\[\]中保存的是数据,uart3_rx_len 是长度。

最后在主循环中的处理:

c 复制代码
    //调试接口uart3收到数据
    if(uart3_rx_len != 0)
    {
      //
      
      //做完所有处理之后,将长度清0
      uart3_rx_len = 0;
    }
相关推荐
不悔哥4 天前
开源OV-Watch:怎么做一个智能手表
单片机·开源·嵌入式
XiHongShi20164 天前
STM32F407 RTC定时器例程,建议保存
stm32·单片机·学习
优信电子4 天前
AIT1001 非接触式红外测温模块 STM32 驱动开发实战:从引脚到代码全解析
stm32·嵌入式·温度传感器·红外测温·非接触式测温·ait1001
深圳老胡4 天前
STM32F407 控制 L6470 步进电机驱动 —— 控制过程简介
笔记·stm32·单片机·嵌入式硬件·代码规范
wuyk5554 天前
《WiFi 嵌入式物联网开发全套实战》| 第 16 章 ESP32 AP+STA 双模共存原理与工程坑点
网络·stm32·物联网
女神下凡4 天前
嵌入式设计的各种存储芯片的硬件/软件设计规范,非常全面。
arm开发·单片机·嵌入式硬件
梅梅9664 天前
一款mipi转lvds的lcd调试(LT8912B)
单片机·计算机外设·电脑·显示器·pd芯片
lpfasd1234 天前
展厅中控总体架构
go·串口·中控
开发笔记-阿牛4 天前
蓝牙音乐灯拆解,又一次拆到蓝牙音乐灯芯片CK6865L
人工智能·单片机·嵌入式硬件·音视频·音频
从零开始的嵌入式之旅4 天前
day47
arm开发·经验分享·笔记·嵌入式硬件