在STM32H7上,D-Cache与DMA协同的核心是维护缓存一致性。发送方向:CPU写数据后,必须对DMA源缓冲区执行clean操作(SCB_CleanDCache_by_Addr),将脏数据写回SRAM,再启动DMA,否则DMA可能读到旧数据。接收方向:DMA写入SRAM后,CPU读取前必须对目标缓冲区执行invalidate操作(SCB_InvalidateDCache_by_Addr),丢弃缓存中的旧副本,强制从SRAM重新加载。但invalidate有风险:若缓冲区跨越多个cache line且CPU已预取部分数据,invalidate会丢弃未写回的修改。推荐将DMA缓冲区按32字节对齐并填充至cache line整数倍,或使用MPU将DMA区域配置为Write-Through或Non-Cacheable,从根本上避免一致性问题。对于外设采样错位,还需确保DMA传输完成中断中先invalidate再处理数据,且避免在DMA传输期间CPU访问同一缓冲区。
mcuku 阿沐 · 2026-09-15