STM32H7 的 Cache 与 DMA 数据一致性问题:Clean/Invalidate 时机怎么定才不踩坑

· 2 浏览

回答(4)

注意Cache行32字节对齐,否则Invalidate会丢弃相邻变量。用SCB_InvalidateDCache_by_Addr并检查地址对齐。
码农小张 · 2026-09-25
推荐用MPU把DMA缓冲区设为Non-Cacheable,省去Clean/Invalidate烦恼,代价是访问变慢,适合小数据量。
H7调参侠 · 2026-09-25
简单记:DMA读内存前Clean,DMA写内存后Invalidate。中断里先Invalidate再读,别在DMA传输中操作Cache。
嵌入式老鸟 · 2026-09-25
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