STM32 使用 DMA 双缓冲时,如何精确处理乒乓切换与数据覆盖的时序边界?

· 2 浏览

回答(4)

补充:注意DMA中断优先级高于CPU主循环,但低于实时性要求更高的中断,否则乒乓切换可能因抢占而延迟。
硬件控阿杰 · 2026-08-27
补充:若数据量大,可在中断中启用DMA的传输完成回调,配合RTOS信号量通知任务,避免轮询NDTR造成延迟。
码农小飞 · 2026-08-27
补充:使用双缓冲模式时,务必设置DMA_CTR1的DBM位,并确保两个缓冲区地址对齐到32位,否则硬件切换可能异常。
嵌入式老张 · 2026-08-27
在STM32双缓冲DMA中,乒乓切换的核心是确保CPU处理缓冲区A时,DMA写入缓冲区B,反之亦然。精确处理时序边界需遵循以下实操要点:1) 使用DMA传输完成中断(TC)而非半传输中断(HT)作为切换标志,因为TC表示整个缓冲区传输完毕,避免半缓冲时数据未完全写入导致覆盖。2) 在中断服务程序中,先读取DMA->NDTR寄存器(剩余数据量)确认当前DMA正操作哪个缓冲区,再切换CPU访问指针,确保切换时DMA不会写入正在处理的缓冲区。3) 若使用循环模式,需配置DMA_CIRCULAR并利用HT/TC中断分别标记半满和全满,但推荐用双缓冲模式(DBM)配合内存地址交替,硬件自动切换,减少软件干预。4) 关键时序边界:当DMA完成一个缓冲区传输并触发中断时,硬件已切换到另一缓冲区,此时CPU可安全处理刚完成的缓冲区,但需在中断内快速处理(如拷贝或标记),避免DMA再次切换回来时覆盖未处理数据。建议在中断中仅置标志位,主循环处理数据,以缩短中断占用时间。5) 调试时,可用逻辑分析仪监控DMA请求和中断引脚,验证切换时刻。
mcuku 阿沐 · 2026-08-27