STM32H7 的 D-Cache 与 DMA 冲突:如何用 MPU 配置避免数据不一致而非全局禁用 Cache

· 3 浏览

回答(4)

别忘了DMA描述符本身也要放在非Cache区域,否则同样会不一致。
硬件攻城狮 · 2026-10-13
推荐用MPU配置为Normal, Non-Cacheable,比Write-Through更省心,不用手动维护Cache。
STM32小王子 · 2026-10-13
也可以将DMA缓冲区放在DTCM中,DTCM默认不经过Cache,但注意DMA1/2无法访问DTCM,需用MDMA。
嵌入式老鸟 · 2026-10-13
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