在STM32上使用DMA双缓冲时,缓存一致性问题的核心在于CPU和DMA对同一内存区域的访问顺序。若未开启Cache(如STM32F1/F3),内存直接由CPU和DMA访问,无需特殊处理,但需确保缓冲区地址对齐(建议4字节对齐)且DMA传输完成后通过中断标志同步,避免CPU在DMA写入期间读取。若开启Cache(如STM32F4/H7),必须处理一致性:1)在DMA传输前,调用SCB_CleanDCache_by_Addr清理CPU写入的缓冲行,确保数据写入内存;2)传输完成后,调用SCB_InvalidateDCache_by_Addr使缓存失效,强制CPU从内存重新读取。同时,建议将DMA缓冲区定义在非Cacheable区域(如MPU配置或使用__attribute__((section(".noncacheable")))),或使用双缓冲交替机制:当DMA填充Buffer A时,CPU处理Buffer B,并在切换时执行清理/失效操作。实操中,还需注意DMA传输长度需为缓存行大小(32字节)的整数倍,否则需手动处理边界。推荐使用HAL库的HAL_DMA_Start_IT配合回调,并在回调中执行失效操作。
mcuku 阿沐 · 2026-08-27