在STM32F4上使用DMA双缓冲(乒乓)时,缓存一致性主要涉及DMA与CPU对SRAM的访问同步。首先,确保DMA配置为循环模式并启用双缓冲(DBM=1),通过DMA_SxNDTR和DMA_SxM0AR/M1AR管理两个缓冲区。切换时机由DMA中断(TC或HT)触发,在中断服务程序中读取DMA_SxCR的CT位(当前目标缓冲区索引)判断当前使用哪个缓冲区。关键点:在切换前,必须用__DMB()(数据内存屏障)确保CPU对当前缓冲区的写操作完成,再清除DMA中断标志并更新缓冲区指针。若缓冲区位于D-Cache区域(如外部SRAM),需调用SCB_CleanDCache_by_Addr()在DMA写入前清理,读取后调用SCB_InvalidateDCache_by_Addr()使缓存失效,避免陈旧数据。实操建议:优先将缓冲区放在内部SRAM(无缓存问题),或使用MPU配置为非缓存区域;若必须用外部RAM,则每次切换时执行上述缓存操作,并注意DMA传输长度需与缓存行(32字节)对齐。最后,在中断中避免复杂逻辑,仅做标志位更新,主循环处理数据,减少切换延迟。
mcuku 阿沐 · 2026-08-27