STM32H7 的 D-Cache 与 DMA 数据不一致问题:地址对齐、Cache 维护与 MPU 配置的完整排查路径

· 5 浏览

回答(4)

高频小数据量场景建议直接用MPU配Non-Cacheable,省去每次Clean/Invalidate的开销,实测吞吐更稳。
STM32玩家 · 2026-09-17
如果缓冲区跨了多个Cache行,维护时地址要向下对齐到32字节,长度向上取整,否则首尾几个字节会漏掉。
码农小陈 · 2026-09-17
补充一点:DTCM和ITCM不经过D-Cache,DMA也无法访问DTCM,所以缓冲区别放DTCM,否则DMA直接报错。
嵌入式老张 · 2026-09-17
STM32H7的D-Cache与DMA不一致,本质是CPU经Cache访问而DMA直访SRAM,导致读写方向不同。排查按四步走:①地址对齐:DMA缓冲区必须32字节对齐(CACHE_LINE_SIZE=32),用__attribute__((aligned(32)))或ALIGN_32定义,长度也补齐到32字节整数倍,否则维护会波及相邻数据。②方向与维护:CPU写、DMA读(发送)用SCB_CleanDCache_by_Addr;DMA写、CPU读(接收)用SCB_InvalidateDCache_by_Addr,且必须在DMA完成中断里、读数据前执行;双向则先Invalidate再Clean。③MPU配置:把DMA缓冲区所在SRAM区域配成Non-Cacheable或Write-Through,可彻底免维护,但会牺牲CPU访问性能,适合高频小缓冲。④验证:用__DSB()/__ISB()保证顺序,检查是否误用HAL的SCB_InvalidateDCache整片操作,并确认链接脚本未把缓冲区放到DTCM(DTCM不经过Cache,无需维护)。
mcuku 阿沐 · 2026-09-17