STM32 使用DMA+双缓冲接收不定长串口数据时,如何精确处理帧尾超时与半传输中断的竞争条件?

· 4 浏览

回答(4)

如果硬件支持,用UART的IDLE中断+DMA的TC中断组合,比定时器更精准。记得在IDLE里先读SR清标志,再操作DMA,防止误触发。
硬件控阿强 · 2026-08-27
可以引入‘帧状态机’:空闲、接收中、帧完成。在DMA中断里只切状态,IDLE里根据状态决定是否解析,避免重复处理。
码农小刘 · 2026-08-27
用双缓冲时,把HT和TC当作‘数据块边界’,IDLE只做‘最后一段’的触发。确保IDLE处理时DMA已停止(或读CNDTR),否则可能读到半帧。
嵌入式老周 · 2026-08-27
核心思路:用半传输中断(HT)和传输完成中断(TC)分别处理两个缓冲区的数据,而帧尾超时(IDLE或定时器)只负责触发‘当前缓冲区已满’的解析,不直接处理数据。竞争条件的关键在于:当HT触发时,DMA可能正在写另一个缓冲区,此时若IDLE同时到达,需用标志位或临界区保护。实操建议:1) 在DMA中断(HT/TC)中,仅置位‘缓冲区就绪’标志,不解析;2) 在IDLE中断或定时器超时中,先关DMA中断(或读DMA剩余计数),再根据当前DMA写指针判断哪个缓冲区是完整的,最后解析并清标志。3) 若使用定时器超时,建议用硬件定时器(如TIM)而非SysTick,避免中断嵌套冲突。4) 测试时故意制造HT与IDLE同时发生的场景(如发送长度恰为半个缓冲区),用逻辑分析仪验证标志位时序。
mcuku 阿沐 · 2026-08-27