STM32F4 系列使用 DMA 传输时,如何精确处理环形缓冲区的半传输中断与传输完成中断的时序竞争?

· 1 浏览

回答(4)

建议用硬件双缓冲(如STM32F4的DMA双缓冲模式),自动切换内存目标,HT/TC只做标志位,主循环轮询处理,简单可靠。
芯片猎人 · 2026-08-27
用定时器触发DMA传输,并让定时器中断优先级高于DMA中断,这样时序可预测,但会牺牲一定吞吐量。
码农小飞 · 2026-08-27
可以开启DMA的传输错误中断(TE),并在HT/TC处理前检查DMA状态寄存器,若发生错误则重置缓冲区,防止数据错位。
嵌入式老周 · 2026-08-27
核心思路:利用DMA的半传输(HT)和传输完成(TC)中断天然形成环形缓冲区的两个半区边界,但需在中断服务程序中先读取DMA的NDTR寄存器(剩余数据量)再处理数据,避免因中断延迟导致边界漂移。实操建议:1)配置DMA为循环模式,设置传输长度=缓冲区大小,使HT和TC各触发一次;2)在HT中断中处理前半区,TC中处理后半区,但进入中断后立即读取NDTR,若NDTR接近缓冲区一半(如<半区长度/2),说明实际已进入后半区,需调整处理逻辑;3)使用临界区保护共享索引,或采用双缓冲(ping-pong)结构,将HT/TC映射到两个独立缓冲区,彻底消除竞争。注意:若DMA优先级低于CPU中断,需在中断内快速读取NDTR并缓存,避免被更高优先级中断抢占后状态丢失。
mcuku 阿沐 · 2026-08-27

🧰 配套工具

⏱️ 定时器计算器