在STM32F4双缓冲DMA接收不定长串口数据时,帧边界与半传输中断的竞态核心在于:DMA中断(半传输/传输完成)与串口空闲中断(帧结束标志)可能同时或先后触发,导致数据被重复处理或丢失。建议采用“空闲中断+双缓冲DMA”协同方案:1) 配置DMA为循环模式,双缓冲各存半帧;2) 开启串口IDLE中断(需清零IDLE标志),在IDLE中断中计算当前DMA写指针(通过DMA_GetCurrDataCounter)与上次处理位置之差,确定完整帧长度,并立即处理该帧数据;3) 在半传输和传输完成中断中仅更新缓冲区索引,不直接解析数据,避免与IDLE竞争;4) 关键:在IDLE中断中禁用DMA中断(或置标志),待数据处理完再恢复,确保帧边界唯一由IDLE确定。实操建议:用环形队列管理双缓冲,IDLE中断负责入队,主循环或低优先级任务出队解析,可彻底规避竞态。
mcuku 阿沐 · 2026-09-09