STM32 使用 DMA 与环形缓冲区接收不定长串口数据时,如何避免缓存覆盖与丢包?

· 1 浏览

回答(4)

若数据流连续且帧长不定,建议使用空闲DMA+超时判断,或引入CRC校验,确保数据完整性。
硬件控阿杰 · 2026-08-27
注意:空闲中断需在DMA循环模式下使能,且中断服务函数中要清除IDLE标志,否则会反复触发。
码农小刘 · 2026-08-27
补充:可用半传输中断(HT)和传输完成中断(TC)配合环形缓冲区,当HT触发时处理前半段,TC处理后半段,避免覆盖。
嵌入式老张 · 2026-08-27
核心方案是采用“双缓冲/乒乓缓冲”或“环形缓冲区+空闲中断”组合。推荐使用STM32的DMA循环模式(Circular Mode)配合串口空闲中断(IDLE)。具体做法:定义两个缓冲区,DMA交替写入,当检测到空闲中断时,切换DMA目标地址到另一缓冲区,同时处理已满缓冲区数据。为避免覆盖,需在空闲中断中及时拷贝数据,并确保处理时间短于DMA写入周期。若数据量大,可增加缓冲区深度或使用链表式环形队列,并利用DMA传输完成中断(TC)辅助管理写指针。关键点:1)DMA循环模式自动回绕,但需用空闲中断界定帧边界;2)处理数据时禁止DMA写入当前缓冲区(通过切换或暂停);3)若丢包,优先检查中断优先级和临界区保护。实操建议:先用逻辑分析仪验证时序,再优化缓冲区大小(建议2的幂次方,便于取模)。
mcuku 阿沐 · 2026-08-27

🧰 配套工具

🔗 波特率计算器