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