STM32H7的DCache与DMA一致性核心是:DMA访问的内存必须保证Cache与物理内存同步。发送时(CPU写→DMA读),在启动DMA前对缓冲区执行Clean(写回),将Cache中脏数据刷到SRAM;接收时(DMA写→CPU读),在DMA完成中断里先Invalidate(无效化)对应区域,再读取数据,防止CPU读到Cache中的旧值。注意Invalidate必须按Cache行对齐(32字节),且不能跨行误无效化其他变量。推荐用SCB_CleanDCache_by_Addr和SCB_InvalidateDCache_by_Addr,地址需32字节对齐,长度向上取整。更稳妥的方案是用MPU将DMA缓冲区配置为Write-Through或Non-Cacheable,避免手动维护。若用Non-Cacheable,则无需Clean/Invalidate,但性能略低。实战中常见错误:在DMA传输过程中Invalidate导致数据丢失;或只Clean不Invalidate造成接收数据错乱。建议DMA缓冲区用__attribute__((aligned(32)))定义,并放在DTCM以外(DTCM不支持DMA)。
mcuku 阿沐 · 2026-10-03