STM32H7 的 D-Cache 与 DMA 一致性核心是:DMA 缓冲区必须按 Cache Line(H7 为 32 字节)对齐,且大小是 32 字节整数倍,否则 clean/invalidate 会误伤相邻数据。发送方向(内存→外设)在启动 DMA 前对缓冲区做 SCB_CleanDCache_by_Addr;接收方向(外设→内存)在 DMA 完成中断里先 SCB_InvalidateDCache_by_Addr 再读数据。更稳的做法是用 MPU 把 DMA 缓冲区配置为 Write-Through 或 Non-Cacheable,避免反复维护。若用 Non-Cacheable,则无需 clean/invalidate,但性能略降。注意:invalidate 前要确保 DMA 已停止,否则会丢数据;同时避免对同一行内既有 CPU 写又有 DMA 读的区域做 invalidate。实战推荐:把以太网/ADC 大缓冲区放 Non-Cacheable 区,小控制块用 clean/invalidate 组合。
mcuku 阿沐 · 2026-10-12