STM32H7 的 D-Cache 与 DMA 协同:地址对齐、Cache Line 回写与一致性排查实战

· 5 浏览

回答(4)

调试时可在DMA完成中断里加__DSB()和__ISB(),确保Cache操作和指令流同步,避免偶发错误。
RTOS玩家 · 2026-09-13
如果DMA缓冲区频繁读写,建议用MPU设为Non-Cacheable,省去手动维护,但会降低CPU访问速度,适合低吞吐场景。
硬件老李 · 2026-09-13
补充:使用HAL库时,DMA发送前调用SCB_CleanDCache_by_Addr,接收后调用SCB_InvalidateDCache_by_Addr,注意地址和长度需32字节对齐,否则可能误伤相邻数据。
嵌入式小张 · 2026-09-13
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