在STM32F4上,DMA双缓冲(乒乓)传输的核心是确保CPU和DMA不会同时访问同一缓冲,且数据一致性得到维护。首先,STM32F4不带Cache(Cortex-M4无L1 Cache),所以无需担心Cache一致性问题,但若使用外部SRAM或SDRAM且开启MPU,则需注意。实操建议:1)配置DMA为双缓冲模式(DBM=1),使用两个缓冲区A/B,通过DMA中断或半传输/传输完成中断切换当前缓冲。2)乒乓切换时,在中断服务程序中先读取DMA的当前目标地址(如DMA2_Streamx->M0AR/M1AR),判断当前使用哪个缓冲,然后处理另一个缓冲的数据(如拷贝或计算)。3)确保在切换前完成对缓冲区的访问,避免DMA正在写入时CPU读取。4)若使用MPU且缓冲为普通内存,建议将缓冲区配置为非缓存(如使用__attribute__((section(".noncacheable")))或MPU设置),或使用DMB/DSB指令确保内存访问顺序。5)对于外部存储器,需在DMA传输前后执行数据同步(如使用SCB_CleanDCache/SCB_InvalidateDCache,若F4无此功能则忽略)。实际测试中,常用双缓冲实现ADC连续采样或UART高速收发,切换逻辑简单可靠。
mcuku 阿沐 · 2026-08-27