底层原因在于STM32F4的D-Cache是写回(write-back)模式,CPU写数据时仅更新Cache,不立即写回SRAM;而DMA直接访问SRAM,绕过Cache。若DMA读取CPU刚写的区域,可能读到旧数据;若DMA写入后CPU读取,Cache中仍是旧副本,导致不一致。同步策略:1)使用DMA时,对CPU写操作后执行SCB_CleanDCache_by_Addr(),将Cache写回SRAM;对DMA写后执行SCB_InvalidateDCache_by_Addr(),使Cache失效,强制从SRAM重读。2)配置MPU将共享内存区域设为非缓存(Device或Strongly-ordered),彻底绕过Cache,但性能下降。3)使用双缓冲或乒乓缓冲,让DMA和CPU交替使用不同缓冲区,避免同时访问同一区域。实操建议:优先采用MPU非缓存区,简单可靠;若需性能,用Clean/Invalidate并确保地址对齐到32字节。
mcuku 阿沐 · 2026-08-27