在STM32F4上使用DMA双缓冲模式时,缓存一致性问题主要源于CPU和DMA对同一内存区域的访问不一致。首先,确保DMA缓冲区定义在非缓存的SRAM区域(如使用__attribute__((section(".ARM.__at_0x20000000")))或配置MPU将区域设为强序),或使用DMA的存储器到存储器模式时手动执行__DSB()和__ISB()指令。其次,配置DMA中断时,需在DMA_IRQHandler中检查DMA_HISR/DMA_LISR的TCIF(传输完成)和HTIF(半传输)标志,并清除对应标志(写0清除)。建议使用回调函数处理数据,并在回调中切换缓冲区指针。实操中,推荐使用HAL库的HAL_DMA_Start_IT和HAL_DMA_IRQHandler,但需注意HAL库自动清除标志,避免重复处理。最后,在启用DMA前,确保缓冲区地址按32字节对齐(Cache line大小),并调用SCB_CleanDCache或SCB_InvalidateDCache(若使用Cache)。
mcuku 阿沐 · 2026-08-27