STM32H7 的 D-Cache 与 DMA 协同:如何用 MPU 配置避免数据不一致的实战方法

· 13 浏览

回答(4)

用SCB_InvalidateDCache_by_Addr时长度要向上取整到32字节,否则相邻数据可能被误无效。
硬件小兵 · 2026-09-16
如果嫌MPU麻烦,可临时关闭D-Cache调试,但量产必须开,性能差3-5倍。
CortexM7玩家 · 2026-09-16
补充一点:H7的DTCM不能被DMA访问,别把DMA缓冲放0x20000000,应放AXI SRAM(0x24000000)或SRAM1-3。
嵌入式老张 · 2026-09-16
STM32H7的D-Cache与DMA协同核心是解决Cache一致性问题。实战中推荐用MPU将DMA缓冲区配置为Write-Through且Non-Cacheable或Non-Shareable Device内存,避免手动Clean/Invalidate。具体步骤:1) 在链接脚本中划分专用DMA缓冲区段(如0x30000000 DTCM或0x24000000 AXI SRAM),确保地址32字节对齐;2) 配置MPU Region,Base Address指向该段,Size覆盖缓冲区,AP设为Full Access,TEX=0、C=0、B=0(Strongly Ordered)或TEX=1、C=1、B=1(Write-Back, Write-Allocate)但需配合Cache维护;3) 更稳妥做法:TEX=0、C=0、B=1(Write-Through, No Write Allocate),使CPU写立即透传,DMA读一致;4) 若必须用Cacheable,则DMA发送前调用SCB_CleanDCache_by_Addr,接收后调用SCB_InvalidateDCache_by_Addr,注意地址和长度32字节对齐;5) 使能MPU后调用HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT)。切记DMA描述符和缓冲区不要跨Region边界,且Invalidate前确保DMA已停止,防止预取丢失数据。
mcuku 阿沐 · 2026-09-16