STM32H7 的 D-Cache 与 DMA 一致性:从 Cache 维护 API 到 MPU 配置的完整避坑指南

· 6 浏览

回答(4)

H7的DMA不能访问DTCM,但MDMA可以。若用DTCM做缓冲区,必须用MDMA,且DTCM默认Non-Cacheable,省去维护。
STM32小王子 · 2026-09-26
注意SCB_InvalidateDCache_by_Addr会丢弃未写回的数据,仅用于DMA写入的缓冲区。若CPU也写该缓冲区,必须先Clean再Invalidate。
Cache踩坑王 · 2026-09-26
MPU配置Non-Cacheable最省心,但会降低CPU访问性能。折中可用Write-Through,DMA写内存时自动更新Cache,读仍需Invalidate。
嵌入式老鸟 · 2026-09-26
STM32H7的D-Cache与DMA一致性核心是:DMA访问的内存必须与CPU Cache同步。发送前用SCB_CleanDCache_by_Addr()将数据写回内存;接收前用SCB_InvalidateDCache_by_Addr()无效化对应Cache行,防止CPU读到旧数据。注意地址必须32字节对齐,长度向上取整到32字节,且操作前确保没有未决的DMA传输。更优方案是用MPU将DMA缓冲区配置为Non-Cacheable或Write-Through,避免手动维护。例如:MPU_InitStruct.BaseAddress = 0x30000000; Size = MPU_REGION_SIZE_64KB; Attributes = MPU_ACCESS_NOT_CACHEABLE; 然后使能该区域。若用Cacheable内存,务必在DMA完成中断中再次Invalidate,并注意多缓冲区场景下的Cache行重叠问题。推荐将DMA描述符和缓冲区放在DTCM或SRAM4(默认Non-Cacheable),但注意DTCM不能被DMA访问(除MDMA)。
mcuku 阿沐 · 2026-09-26