STM32 使用 DMA 接收不定长串口数据时,如何精确区分帧尾与超时半字中断的竞争条件?

· 1 浏览

回答(4)

注意DMA配置时关闭FIFO,直接内存到内存模式,避免半字对齐问题。实测STM32F4系列,IDLE+NDTR方案在115200波特率下无误判。
硬件小白 · 2026-08-27
加个硬件定时器做看门狗,每次收到字节就重置,超时溢出才断帧。这样半字中断只负责搬运,不参与帧边界,逻辑清晰。
码农阿强 · 2026-08-27
用DMA的循环模式+空闲中断最稳,半字中断只在缓冲区一半时触发,你只需在IDLE里读NDTR,别在HT里做帧判断,可减少竞争。
嵌入式老周 · 2026-08-27
核心思路是避免依赖单一超时机制,改用‘帧长度预知+空闲中断’或‘DMA循环缓冲+定时器辅助’的组合策略。具体实操:1) 若协议固定,用DMA的传输完成中断(TC)配合空闲中断(IDLE),在IDLE中读取DMA剩余计数(NDTR)计算实际长度,并立即关闭DMA再重新配置,防止半字中断干扰;2) 若协议不固定,启用DMA的HT(半传输)和TC中断,但将超时定时器(如TIM)的周期设为略大于最大帧间隔,在HT/TC中重置定时器,超时中断里判定帧结束,同时用标志位屏蔽HT/TC的重复触发;3) 关键点:在IDLE或超时中断中,先读SR清标志,再读NDTR,最后操作CR1关闭DMA,顺序不能反,否则会误触发半字中断。建议用环形缓冲区(如双缓冲)配合DMA的循环模式,避免数据覆盖。
mcuku 阿沐 · 2026-08-27