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