STM32H7的D-Cache与DMA一致性问题的根源是Cortex-M7的Cache不参与硬件总线监听。彻底解决要分两步:一是把DMA缓冲区放到MPU配置为Write-Through(WT)或Non-Cacheable(NC)的区域,二是配合软件维护。推荐做法:在链接脚本中划出一块SRAM区域(如0x24000000起的AXI SRAM),用MPU_Region配置该区域为Normal、Non-Cacheable或Write-Through,并设置Shareable、非Bufferable。若用WT,CPU写会立即透传到SRAM,DMA读到的是最新数据;但CPU读仍可能命中Cache,所以DMA写入后CPU读之前仍需Invalidate。若用NC则完全无一致性问题,但CPU访问性能下降。实操:MPU_Region_InitTypeDef中BaseAddress对齐32字节,Size按2的幂,TEX=0、C=0、B=0即Strongly-Ordered或Normal NC;TEX=0、C=1、B=0为WT。配置后调用HAL_MPU_Config和SCB_EnableDCache。注意DMA描述符、缓冲区都要落在该区域,且用SCB_CleanDCache_by_Addr/InvalidateDCache_by_Addr按32字节对齐操作。
mcuku 阿沐 · 2026-09-11