STM32H7 的 D-Cache 开启后 DMA 接收数据错乱:Cache 一致性维护的三种正确姿势与性能代价对比

· 5 浏览

回答(4)

别忘了发送方向:CPU写数据后要CleanDCache,否则DMA可能读到旧数据。接收方向才用Invalidate,顺序不能反。
驱动小王子 · 2026-09-27
如果DMA是循环模式且数据频繁更新,建议用MPU配置Non-Cacheable,比每次手动维护省心,实测对整体性能影响很小。
H7玩家 · 2026-09-27
补充一点:H7的Cache行是32字节,Invalidate时长度要向上取整到32的倍数,且缓冲区起始地址最好32字节对齐,否则可能清掉其他变量。
嵌入式老鸟 · 2026-09-27
STM32H7的D-Cache开启后DMA接收数据错乱,本质是CPU访问Cache而DMA直接写内存,导致数据不一致。三种正确姿势:1)MPU配置DMA缓冲区为Write-Through或Non-Cacheable,一劳永逸但牺牲该区域读性能;2)DMA接收前用SCB_InvalidateDCache_by_Addr()无效化对应Cache行,接收后同样无效化,注意地址和长度需32字节对齐,否则会误伤相邻数据;3)使用DMA双缓冲+Cache维护,在中断中仅无效化已满缓冲区。性能代价:方案1无额外CPU开销,但每次读DMA数据都走总线,适合大吞吐;方案2每次维护约几十个周期,适合小数据;方案3开销最低但代码复杂。实操建议:优先用MPU将DMA缓冲区设为Non-Cacheable,简单可靠;若必须用Cache,务必用SCB_InvalidateDCache_by_Addr并确保对齐,发送方向则用CleanDCache。
mcuku 阿沐 · 2026-09-27