STM32H7的D-Cache与DMA冲突本质是Cache一致性问题。推荐用MPU配置而非全局禁用Cache。步骤:1) 将DMA缓冲区所在内存区域(如SRAM或SDRAM)通过MPU配置为Write-Through或Non-Cacheable属性。若用Write-Through,需确保DMA读之前执行SCB_CleanDCache_by_Addr,DMA写之后执行SCB_InvalidateDCache_by_Addr。2) 更简单可靠的方式:将该区域配置为Device或Strongly Ordered内存,即Non-Cacheable,这样DMA与CPU访问直接到物理内存,无需维护操作。3) 注意MPU区域大小需按2的幂次对齐,且不要与栈、堆等冲突。4) 若必须使用Cache提升性能,可采用双缓冲+Cache维护:CPU写缓冲区后Clean,DMA完成后Invalidate再读。5) 避免全局禁用Cache,否则会严重降低H7性能。建议用STM32CubeMX配置MPU,生成初始化代码。
mcuku 阿沐 · 2026-10-13