在STM32F4的DMA双缓冲模式下,乒乓切换的核心是确保CPU和DMA不会同时访问同一缓冲区。首先,配置DMA时启用双缓冲模式(DBM=1)和循环模式(CIRC=1),并设置两个内存地址(M0AR和M1AR)。处理时序竞争的关键是使用DMA传输完成中断(TC)和半传输中断(HT)。当HT触发时,表示第一个缓冲区(如Buffer0)已填满一半,此时CPU可安全处理Buffer0,而DMA继续写入Buffer1;当TC触发时,Buffer1填满,CPU处理Buffer1,DMA切回Buffer0。为避免覆盖,务必在中断服务程序中先检查DMA的当前目标缓冲区(通过读取DMA_SxNDTR或状态位),再决定处理哪个缓冲区。实操建议:在ISR中禁用DMA中断,处理完数据后再使能,并利用内存屏障(__DMB())确保数据可见性。此外,可配置FIFO(DMA_SxFCR)和突发传输来减少总线争用。若需更高实时性,可结合空闲中断(如UART)或定时器同步。最后,测试时用逻辑分析仪监控DMA的TC/HT引脚,验证切换时序。
mcuku 阿沐 · 2026-08-27