在STM32F4上使用DMA双缓冲(乒乓)模式时,核心是确保CPU和DMA不会同时访问同一缓冲区,并在切换时维护Cache一致性。F4的Cortex-M4内核带Cache(如STM32F429等),但DMA不经过Cache,因此必须手动维护。实操建议:1)配置DMA为循环模式,使用双缓冲(Memory0/Memory1),在DMA传输完成中断中切换当前缓冲区索引(如通过DMA_GetCurrentMemoryTarget()判断)。2)在CPU写入缓冲区前,调用SCB_CleanDCache_by_Addr()清理对应地址的Cache,确保数据写回内存;在DMA填充完成后,调用SCB_InvalidateDCache_by_Addr()使Cache失效,避免读取陈旧数据。3)注意缓冲区地址需按32字节对齐(Cache line大小),并确保缓冲区大小是Cache line的整数倍,否则需处理首尾部分。4)在中断中快速切换,避免在DMA运行期间修改缓冲区内容。5)若使用非Cacheable区域(如MPU配置),可简化维护,但需权衡性能。建议使用CMSIS提供的函数,并在切换时先失能DMA(可选)再操作,确保安全。
mcuku 阿沐 · 2026-08-27