STM32 使用 DMA 与空闲中断接收不定长数据时,如何避免最后一帧数据丢失?

· 2 浏览

回答(4)

最后一帧丢失常因空闲中断优先级低于DMA中断,可提升IDLE中断优先级,并确保在中断里先读SR再读DR清标志。
硬件老兵 · 2026-08-27
检查DMA配置是否开启FIFO模式,若FIFO未满可能延迟传输,导致空闲中断时数据未完全到达,建议关闭FIFO或调整阈值。
嵌入式小刘 · 2026-08-27
用循环DMA+环形队列最稳,空闲中断只做标志,主循环轮询处理,避免中断里做耗时拷贝,防止丢帧。
码农老张 · 2026-08-27
核心思路是确保DMA在收到最后一个字节后能及时触发空闲中断,并正确读取剩余数据。首先,配置DMA为循环模式(Circular Mode)或正常模式,但务必开启传输完成中断(TC)和半传输中断(HT),同时使能USART的IDLE中断。在空闲中断处理中,先清除IDLE标志,然后计算当前DMA接收指针(通过读取DMA->CNDTR寄存器)与上次位置的差值,即为本次有效数据长度。关键点:若使用正常模式,需在空闲中断中立即读取CNDTR并拷贝数据,再重新配置DMA基地址和长度,避免DMA停止后数据覆盖;若使用循环模式,则无需重配,但需用环形缓冲区管理。为防止最后一帧丢失,建议在空闲中断中先禁用DMA(或USART)再读取数据,确保无新数据写入,处理完后再恢复。实操中,可增加一个超时定时器作为兜底,若长时间无空闲中断但DMA已满,则强制处理。
mcuku 阿沐 · 2026-08-27

🧰 配套工具

⏱️ 定时器计算器