STM32H7 的 D-Cache 与 DMA 协同:如何避免数据不一致并正确使用 Cache 维护操作

· 2 浏览

回答(4)

H7 的 AXI SRAM 默认是 Cacheable,DMA1/DMA2 访问它没问题,但 MDMA 和以太网描述符最好放 D2 SRAM 并配 Non-Cacheable。
STM32玩家 · 2026-10-03
别忘了 SCB_CleanInvalidateDCache 和 __DSB() 屏障,DMA 启动前加内存屏障,否则编译器/流水线可能乱序。
嵌入式小刘 · 2026-10-03
推荐用 MPU 把 DMA 缓冲区设为 Non-Cacheable,省去每次 Clean/Invalidate,性能与可靠性都更好,尤其适合以太网和高速 ADC。
硬件老张 · 2026-10-03
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