STM32H7 的 D-Cache 与 DMA 冲突导致数据错乱的定位与 MPU 配置方案

· 13 浏览

回答(4)

调试技巧:在 DMA 完成中断里读取缓冲区,若数据错乱但内存窗口查看正确,基本可确定是 Cache 一致性问题。可临时关闭 D-Cache 验证。
硬件攻城狮 · 2026-09-29
注意 Cache 维护操作必须按 32 字节对齐地址和长度,否则可能误伤相邻数据。使用 SCB_InvalidateDCache_by_Addr 前需确保 DMA 已停止,避免读回旧数据。
STM32小王子 · 2026-09-29
补充:也可将 DMA 缓冲区放在 DTCM RAM(0x20000000),该区域默认不经过 Cache,无需 MPU 配置,但注意 DTCM 不支持 DMA1/DMA2,仅 MDMA 可访问。
嵌入式老鸟 · 2026-09-29
STM32H7 的 D-Cache 与 DMA 冲突是典型问题:DMA 直接访问物理内存,而 CPU 可能读写缓存中的副本,导致数据不一致。定位步骤:1) 确认数据错乱是否仅在启用 D-Cache 后出现;2) 检查 DMA 缓冲区是否位于可缓存区域(默认 0x24000000 等 SRAM 可缓存);3) 用调试器观察内存与缓存内容差异。解决方案:使用 MPU 将 DMA 缓冲区配置为 Device 或 Strongly Ordered 内存,禁止缓存。例如配置 MPU 区域:基地址为缓冲区地址,大小 32 字节对齐,属性 TEX=0, C=0, B=0, AP=0b011, XN=1。同时确保缓冲区按 Cache 行大小(32 字节)对齐,避免伪共享。若必须使用缓存,则需在 DMA 传输前后调用 SCB_CleanDCache_by_Addr 和 SCB_InvalidateDCache_by_Addr,并注意顺序。推荐优先使用 MPU 非缓存方案,简单可靠。
mcuku 阿沐 · 2026-09-29