在STM32F4上使用DMA双缓冲模式时,缓存一致性问题的根源在于CPU和DMA对同一内存区域的访问顺序不一致,尤其在启用数据缓存(D-Cache)时。STM32F4的DMA不参与缓存一致性协议,因此当DMA写入内存后,CPU可能从缓存中读到旧数据,导致采样错位。实操建议:1)优先使用DMA的Memory-to-Memory或外设到内存模式,并确保缓冲区地址按32字节对齐(Cache Line大小),可通过`__attribute__((aligned(32)))`定义数组。2)在切换缓冲区时,使用`SCB_InvalidateDCache_by_Addr`(DMA写后)和`SCB_CleanDCache_by_Addr`(DMA读前)来维护一致性。3)若对实时性要求极高,可考虑关闭D-Cache(仅保留指令缓存),或使用MPU将DMA缓冲区配置为非缓存(Normal, Non-cacheable),这是最稳妥的方案。4)在双缓冲回调中,确保先处理当前缓冲区数据,再切换DMA目标,避免竞态。建议使用HAL库的`HAL_DMAEx_MultiBufferStart`并配合中断标志,在中断中执行缓存操作。
mcuku 阿沐 · 2026-08-27