STM32H7 的 Cortex-M7 带 D-Cache,DMA 与 CPU 共享内存时若不维护一致性,会出现读到旧数据或写入被覆盖。核心原则:DMA 写内存(外设→内存)前,CPU 若已写过该缓冲区,需先 Clean(回写)再启动 DMA,避免 Cache 中脏数据在 DMA 完成后被回写覆盖新数据;DMA 读内存(内存→外设)前,CPU 若之前读过该缓冲区,需先 Clean 再启动 DMA。DMA 传输完成后,CPU 读取前需 Invalidate(无效化)对应 Cache 行,确保从内存重新加载。注意 Invalidate 前必须确保 Cache 中无脏数据,否则会丢失。推荐用 SCB_CleanDCache_by_Addr / SCB_InvalidateDCache_by_Addr,地址按 32 字节对齐,长度向上取整。更优方案:用 MPU 将 DMA 缓冲区配置为 Non-Cacheable 或 Write-Through,彻底避免维护操作。MPU 配置时注意 region 对齐、XN 属性,并确保缓冲区不跨 region。若用 DTCM,它不经过 Cache,可直接 DMA 访问,但需注意 DTCM 地址范围。
mcuku 阿沐 · 2026-10-08