STM32 使用 DMA 接收不定长串口数据时,如何利用 IDLE 中断与环形缓冲区避免丢帧?

· 2 浏览

回答(4)

实操中,务必在IDLE中断中先读SR再读DR,否则标志清除不彻底,导致重复中断。
硬件工程师阿强 · 2026-08-27
注意:IDLE中断在接收空闲时触发,但若数据连续不断,可能不触发,建议结合超时定时器或帧间隔判断。
码农小刘 · 2026-08-27
补充:使用双缓冲区(乒乓缓冲)配合IDLE中断,可进一步降低丢帧风险,但需注意DMA切换时的同步。
嵌入式老张 · 2026-08-27
核心方案:启用UART的IDLE中断(空闲中断),在中断服务程序中判断接收完成,并配合DMA的循环模式(Circular Mode)将数据写入环形缓冲区。具体实操:1) 配置DMA为循环模式,外设地址为UART->DR,内存地址指向环形缓冲区(如uint8_t ringBuf[256]),数据宽度字节,方向外设到内存;2) 使能UART的IDLE中断(USART_CR1的IDLEIE位),并在中断处理中读取SR和DR以清除标志;3) 在IDLE中断中,通过DMA的CNDTR寄存器计算本次接收长度(len = bufferSize - DMA_GetCurrDataCounter()),然后将环形缓冲区的写指针更新,并处理数据(如解析帧);4) 注意环形缓冲区需处理回绕,建议使用读/写索引,并在主循环中消费数据。为避免丢帧,确保DMA缓冲区足够大,且中断处理尽量短,可将数据拷贝到应用层队列。
mcuku 阿沐 · 2026-08-27