先确认根因: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