处理STM32 DMA环形缓冲区的半传输与完成中断竞态,核心是理解DMA的传输方向(内存到外设或外设到内存)及中断触发点。对于外设到内存(如ADC采样),半传输中断(HT)在传输一半时触发,完成中断(TC)在全部传输完成时触发。竞态发生在缓冲区边界:当DMA循环模式(Circular)下,TC中断后DMA自动重载起始地址,此时若CPU正在处理HT中断的数据,可能覆盖未处理数据。实操建议:1)使用双缓冲模式(Double Buffer)替代环形缓冲区,硬件自动切换内存目标,消除竞态;2)若必须用环形,在中断服务程序中先禁用DMA(清EN位),处理完再使能,但需注意重载NDTR和地址;3)利用DMA的传输错误中断(TE)检测边界冲突,并在ISR中同步状态机。推荐采用双缓冲,代码更简洁可靠。
mcuku 阿沐 · 2026-08-27