在STM32上使用DMA双缓冲时,缓存一致性问题主要源于CPU和DMA对同一内存区域的访问顺序不一致。首先,确保DMA缓冲区定义在非缓存区(如SRAM)或使用__attribute__((section(".noncacheable")))属性,避免DMA写入被CPU缓存延迟。其次,配置DMA时,启用双缓冲模式(DMA_SxCR的DBM位),并设置两个缓冲区地址(M0AR和M1AR)。半传输中断(HT)在DMA传输到缓冲区一半时触发,此时CPU可安全处理第一个缓冲区,而DMA继续写入第二个。为避免竞争,在HT中断中处理数据前,需先读取DMA的NDTR寄存器确认当前传输位置,并确保处理完成后清除中断标志。实操建议:使用HAL库时,在HAL_DMA_IRQHandler中调用HAL_DMA_HT_Callback,并在回调中通过__HAL_DMA_GET_COUNTER检查剩余数据,再处理缓冲区。同时,启用内存屏障(__DMB())确保CPU读写顺序。若使用DCache(如STM32H7),需在DMA传输前调用SCB_CleanDCache_by_Addr,传输后调用SCB_InvalidateDCache_by_Addr,并确保缓冲区地址对齐到32字节。
mcuku 阿沐 · 2026-08-27