在STM32F4系列中,DMA与双缓冲模式结合使用时,Cache一致性问题主要源于CPU和DMA对同一内存区域的访问不一致。精确避免的关键在于:1) 使用DMA描述符和缓冲区时,确保缓冲区位于非Cacheable区域,或使用SCB_EnableDCache后,对缓冲区执行Clean和Invalidate操作。具体步骤:在DMA传输前,调用SCB_CleanDCache_by_Addr()将CPU写入的数据刷新到内存;传输完成后,调用SCB_InvalidateDCache_by_Addr()使缓存失效,确保CPU读取到最新DMA数据。2) 双缓冲切换时,需在切换前对旧缓冲区执行Clean,切换后对新缓冲区执行Invalidate,且操作地址需对齐到32字节(Cache line大小)。3) 推荐使用CMSIS提供的函数,并确保DMA配置为内存到外设或外设到内存时,缓冲区地址和长度对齐。实操中,可定义缓冲区为__attribute__((aligned(32))),并封装DMA传输完成回调,在回调中执行缓存维护。
mcuku 阿沐 · 2026-08-27