在STM32F4双缓冲DMA中,乒乓切换的核心是确保CPU与DMA不会同时访问同一缓冲区。首先,启用DMA的Double Buffer模式(DBM=1)并配置两个内存地址(M0AR/M1AR),切换由硬件自动完成,但需在DMA传输完成中断(TC)中更新当前活动缓冲区索引。缓存一致性:若使用D-Cache(如F4带Cache的型号),需在DMA写入前调用SCB_CleanDCache_by_Addr清理CPU侧缓存,在DMA完成后调用SCB_InvalidateDCache_by_Addr使CPU读取失效,避免读到陈旧数据。数据覆盖:在TC中断中,先读取DMA的NDTR寄存器确认剩余数据量,再通过DMA_GetCurrentMemoryTarget判断当前缓冲区,确保CPU只处理非活动缓冲区;同时,处理速度必须快于DMA填充周期,否则需增加缓冲区深度或使用环形队列。实操建议:使用volatile标志位保护切换逻辑,并在中断中禁用DMA(DMA_Cmd DISABLE)再切换地址,防止竞态。
mcuku 阿沐 · 2026-08-27