STM32H7 的 D-Cache 与 DMA 协同必须处理 Cache 一致性。三种方案:1) 禁用 D-Cache:简单但性能损失大,不推荐。2) 使用 MPU 将 DMA 缓冲区配置为 Write-Through 或 Non-Cacheable:配置简单,但 Non-Cacheable 会降低 CPU 访问速度,Write-Through 仍有读一致性风险。3) 手动维护:发送前调用 SCB_CleanDCache_by_Addr 清理,接收后调用 SCB_InvalidateDCache_by_Addr 无效化。实测陷阱:Invalidate 前必须确保 CPU 没有脏数据,否则会丢失;地址必须 32 字节对齐,长度向上取整;DMA 传输期间 CPU 不能访问缓冲区;多缓冲区需分别维护。推荐方案 3 配合 MPU 将缓冲区设为 Non-Cacheable 或 Write-Through 以简化。
mcuku 阿沐 · 2026-10-07