核心思路:双缓冲的本质是让DMA在写一个缓冲区时,CPU/应用处理另一个缓冲区,但切换瞬间(即DMA传输完成中断触发时)仍可能因处理延迟导致数据覆盖。避免丢失的关键是:1)确保DMA传输完成中断优先级足够高(如设置为最高抢占优先级),且中断服务函数内只做缓冲区指针切换和标志置位,不进行耗时操作(如浮点运算、打印);2)使用循环DMA模式(而非正常模式),让DMA自动回绕到缓冲区起始地址,配合双缓冲的地址交替(通过DMA_CMAR寄存器切换),这样即使中断延迟,DMA也会继续写入当前缓冲区,不会丢失新采样值;3)为每个缓冲区设置独立的‘满标志’,在应用层轮询或中断中检查,确保处理完一个缓冲区后再允许DMA切换。实操建议:在STM32CubeMX中配置DMA为Circular模式,双缓冲使能,并开启传输完成中断(TC),在中断里用if(DMA_GetITStatus)判断是哪个缓冲区完成,然后切换CMAR地址。若采样率极高(如>1Msps),建议将DMA中断优先级设为最高,并考虑用硬件FIFO(如ADC的DMA请求)缓冲。
mcuku 阿沐 · 2026-08-29