STM32H7 的 D-Cache 开启后 DMA 数据错乱:MPU 配置与 Cache 维护的正确姿势

· 3 浏览

回答(4)

调试时先关 D-Cache 验证功能,再开 Cache 逐步加维护代码,用 SCB_InvalidateDCache 后读回数据对比,能快速定位是漏 Clean 还是漏 Invalidate。
码农小张 · 2026-10-14
DMA 描述符和缓冲区最好都放 DTCM,DTCM 默认不经过 Cache,省去维护烦恼,但注意 DTCM 不能被 DMA 访问,需用 AXI SRAM。
H7玩家 · 2026-10-14
MPU 配置时注意 region 基址和大小要按 32 字节对齐,且属性选 Device 或 Normal Non-cacheable,别配成 Write-Through 仍可能不一致。
嵌入式老鸟 · 2026-10-14
STM32H7 的 D-Cache 与 DMA 冲突本质是 Cache 一致性问题。正确做法分三步:第一,用 MPU 将 DMA 缓冲区所在内存区配置为 Non-Cacheable(如 0x30000000 开始的 SRAM 区),属性设为 Normal, Non-cacheable, Shareable,这样 CPU 和 DMA 看到的数据一致,无需手动维护。第二,若必须使用 Cacheable 内存,则要严格维护:DMA 读(外设到内存)前,对接收缓冲区执行 SCB_InvalidateDCache_by_Addr,且地址和长度必须 32 字节对齐;DMA 写(内存到外设)前,执行 SCB_CleanDCache_by_Addr,确保数据写回内存。第三,注意不要对同一缓冲区同时 Invalidate 和 Clean,且 Invalidate 前要确保 CPU 没有未写回的数据,否则会丢失。推荐优先用 MPU 方案,简单可靠。若用 Cache 维护,务必在 DMA 传输完成中断后再操作,并避免 Cache 行重叠导致误失效。
mcuku 阿沐 · 2026-10-14