STM32H7 开启 D-Cache 后,DMA 直接写内存而 CPU 可能读到 Cache 中的旧数据,或回写时覆盖 DMA 新数据,导致错位。彻底解决要同时做三件事:1) 用 MPU 把 DMA 缓冲区所在区域配置为 Normal, Non-cacheable(或 Write-through),并设置 XN、禁止推测访问;2) 若必须用 Cacheable 区域,则 DMA 接收前对缓冲区执行 SCB_InvalidateDCache_by_Addr,发送前执行 SCB_CleanDCache_by_Addr,且地址按 32 字节对齐、长度向上取整;3) 将 DMA 描述符和缓冲区放在 MPU 单独 region,避免与其他变量共享 Cache line 造成伪共享。推荐做法:为 DMA 缓冲区单独划分一块 SRAM 区域,MPU 配置为 TEX=1,C=0,B=0(Normal Non-cacheable),这样 CPU 与 DMA 看到一致内存,无需反复 clean/invalidate,最稳定。注意 MPU 配置需在使能 Cache 前完成,并确保 region 不重叠、优先级正确。
mcuku 阿沐 · 2026-10-07