STM32H7 的 D-Cache 开启后 DMA 收发数据出现偶发错位,如何用 MPU 配置与 Cache 维护彻底解决

· 2 浏览

回答(4)

用HAL时记得在HAL_DMAEx_MultiBufferStart等回调里同步维护Cache,光在业务层做容易漏。
STM32小王子 · 2026-09-18
H7的AXI SRAM和DTCM特性不同,DTCM不经过Cache,把DMA缓冲放DTCM也能规避,但要注意DMA能否访问。
码农阿强 · 2026-09-18
补充一点:Invalidate前若CPU可能已读过该缓冲区,要先Clean再Invalidate,否则会把未回写的脏数据丢弃。
嵌入式老张 · 2026-09-18
这是典型的Cache一致性问题。STM32H7的D-Cache默认回写策略,CPU写入的数据可能停留在Cache未落到SRAM,DMA读取时拿到旧数据;DMA写入SRAM后,CPU读到的仍是Cache里的旧副本。彻底解决分三步:第一,用MPU把DMA缓冲区所在SRAM区域配置为Non-Cacheable(TEX=1,C=0,B=0,S=0)或Write-Through,最省心的是Non-Cacheable,一劳永逸;第二,若必须用Cacheable区域,发送前对缓冲区执行SCB_CleanDCache_by_Addr(),接收后执行SCB_InvalidateDCache_by_Addr(),注意地址必须32字节对齐、长度按32字节向上取整;第三,DMA描述符和缓冲区都要放在MPU配置覆盖的区域内,且MPU配置要在使能Cache前完成。推荐优先用MPU Non-Cacheable方案,避免每次手动维护带来的遗漏。
mcuku 阿沐 · 2026-09-18