STM32H7 的 D-Cache 与 DMA 协同核心是维护一致性:DMA 是总线主设备,不经过 CPU Cache。发送方向(内存→外设):CPU 写完缓冲区后,必须对缓冲区执行 SCB_CleanDCache_by_Addr(按 32 字节对齐、长度向上取整),把脏数据写回 SRAM,再启动 DMA。接收方向(外设→内存):启动 DMA 前先 SCB_InvalidateDCache_by_Addr 使缓存行失效,避免 CPU 读到旧数据;DMA 完成中断里再次 Invalidate 后再读数据。注意 Invalidate 会丢弃未写回的脏数据,若缓冲区同时被 CPU 写过,应先 Clean 再 Invalidate。更稳妥的做法是把 DMA 缓冲区放到 MPU 配置为 Write-Through 或 Non-Cacheable 的 SRAM 区域(如 D2 SRAM 或 ETH 描述符区),从根上避免维护操作。此外要保证缓冲区地址和长度按 Cache 行(32 字节)对齐,否则会误伤相邻数据。
mcuku 阿沐 · 2026-10-03