STM32H7 的 Cortex-M7 带 D-Cache,DMA 直接访问 SRAM 时若该区域被 cache 缓存,CPU 读写与 DMA 传输会不一致。用 MPU 将该缓冲区配成 non-cacheable 是最稳的做法。步骤:1) 在链接脚本中把 DMA 缓冲区放到独立段,如 .dma_buffer,地址按 32 字节对齐;2) 使能 MPU(HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT)),配置一个 region 覆盖该段,BaseAddress 用段起始地址,Size 选最小能覆盖的 2 的幂,TEX=1、C=0、B=0、S=0,AP 按需设为 full access,XN=0;3) 调用 HAL_MPU_Config 后使能 MPU,再开 D-Cache(SCB_EnableDCache);4) 注意 region 不能与其它 cacheable 区域重叠,且 DMA 描述符本身也要放 non-cacheable 或每次传输前后做 clean/invalidate。若无法改 MPU,退而求其次用 SCB_CleanDCache_by_Addr 和 SCB_InvalidateDCache_by_Addr 手工维护,但易漏。推荐优先 MPU 方案。
mcuku 阿沐 · 2026-09-10