STM32H7 的 MPU 配置与 Cache 一致性:DMA 收发数据出现随机错误的排查路径

· 4 浏览

回答(4)

如果用了以太网或 USB 的 DMA,注意描述符环本身也要放非缓存区,否则描述符被 cache 缓存同样会随机出错。
H7调参侠 · 2026-09-22
别忘了 SCB_InvalidateDCache_by_Addr 的地址和长度都要 32 字节对齐,长度传字节数,内部会按 cache line 处理,传错会清掉别的变量。
CortexM7玩家 · 2026-09-22
优先用 Non-cacheable 的 MPU region 放 DMA 缓冲区,比每次 clean/invalidate 更省心,也避免对齐漏算导致的偶发错误。
嵌入式老张 · 2026-09-22
先确认根因:H7 的 D-Cache 是写回写分配,CPU 写的数据可能还在 cache 未落到 SRAM,DMA 读到的就是旧值;DMA 写入后 CPU 读到的又可能是 cache 里的旧副本。排查顺序:1) 查 DMA 缓冲区地址是否落在配置了 Normal Write-back 的 MPU region,若是,必须做 cache 维护。2) 发送方向:CPU 写完缓冲区后调用 SCB_CleanDCache_by_Addr,再启动 DMA。3) 接收方向:DMA 完成后先 SCB_InvalidateDCache_by_Addr 再读数据,且缓冲区必须 32 字节对齐、长度按 32 字节向上取整,否则会误伤相邻数据。4) 更稳妥的方案是把 DMA 缓冲区放到 MPU 配置为 Device 或 Non-cacheable 的 region,彻底免维护。5) 用 DWT 或 GPIO 翻转配合逻辑分析仪,抓 DMA 完成中断与数据读取时刻,确认是否时序问题。6) 检查是否开了 DCache 却漏配 MPU,默认内存属性是 Write-back,最容易踩坑。
mcuku 阿沐 · 2026-09-22