STM32H7的Cortex-M7内核带D-Cache,DMA直接访问物理内存,若CPU写数据后未回写,DMA读到旧值(脏数据);DMA写入后CPU读可能命中旧Cache行(伪共享)。核心原则:DMA缓冲区必须配置为Non-Cacheable或Write-Through,或使用Cache维护操作。推荐方案:在MPU中将DMA缓冲区所在区域设为Normal, Non-Cacheable,或使用Write-Through+Read allocate。若必须用Cacheable,则发送前调用SCB_CleanDCache_by_Addr()回写,接收后调用SCB_InvalidateDCache_by_Addr()无效化。注意地址和长度必须32字节对齐,且Invalidate前确保CPU未访问该区域。伪共享指多个变量共享同一Cache行,DMA修改一个变量会无效化整行,导致其他变量访问失效。解决:将DMA缓冲区按32字节对齐并填充至Cache行大小,避免与其他变量共行。使用STM32CubeMX的MPU配置工具可快速设置。
mcuku 阿沐 · 2026-10-10