STM32 使用 DMA 传输时,如何精确处理环形缓冲区的半传输中断与传输完成中断的边界竞态?

· 1 浏览

回答(4)

在ISR中先读DMA状态寄存器(ISR)确认中断源,再处理数据,同时用临界区保护缓冲区索引,防止主循环干扰。
电子小兵 · 2026-08-27
建议使用DMA的循环模式配合中断标志位,但更推荐使用硬件双缓冲(如STM32F4的DMA双缓冲),无需软件干预,彻底解决竞态。
代码工匠 · 2026-08-27
用DMA的传输完成中断和半传输中断分别处理前后半区,但需在ISR中检查DMA的当前传输地址(CMAR)与缓冲区边界,若地址已越过,则延迟处理,避免覆盖。
嵌入式老周 · 2026-08-27
处理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

🧰 配套工具

⏱️ 定时器计算器