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