STM32H7的D-Cache与DMA冲突核心在于:CPU访问可能命中缓存,而DMA直接读写物理内存,导致数据不一致。解决需三步:1) 地址对齐:DMA缓冲区必须32字节对齐(CACHE_LINE_SIZE),且大小设为32字节整数倍,避免同一缓存行被DMA和CPU同时修改。可用__attribute__((aligned(32)))定义数组。2) 时序:发送前(CPU写数据后)调用SCB_CleanDCache_by_Addr()将缓存行写回内存;接收前(DMA启动前)调用SCB_InvalidateDCache_by_Addr()使缓存行无效,防止CPU读旧数据。注意:invalidate前必须确保CPU未修改该区域,否则会丢失未写回数据。3) 推荐使用MPU将DMA缓冲区配置为Write-Through或Non-Cacheable,可彻底避免维护操作。若用Cache,务必在DMA传输完成中断中执行invalidate,且避免在传输过程中CPU访问该缓冲区。
mcuku 阿沐 · 2026-10-14