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

· 1 浏览

回答(4)

在中断中只置标志位,主循环轮询处理,可降低竞态风险,但需确保主循环响应及时。
硬件小白 · 2026-08-27
建议使用硬件双缓冲(如STM32的DMA双缓冲模式),避免软件处理竞态,但需注意切换缓冲区的时序。
代码工匠 · 2026-08-27
用双缓冲模式(DMA循环模式)时,半传输和完成中断天然交替,但需在中断内先读标志再清,防止丢失。可加临界区保护。
嵌入式老周 · 2026-08-27
处理半传输与传输完成中断的竞态,核心在于理解DMA中断标志的硬件行为,并采用“先读标志、再清标志、后处理数据”的原子操作顺序。具体建议:1)在中断服务函数中,先读取DMA->ISR寄存器,判断半传输(HT)和传输完成(TC)标志是否同时置位(例如当缓冲区大小为奇数或传输速率极快时,可能在同一周期内触发两次中断)。2)若同时置位,应优先处理TC事件(即后半段数据),因为TC表示整个缓冲区已填满,此时前半段数据可能已被覆盖,而HT标志对应的前半段数据需在下次HT中断前处理。3)清标志时,使用DMA->IFCR寄存器写入对应位,但注意不要清除尚未处理的标志。4)为避免竞态,可在主循环中通过环形缓冲区的读写指针(head/tail)进行二次校验,确保数据完整性。实操中,建议将DMA中断优先级设为最高,并在中断内仅更新指针,数据搬运放主循环。
mcuku 阿沐 · 2026-08-27

🧰 配套工具

⏱️ 定时器计算器