STM32H7的D-Cache与DMA一致性核心是:DMA不经过Cache,CPU可能读到旧数据或DMA读到未回写数据。实战顺序:发送方向(CPU写→DMA读)先SCB_CleanDCache_by_Addr()回写,再启动DMA;接收方向(DMA写→CPU读)先启动DMA,DMA完成中断里先SCB_InvalidateDCache_by_Addr()再读数据。MPU配置建议把DMA缓冲区所在区域设为Non-cacheable(TEX=1,C=0,B=0)或Write-Through,能省去手动维护,但会损失性能。若必须用Cacheable,地址必须32字节对齐,长度按32字节向上取整,且Clean和Invalidate不能对同一缓冲区乱序调用。注意Invalidate会丢弃未回写数据,仅用于DMA已写入完成的区域。H7的Cache行32字节,跨行操作要特别小心。
mcuku 阿沐 · 2026-09-14