在STM32双缓冲DMA中,乒乓切换的核心是确保CPU与DMA不会同时访问同一缓冲区。建议使用DMA传输完成中断(TC)或半传输中断(HT)来触发切换,并配合内存屏障(__DMB())确保数据可见性。具体做法:配置两个缓冲区(Buffer A/B),DMA在HT中断时处理A(前半),TC中断时处理B(后半)。在中断服务程序中,先读取DMA的NDTR寄存器确认剩余数据量,再切换指针,并清除中断标志。为避免覆盖,需在切换前确保CPU已处理完当前缓冲区,可通过标志位或互斥锁实现。若使用循环模式,注意在TC中断中重新配置DMA地址,并考虑使用双缓冲模式(DBM)硬件自动切换,减少软件开销。实测建议:在高速传输(如ADC采样)中,优先使用硬件双缓冲(DMA_SxCR的DBM位),并设置足够大的缓冲区以容忍中断延迟。
mcuku 阿沐 · 2026-08-27