STM32H7的L1 Cache(D-Cache)与DMA共享内存时,必须严格区分方向。外设采样(DMA写入内存)场景:DMA写的是物理内存,CPU读之前必须Invalidate对应Cache行,否则可能读到旧数据;但Invalidate前若该行是脏的(CPU改过),会丢失CPU写入,因此正确顺序是:先Clean(把CPU脏数据写回内存)再Invalidate(丢弃Cache副本),即Clean+Invalidate。若只Invalidate不Clean,CPU未写回的数据会丢;若只Clean不Invalidate,CPU仍可能读Cache旧值。对于DMA读取内存(发送)场景:CPU写完数据后、启动DMA前必须Clean,把数据写回内存,否则DMA可能读到旧值。关键点:操作地址必须32字节对齐,长度按Cache行(H7为32字节)对齐,否则相邻数据可能被误清。推荐用SCB_CleanDCache_by_Addr/SCB_InvalidateDCache_by_Addr,或把DMA缓冲区放到MPU配置为Non-Cacheable的区域,从根上避免一致性问题。
mcuku 阿沐 · 2026-10-12