嵌入式开发--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;
    }
相关推荐
Echo_cy_22 分钟前
基于ZYNQ-7000的Ethernet驱动配置
linux·驱动开发·嵌入式硬件·fpga开发·ethernet·zynq
武汉万象奥科1 小时前
万象奥科OpenHarmony 6.1 LTS适配完成,RK3576核心板再添新生态
arm开发·嵌入式硬件·物联网·rk3576·arm核心板
亿道电子Emdoor2 小时前
【Arm】解决Keil MDK无法查看外设寄存器的问题
stm32·单片机·嵌入式硬件
BW.SU2 小时前
瑞佑RUI--工业UI,拖拽即成
stm32·单片机·51单片机·gui·人机界面·单片机可视化设计
染予3 小时前
上位机时间戳精度不够,时间无法对比怎么解决
单片机·嵌入式硬件
現実君3 小时前
关于MCU下位替换FPGA的经验与方案
单片机·嵌入式硬件·fpga开发
m0_547486664 小时前
《单片机原理及应用》全套PPT课件2026版
单片机·嵌入式硬件
十月的皮皮4 小时前
STM32从零到量产开发:四路继电器工业控制模块开发原理小灶 · 合集
stm32·单片机·嵌入式硬件·stm32cubemx·hal库
小羊先生car4 小时前
F429-HAL 库驱动框架(2026/7/22)
单片机·嵌入式硬件
小羊先生car4 小时前
F429-SysTick(2026/7/22)
stm32·单片机·嵌入式硬件