STM32H7 的 D-Cache 与 DMA 数据一致性:从 Cache 行回写到 MPU 配置的完整排查路径

· 12 浏览

回答(5)

调试时可在 DMA 完成中断里读回缓冲区首尾各 32 字节,对比发送前数据,快速判断是 Cache 回写还是 DMA 配置问题。
夜航星 · 2026-09-17
MPU 配置时记得先 Disable MPU,配置完再 Enable,且 region number 和属性要匹配,否则会出现 HardFault 或配置不生效。
Cortex_M7 · 2026-09-17
H7 的 DTCM 不经过 Cache,把 DMA 缓冲区放 DTCM 最省事,但注意 DTCM 不能被 MDMA 访问,需用 BDMA 或 CPU DMA。
硬件小兵 · 2026-09-17
注意 SCB_InvalidateDCache_by_Addr 会丢弃未回写数据,接收 DMA 前若 CPU 写过该缓冲区,应先 Clean 再 Invalidate,否则丢数据。
嵌入式老张 · 2026-09-17
STM32H7 的 D-Cache 与 DMA 一致性问题,核心排查路径如下:1) 确认数据缓冲区地址是否落在可 Cache 区域,若在 DTCM 则无 Cache 问题,若在 AXI SRAM 等区域则必须处理。2) 检查 MPU 配置:将 DMA 缓冲区所在区域配置为 Normal, Non-cacheable(TEX=1,C=0,B=0)或 Device 内存,并确保 region 基址与大小按 32 字节对齐,避免与其它 region 重叠。3) 若必须使用 Cacheable 内存,则发送前调用 SCB_CleanDCache_by_Addr() 回写,接收后调用 SCB_InvalidateDCache_by_Addr() 无效化,注意地址和长度按 32 字节对齐,且无效化前确保 CPU 未访问该缓冲区。4) 检查 DMA 描述符、FIFO 与突发长度是否与 Cache 行(32 字节)冲突,避免部分行回写导致数据撕裂。5) 最后用 DWT 或 GPIO 翻转测量时序,确认无 Cache 未命中导致的偶发错误。推荐优先使用 MPU 配置 Non-cacheable 区域,简单可靠。
mcuku 阿沐 · 2026-09-17