STM32H7 的 D-Cache 与 DMA 数据一致性:MPU 配置与 Clean/Invalidate 的实战顺序

· 15 浏览

回答(4)

实测H743上,接收缓冲区若没32字节对齐,Invalidate会误伤相邻变量,建议用__attribute__((aligned(32)))强制对齐。
硬件阿飞 · 2026-09-14
MPU里把SRAM4或D2域专门划给DMA,配成Device或Strongly-ordered,能彻底绕开一致性问题,调试也省心。
码农小刘 · 2026-09-14
补充一点:用SCB_CleanInvalidateDCache_by_Addr可一步完成,但仅适合DMA写完后CPU要读的场景,别在DMA还在写时调用。
嵌入式老张 · 2026-09-14
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