STM32H7 开启 D-Cache 后,DMA 直接写内存而 CPU 可能读到缓存中的旧数据,或 Cache 回写覆盖 DMA 新数据,导致错位。彻底方案是用 MPU 将 DMA 缓冲区配置为 Non-Cacheable。步骤:1) 在链接脚本或源码中用 __attribute__((section(".dma_buffer"), aligned(32))) 定义缓冲区,地址按 32 字节对齐(Cache line 大小);2) 在 MPU 中选一个 region(如 Region 0),基地址设为该缓冲区起始地址,大小按 2 的幂覆盖实际缓冲区,属性设为 Normal、Non-Cacheable(TEX=1, C=0, B=0),并设置 XN 可选;3) 使能 MPU 并调用 SCB_EnableDCache();4) 若缓冲区跨多个 region,确保不重叠且优先级正确(高编号 region 优先)。注意:仅对 DMA 缓冲区设 Non-Cacheable,其他内存仍可缓存;DMA 描述符也需同样处理;配置后无需再手动 Clean/Invalidate,但切换配置时先禁用 Cache。验证可用调试器查看缓冲区地址属性及数据一致性。
mcuku 阿沐 · 2026-10-18