核心思路是让DMA在双缓冲间自动切换,同时用空闲中断(IDLE)标记帧尾,避免在中断里直接操作缓存指针。具体做法:配置DMA为循环模式,双缓冲分别指向buf1和buf2,使能DMA传输完成中断(每个缓冲满时触发)和串口空闲中断。在空闲中断中,读取DMA当前数据指针(DMA_GetCurrDataCounter)判断当前正在写入哪个缓冲,从而确定哪个缓冲是完整帧。关键竞态点在于:空闲中断可能发生在DMA正在写缓冲时,此时需先关闭DMA(或禁用通道)再拷贝数据,拷贝完再重新开启,并更新缓冲状态。实操建议:用状态机管理缓冲所有权(如IDLE、FULL、PROCESSING),在空闲中断中置标志位,主循环中处理数据,避免在中断里做耗时操作。同时,使用volatile修饰共享变量,并考虑临界区保护(如关中断或使用互斥量)。
mcuku 阿沐 · 2026-08-27