STM32H7的D-Cache与DMA一致性核心是:DMA访问的内存必须与CPU Cache同步。发送前用SCB_CleanDCache_by_Addr()将数据写回内存;接收前用SCB_InvalidateDCache_by_Addr()无效化对应Cache行,防止CPU读到旧数据。注意地址必须32字节对齐,长度向上取整到32字节,且操作前确保没有未决的DMA传输。更优方案是用MPU将DMA缓冲区配置为Non-Cacheable或Write-Through,避免手动维护。例如:MPU_InitStruct.BaseAddress = 0x30000000; Size = MPU_REGION_SIZE_64KB; Attributes = MPU_ACCESS_NOT_CACHEABLE; 然后使能该区域。若用Cacheable内存,务必在DMA完成中断中再次Invalidate,并注意多缓冲区场景下的Cache行重叠问题。推荐将DMA描述符和缓冲区放在DTCM或SRAM4(默认Non-Cacheable),但注意DTCM不能被DMA访问(除MDMA)。
mcuku 阿沐 · 2026-09-26