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