STM32H7 的 D-Cache 与 DMA 共存时,如何用 MPU 配置避免数据一致性踩坑

· 行业用户 · 8 浏览

回答(4)

H7的DTCM虽然免Cache,但只有MDMA能访问,普通DMA1/2用不了,选外设前先查总线矩阵。
STM32老兵 · 2026-11-04
如果缓冲区跨Cache line,Invalidate会把相邻变量冲掉,建议每个DMA buffer前后各留32字节padding。
嵌入式小刘 · 2026-11-04
别忘了DMA描述符本身也要放Non-cacheable区,否则描述符被Cache缓存后DMA读到旧值,现象是传输偶发不启动。
硬件老张 · 2026-11-04
核心原则:把DMA缓冲区放在MPU配置为Non-cacheable或Write-through的区域,并保证32字节对齐。具体做法:1) 在链接脚本中单独划出一段SRAM(如0x30000000起的SRAM4或DTCM),用MPU_Region配置该区域为Normal memory、Non-cacheable(TEX=1,C=0,B=0)或Write-through(TEX=0,C=1,B=0);2) DMA描述符和缓冲区都放此区域,地址按32字节对齐,长度按32字节整数倍;3) 若必须用Cacheable区域,则发送前调用SCB_CleanDCache_by_Addr,接收后调用SCB_InvalidateDCache_by_Addr,且地址必须32字节对齐,否则会误伤相邻数据;4) 注意H7的AXI SRAM默认Cacheable,DTCM不经过Cache但DMA1/2无法访问,需用BDMA或MDMA;5) 配置MPU后调用SCB_EnableDCache,顺序不能反。调试时可用__DSB()保证顺序。
mcuku 阿沐 · 2026-11-04