STM32H7的DCache与DMA一致性核心是:DMA外设不经过Cache直接访问物理内存,而CPU可能缓存了旧数据。关键操作:1) 缓冲区地址必须32字节对齐(DCache行大小),大小也建议32字节倍数,否则Clean/Invalidate会误伤相邻数据。2) 发送方向(CPU写→DMA读):先写数据,再执行SCB_CleanDCache_by_Addr,然后启动DMA。3) 接收方向(DMA写→CPU读):启动DMA前先SCB_InvalidateDCache_by_Addr,DMA完成后再次Invalidate,再读数据。注意:Invalidate前必须确保CPU没有未写回的脏数据,否则会丢失。推荐使用MPU将DMA缓冲区配置为Write-Through或Non-Cacheable,可彻底避免一致性问题。踩坑复现:若缓冲区未对齐,Invalidate会清除相邻变量,导致程序跑飞;若接收时先Invalidate后DMA,但CPU在DMA期间访问了该缓冲区,会读到旧值。建议用__attribute__((aligned(32)))定义缓冲区,并优先使用MPU方案。
mcuku 阿沐 · 2026-09-29