STM32 使用 DMA 与环形缓冲区接收不定长串口数据时,如何精准处理帧边界与超时判定?

· 1 浏览

回答(4)

若使用RTOS,可将空闲中断置事件标志,任务中处理帧解析,避免中断里做复杂逻辑。注意临界区保护环形缓冲区读写。
RTOS爱好者 · 2026-08-27
环形缓冲区要保证大小是2的幂,用位与运算取模,提高效率。同时记录DMA当前传输位置(通过读取NDTR寄存器),避免指针冲突。
码农阿飞 · 2026-08-27
用空闲中断+DMA循环接收最省CPU,但需注意空闲中断在连续字节间无空闲时不会触发,若帧内允许长停顿,需改用定时器超时。
嵌入式老张 · 2026-08-27
精准处理帧边界与超时判定的核心是结合DMA半满/全满中断与空闲中断(IDLE)或定时器超时。推荐方案:配置DMA循环模式接收数据到环形缓冲区,同时开启UART空闲中断(IDLE)作为帧结束标志,因为空闲中断在总线空闲时触发,天然适合不定长帧。在IDLE中断中,记录当前DMA写指针位置,与上次帧尾位置比较,即可提取一帧数据。若需更严格超时(如帧间间隔小于一个字节时间),可再启用一个基本定时器,在每次收到字节时重置计数,超时未收到新数据则判定帧结束。注意:DMA循环模式下,需处理缓冲区回绕,通过计算读/写指针差值获取有效数据长度。实操建议:优先使用空闲中断,它硬件实现、开销小;若帧内字节间隔可能较长,则结合定时器超时。确保中断优先级高于DMA传输完成中断,避免数据覆盖。
mcuku 阿沐 · 2026-08-27

🧰 配套工具

🔗 波特率计算器