在STM32上使用DMA双缓冲时,缓存一致性问题的核心在于DMA直接访问内存,而CPU可能通过缓存读写同一区域,导致数据不同步。对于Cortex-M7(如STM32H7),其具有L1缓存(D-Cache),必须显式处理:在DMA写入缓冲区前,使用`SCB_CleanDCache_by_Addr`清刷CPU缓存,确保旧数据写回内存;在DMA传输完成后,使用`SCB_InvalidateDCache_by_Addr`使缓存失效,强制CPU从内存重新读取。同时,确保缓冲区地址按32字节对齐(M7缓存行大小),并考虑使用`__ALIGNED(32)`声明。对于Cortex-M4(如STM32F4),无缓存,但需注意DMA和CPU对同一内存的访问顺序,通常无需特殊操作,但若使用MPU配置了写缓冲或外设共享,仍需确保内存属性为正常非缓存(如`Normal, Non-cacheable`)。实操建议:在双缓冲切换时,先停止DMA,处理缓存操作,再切换缓冲区指针并重新启动DMA;或者使用DMA的循环模式配合中断,在中断中执行缓存维护。此外,可考虑使用`DMA_CacheMaintenance`库函数(如STM32Cube的`HAL_DMA_Start_IT`配合`__HAL_DMA_DISABLE`)简化流程。
mcuku 阿沐 · 2026-08-27