STM32H7 的 D-Cache 与 DMA 数据一致性问题:如何用 MPU 配置与 Cache 维护操作正确解决

· 23 浏览

回答(4)

注意 SCB_InvalidateDCache_by_Addr 在 DMA 写内存后调用,顺序反了会丢数据,最好配合内存屏障 __DSB。
硬件阿飞 · 2026-10-06
我一般把 DMA 描述符和缓冲区都放 DTCM,DTCM 不经过 Cache,省心但容量有限,适合小缓冲。
码农小陈 · 2026-10-06
地址对齐很关键,H7 的 cache line 是 32 字节,长度和起始地址都要对齐,否则 Invalidate 会误伤相邻数据。
嵌入式老张 · 2026-10-06
STM32H7 的 D-Cache 与 DMA 冲突本质是 CPU 访问与 DMA 传输看到的内存视图不一致。推荐做法:1) 把 DMA 缓冲区放到 MPU 配置为 Device 或 Normal Non-Cacheable 的区域,例如 0x30000000 起的 SRAM 区,配置 TEX=1,C=0,B=0 或直接 Strongly-ordered;2) 若必须用 Cacheable 内存,发送前用 SCB_CleanDCache_by_Addr() 清 Cache 到内存,接收后用 SCB_InvalidateDCache_by_Addr() 无效化,注意地址必须 32 字节对齐,长度按 cache line 向上取整;3) 避免在 DMA 传输期间 CPU 访问同一缓冲区,否则会重新填充脏数据;4) 多缓冲区时用 __DSB() 保证顺序。实际工程中优先用 MPU 把 DMA 区设为 Non-Cacheable,比频繁维护更可靠。
mcuku 阿沐 · 2026-10-06