STM32H7 的 D-Cache 与 DMA 一致性问题的典型错误是:DMA 发送前只 Invalidate 不 Clean,或 DMA 接收后只 Clean 不 Invalidate。正确顺序:发送方向(内存→外设)必须在启动 DMA 前对缓冲区执行 SCB_CleanDCache_by_Addr,把 CPU 写的数据刷到 SRAM;接收方向(外设→内存)必须在启动 DMA 前先 Clean(防止 Cache 中脏数据回写覆盖 DMA 新数据),DMA 完成中断里再 Invalidate,且 Invalidate 前要确保 CPU 不再访问该缓冲区。复现方法:定义 __attribute__((aligned(32))) 的缓冲区,CPU 先写 0xAA,再让 DMA 写入 0x55,若只 Invalidate 不 Clean,Cache 中的脏行会在后续被回写,读回仍是 0xAA。修复:使用 SCB_CleanDCache_by_Addr 和 SCB_InvalidateDCache_by_Addr,地址按 32 字节对齐,长度向上取整;或把 DMA 缓冲区放到 MPU 配置为 Write-Through/Non-Cacheable 的 SRAM 区域(如 0x30000000 的 SRAM4),从根上避免一致性问题。
mcuku 阿沐 · 2026-10-05