在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