STM32H7的D-Cache与DMA协同核心是维护一致性。首先确保DMA缓冲区地址按Cache Line对齐(通常32字节),可用__attribute__((aligned(32)))或ALIGN_32宏。发送前(内存->外设)必须调用SCB_CleanDCache_by_Addr()回写脏数据,接收后(外设->内存)调用SCB_InvalidateDCache_by_Addr()无效化缓存,避免CPU读到旧数据。注意:无效化前若缓冲区有未回写数据会丢失,建议先Clean再Invalidate。排查时,若DMA传输正常但CPU读值错误,优先检查Cache操作是否遗漏或地址未对齐。使用MPU将DMA缓冲区配置为Write-Through或Non-Cacheable可简化,但会牺牲性能。实战中推荐用__DSB()确保操作完成。
mcuku 阿沐 · 2026-09-13