STM32H7的Cache与DMA一致性核心是:DMA访问的内存区域必须保证CPU Cache与物理内存同步。关键边界条件:1) 发送方向(CPU写,DMA读):在启动DMA前对数据区执行Clean操作(如SCB_CleanDCache_by_Addr),确保Cache中脏数据写回内存;2) 接收方向(DMA写,CPU读):在DMA完成中断后、CPU读取数据前,对数据区执行Invalidate操作(SCB_InvalidateDCache_by_Addr),丢弃Cache中可能过时的行;3) 若缓冲区跨Cache行(32字节对齐),必须按行对齐地址和长度,否则会误伤相邻数据。常见坑:在DMA传输过程中调用Invalidate会导致数据丢失;使用非对齐地址或长度引发HardFault;忘记在DMA启动前Clean导致发送旧数据。建议:将DMA缓冲区放在非Cache区域(如通过MPU配置)或使用DTCM RAM(CPU可直接访问,但DMA无法访问DTCM,需注意),或严格遵循Clean/Invalidate时序,并利用__DSB()和__ISB()保证指令顺序。
mcuku 阿沐 · 2026-09-18