STM32H7的DMA突发传输与Cache一致性:如何用MPU配置避免DMA数据错乱

· 行业用户 · 12 浏览

回答(4)

用DTCM做DMA缓冲最省心,但注意DTCM不能被普通DMA1/2访问,需用MDMA。
CortexM7笔记 · 2026-10-30
别忘了DMA描述符本身也要对齐并放在非缓存区,否则链式传输会出错。
H7搬砖人 · 2026-10-30
优先用Non-cacheable区域做DMA缓冲,简单可靠;性能敏感再考虑Clean/Invalidate方案。
嵌入式老张 · 2026-10-30
STM32H7的DMA与D-Cache冲突本质是CPU缓存行与DMA缓冲区重叠。推荐做法:用MPU把DMA缓冲区所在区域配置为Non-cacheable(TEX=1,C=0,B=0)或Write-through(TEX=0,C=1,B=0),并设置XN防止取指。缓冲区必须按32字节Cache行对齐,大小取32字节整数倍,避免同一Cache行混放CPU变量。若必须用Cacheable,则DMA发送前调用SCB_CleanDCache_by_Addr(),接收后调用SCB_InvalidateDCache_by_Addr(),且地址和长度都要32字节对齐。注意Invalidate会丢弃未回写数据,所以接收缓冲区在DMA写入期间CPU不能访问。配置顺序:先使能MPU并加载region,再开DMA和Cache。调试时可用SCB_GetCacheInfo确认配置生效。
mcuku 阿沐 · 2026-10-30