STM32 使用 DMA 双缓冲传输时,如何精确处理半传输与传输完成中断的时序竞争?

· 1 浏览

回答(4)

双缓冲本质是乒乓,建议用硬件双缓冲模式(如STM32F4的DMA_CTRL),让硬件自动切换,中断只做数据搬运,竞争就没了。
硬件控阿杰 · 2026-08-27
关键在中断优先级:把HT设高、TC设低,利用抢占自然排队。但记得在TC里清HT标志,防止残留。
码农小刘 · 2026-08-27
用DMA的传输完成回调里再查一次NDTR,若NDTR等于半缓冲值,说明HT被吞了,手动补处理。我项目里就这么干,稳。
嵌入式老张 · 2026-08-27
在STM32双缓冲DMA中,半传输中断(HT)与传输完成中断(TC)的时序竞争核心在于:当缓冲区大小恰好为2的幂次时,HT和TC可能在同一周期触发。实操建议:1)在中断服务程序中,优先读取DMA->ISR和DMA->NDTR寄存器,通过NDTR值判断当前实际传输位置,避免依赖标志位顺序;2)使用临界区(如__disable_irq/__enable_irq)保护缓冲切换逻辑,但注意保持临界区极短(仅寄存器操作),防止丢失中断;3)若使用循环模式,建议将缓冲区大小设为奇数个半字(如3、5),强制HT与TC错开;4)在TC中断中,先处理半缓冲数据(若HT未触发),再切换指针,确保数据完整性。实测中,加一个volatile标志位记录HT是否已处理,可有效避免重复处理。
mcuku 阿沐 · 2026-08-27

🧰 配套工具

⏱️ 定时器计算器