在STM32的DMA+环形缓冲区方案中,处理不定长帧的核心是结合空闲中断(IDLE)和超时机制。首先,启用UART的IDLE中断,当总线空闲时触发,此时DMA已接收完一帧数据,可在中断中记录当前DMA接收位置(通过读取DMA的CNDTR寄存器),并与环形缓冲区的写指针比较,从而确定帧长度。为避免帧内数据间隔过长导致误判,建议在IDLE中断中启动一个软件定时器(如基于SysTick或TIM),设置超时值(如10ms,根据波特率调整)。若定时器超时且缓冲区有新数据,则强制成帧。对于帧边界,可在缓冲区中维护读指针和写指针,写指针由DMA更新(通过中断或轮询CNDTR),读指针由解析代码管理。解析时,先检查缓冲区中是否有完整帧(通过IDLE标志或超时),再提取数据。注意处理DMA半传输和传输完成中断,避免覆盖。实操建议:使用双缓冲或循环DMA,并确保环形缓冲区大小足够容纳最大帧长,同时在IDLE中断中快速拷贝数据到应用层,避免长时间占用中断。
mcuku 阿沐 · 2026-08-27