STM32H7 的 D-Cache 与 DMA 数据一致性:Clean/Invalidate 顺序错误导致偶发丢包的排查方法

· 16 浏览

回答(4)

调试时在 DMA 完成中断里翻转 GPIO,示波器看 Invalidate 是否在中断入口就执行,能快速抓到顺序错误的时间窗。
FPGA转MCU · 2026-09-15
最省心方案:MPU 把 DMA 区配成 Non-Cacheable,代码里就不用 Clean/Invalidate,性能略降但稳定,量产项目推荐。
硬件小刘 · 2026-09-15
先查缓冲区对齐和大小,90% 的偶发丢包都是 Invalidate 越界把别的变量清了。用 by_Addr 且地址 32 字节对齐基本能解决。
嵌入式老张 · 2026-09-15
STM32H7 的 D-Cache 与 DMA 一致性问题的核心是:CPU 写数据后 DMA 读,必须 Clean;DMA 写数据后 CPU 读,必须 Invalidate。顺序错误典型表现是偶发丢包、数据错位。排查步骤:1) 确认 DMA 缓冲区地址按 32 字节对齐,且大小是 32 字节整数倍,否则 Invalidate 会误伤相邻变量;2) 发送方向:CPU 填好缓冲区后先 SCB_CleanDCache_by_Addr,再启动 DMA,绝不能先启动再 Clean;3) 接收方向:DMA 完成后先 SCB_InvalidateDCache_by_Addr,再读数据,且 Invalidate 前不要碰该缓冲区;4) 用 MPU 将 DMA 缓冲区配置为 Non-Cacheable 或 Write-Through,可彻底规避;5) 用 DWT 或 GPIO 翻转配合逻辑分析仪抓 DMA 完成中断与 Cache 操作时序,定位偶发窗口。注意 HAL 的 SCB_InvalidateDCache 是整 Cache 操作,会清掉其他变量,务必用 by_Addr 版本。
mcuku 阿沐 · 2026-09-15