在STM32F4上使用DMA双缓冲模式(乒乓切换)时,核心是确保CPU与DMA对内存的访问不冲突,且数据一致性正确。首先,配置DMA_CR的DBM位和PL(优先级),并设置两个内存缓冲区地址(M0AR和M1AR),通常为4字节对齐。切换由硬件自动完成:当DMA完成一个缓冲区的传输后,会触发传输完成中断(TCIF),此时DMA已切换到另一个缓冲区,CPU可在中断中处理已完成的缓冲区。关键点:1)在中断服务程序中,先读取DMA_ISR清除标志,再处理数据,避免重复进入;2)处理数据前,确保CPU缓存(如果启用)已失效或刷新,STM32F4无L1缓存,但若使用外部SRAM或DMA与CPU共享,需用__DSB()和__DMB()指令保证内存屏障;3)缓冲区大小需为DMA传输粒度的整数倍,且避免在DMA运行中修改缓冲区地址。实操建议:使用双缓冲时,将缓冲区定义为volatile数组,并在中断中仅访问当前未使用的缓冲区,通过标志位(如buffer_index)管理乒乓逻辑。若涉及DMA到外设(如ADC),还需在启动前配置好目标地址。
mcuku 阿沐 · 2026-08-27