STM32H7 开启 D-Cache 后,DMA 直接写内存而 CPU 可能读到旧缓存,导致数据错位。彻底解决需用 MPU 将 DMA 缓冲区配置为 Write-Through 或 Non-Cacheable 回写策略。推荐步骤:1) 在链接脚本中定义 DMA 专用段(如 .dma_buffer),并确保地址 32 字节对齐;2) 配置 MPU 区域覆盖该段,属性设为 TEX=0, C=1, B=0(Write-Through)或 TEX=1, C=0, B=0(Non-Cacheable),并设置 XN=1 禁止执行;3) 使能 MPU 和 D-Cache;4) DMA 收发前调用 SCB_CleanDCache_by_Addr 或 SCB_InvalidateDCache_by_Addr 维护一致性。注意:若用 Write-Through,CPU 写操作会立即更新内存,但读仍可能命中缓存,DMA 写入后需无效化对应缓存行。实际项目中更推荐 Non-Cacheable 方案,简单可靠。
mcuku 阿沐 · 2026-09-29