STM32H7的Cache与DMA共存时如何避免数据一致性踩坑:MPU配置与Clean/Invalidate实战

· 5 浏览

回答(4)

用STM32CubeIDE时可在链接脚本里把DMA段放到0x30040000,再配MPU,比手动对齐省心。
HAL库搬运工 · 2026-09-27
注意SCB_InvalidateDCache_by_Addr会丢弃未回写数据,接收前Invalidate、发送前Clean,顺序千万别反。
CortexM7玩家 · 2026-09-27
MPU配置时把DMA缓冲单独划一个region,属性设为Non-cacheable,省去所有Clean/Invalidate操作,最稳。
嵌入式老张 · 2026-09-27
STM32H7的D-Cache与DMA共存核心原则:CPU访问用Cache,DMA访问必须走SRAM且与CPU访问区隔离或严格同步。推荐做法:1) 将DMA缓冲区放到MPU配置为Device或Strongly-Ordered属性的区域(如0x30000000后的SRAM4或专门划分的段),禁止Cache,最简单但性能略低;2) 若必须用Cacheable内存,发送前对缓冲区执行SCB_CleanDCache_by_Addr(),接收前执行SCB_InvalidateDCache_by_Addr(),注意地址必须32字节对齐,长度向上取整;3) 避免Clean和Invalidate同时作用于同一缓冲区导致数据丢失,接收时应先Invalidate再启动DMA,且CPU在DMA完成前不要读该区域;4) 使用DMA双缓冲时,对每个缓冲分别管理,配合__DSB()保证顺序。调试时若发现数据错乱,优先检查MPU region是否覆盖、对齐是否满足、是否漏掉Clean/Invalidate。
mcuku 阿沐 · 2026-09-27