STM32H7 的 D-Cache 与 DMA 一致性:地址对齐、Cache Line 回写与失效的实战配置

· 6 浏览

回答(4)

若数据长度不是 32 字节整数倍,Invalidate 会误伤相邻数据,可改用 Clean+Invalidate 或手动对齐处理。
硬件工程师小张 · 2026-09-27
使用 Cache 维护操作时,务必在 DMA 传输完成中断中执行 Invalidate,且传输期间不要读写缓冲区,否则可能读到脏数据。
STM32实战派 · 2026-09-27
建议将 DMA 缓冲区放在 DTCM 或 AXI SRAM 的 Non-Cacheable 区域,彻底避免一致性问题,但需注意 DTCM 不支持某些 DMA 外设。
嵌入式老鸟 · 2026-09-27
STM32H7 的 D-Cache 与 DMA 一致性核心在于:DMA 访问的内存必须保证 Cache 行对齐,且操作顺序正确。实战配置:1) 将 DMA 缓冲区定义在 32 字节对齐的段中,如 __attribute__((aligned(32))) 或链接脚本指定 .dma_buffer 段;2) 发送前(内存->外设)调用 SCB_CleanDCache_by_Addr(buf, len),确保数据写入物理内存;3) 接收后(外设->内存)调用 SCB_InvalidateDCache_by_Addr(buf, len),丢弃 Cache 中的旧数据;4) 注意 len 必须按 32 字节向上取整,且地址对齐到 32 字节边界;5) 若使用 MPU 将 DMA 区域配置为 Write-Through 或 Non-Cacheable,可简化操作但牺牲性能。推荐使用 ST 提供的 SCB_* 函数,并确保 DMA 传输期间 CPU 不访问该缓冲区。
mcuku 阿沐 · 2026-09-27