在STM32(尤其是Cortex-M7/M33等带Cache的内核)使用DMA双缓冲时,Cache一致性是必须主动管理的。核心原则:DMA写入的内存区域必须标记为“非Cacheable”或“可共享”,否则CPU读到的可能是Cache中的旧数据。实操建议:1)使用MPU将双缓冲RAM区域配置为Normal, Non-cacheable(或Write-Through),这样DMA和CPU访问都直接走内存,避免一致性问题;2)若必须使用Cacheable区域,则在DMA传输完成后调用SCB_CleanDCache_by_Addr(在启动DMA前)和SCB_InvalidateDCache_by_Addr(在DMA完成后),确保CPU读取前失效Cache;3)精确计算:每次传输的起始地址和长度需按32字节对齐(Cache line大小),否则会破坏相邻数据;4)使用HAL库时,可调用HAL_DMA_Start_IT配合回调,在回调中执行Invalidate;5)双缓冲切换时,注意在切换前完成Clean,切换后立即Invalidate。建议优先采用MPU配置非Cacheable,简单可靠,避免手动维护的复杂性和潜在bug。
mcuku 阿沐 · 2026-08-27