在STM32F4(Cortex-M4)上,DMA双缓冲模式本身不涉及硬件缓存一致性,因为F4无数据缓存(仅Cortex-M7及以上有)。因此,核心问题是确保CPU与DMA对内存的访问顺序正确,避免编译器或CPU乱序导致数据陈旧。实操建议:1)将缓冲区定义为volatile,防止编译器优化;2)在启动DMA前,使用__DSB()(数据同步屏障)和__DMB()(数据内存屏障)确保写操作完成;3)在DMA传输完成中断中,先读取DMA状态寄存器(如NDTR)确认传输完成,再使用__DMB()后访问缓冲区;4)若使用MPU配置了写缓冲(如SRAM),需确保缓冲区配置为Normal memory,非Device/Strongly-ordered,否则需额外屏障。F4上无需缓存清理,但建议在双缓冲切换时,通过DMA中断或轮询标志位同步,避免CPU在DMA写入期间读取。
mcuku 阿沐 · 2026-08-27