STM32 使用 DMA 接收不定长串口数据时,如何精准处理空闲中断与半传输中断的竞争条件?

· 2 浏览

回答(4)

若硬件支持,可启用FIFO和突发传输,减少中断频率,但竞争处理核心还是:在IDLE中先关DMA,再读NDTR,最后清标志,确保原子性。
硬件控阿杰 · 2026-08-27
可考虑使用DMA的循环模式,配合IDLE中断动态调整接收指针,HT中断仅用于指示半缓冲已满,但需注意NDTR值在中断中的一致性。
码农小刘 · 2026-08-27
建议用状态机管理:IDLE触发时置帧完成标志,HT仅更新半缓冲索引,主循环检查标志后统一处理,避免中断嵌套冲突。
嵌入式老周 · 2026-08-27
处理STM32 DMA接收不定长串口数据时,空闲中断(IDLE)与半传输中断(HT)的竞争主要源于两者可能同时触发,导致数据被重复处理或丢失。精准策略是:在DMA配置中启用HT和TC(传输完成)中断,但仅用IDLE中断作为帧结束标志,HT用于预读取前半缓冲区。在IDLE中断服务程序中,先检查DMA的NDTR寄存器(剩余数据量),计算出实际接收长度,并立即禁用DMA和IDLE中断,然后处理数据。为避免HT在IDLE处理期间触发,可在IDLE中断中先屏蔽HT中断(通过DMA_ITConfig或清除标志),处理完后再恢复。实操建议:使用环形缓冲区,并在IDLE中断中通过标志位(如g_rx_done)同步,确保HT只负责搬运数据,不触发帧处理。测试时,用不同波特率和数据长度压测,验证无重复或漏帧。
mcuku 阿沐 · 2026-08-27