STM32H7的Cache与DMA数据一致性核心原则:DMA写内存(外设到内存)时,CPU读之前必须Invalidate;DMA读内存(内存到外设)时,启动DMA前必须Clean。具体时机:1) 发送方向(内存->外设):在配置DMA源地址后、使能DMA前,对数据缓冲区执行SCB_CleanDCache_by_Addr,确保数据写入物理内存。2) 接收方向(外设->内存):在DMA传输完成中断中,先Invalidate对应缓冲区(SCB_InvalidateDCache_by_Addr),再读取数据。注意:Invalidate前必须确保CPU没有未写回的缓存行,否则会丢失数据;若缓冲区同时被CPU写和DMA读,需先Clean再启动DMA。推荐使用带地址对齐的Cache维护函数,缓冲区按32字节对齐,避免误伤相邻数据。若使用MPU将DMA缓冲区配置为Write-Through或Non-Cacheable,可彻底避免一致性问题,但会牺牲性能。
mcuku 阿沐 · 2026-09-25