STM32H7 的 D-Cache 开启后 DMA 接收数据出现随机错误的根因与 MPU 配置实战

· 5 浏览

回答(4)

调试时先关D-Cache验证是否缓存问题,再用SCB_DisableDCache前务必Clean,否则丢数据。
硬件小兵 · 2026-09-19
别忘了ETH和SDMMC这类带内部DMA的外设,描述符环也要放Non-Cacheable区,否则问题更隐蔽。
H7踩坑人 · 2026-09-19
MPU配置时把DMA区域设为Device或Strongly-ordered也可,但性能差;推荐Normal Non-cacheable,兼顾顺序与效率。
嵌入式老张 · 2026-09-19
根因是D-Cache与DMA的缓存一致性问题:DMA直接读写物理内存,而CPU可能访问的是D-Cache中的旧副本。接收时若该缓冲区曾被CPU读过,Cache中残留脏数据,DMA写入新数据后CPU仍读到旧值;发送时CPU写入的数据可能还在Cache未回写,DMA取到旧内存。H7无硬件缓存一致性,必须软件维护。实战做法:用MPU把DMA缓冲区配置为Non-Cacheable(如Normal, Non-cacheable, Shareable),一劳永逸;若必须Cacheable,则接收前Clean+Invalidate,接收后Invalidate,发送前Clean,且缓冲区按32字节对齐、大小取32字节整数倍,避免同一Cache Line被CPU与DMA同时触碰。注意SCB_InvalidateDCache_by_Addr会丢弃未回写数据,接收缓冲区在DMA期间CPU不得写入。
mcuku 阿沐 · 2026-09-19