在STM32上使用DMA双缓冲接收不定长串口数据,核心挑战是确定帧边界和超时。建议采用“空闲中断+DMA半满/全满中断”的组合策略:启用USART的IDLE中断(或使用HAL的HAL_UARTEx_ReceiveToIdle_DMA),当总线空闲时触发中断,此时检查DMA当前接收计数(如通过__HAL_DMA_GET_COUNTER),即可精确计算当前帧长度,并切换缓冲。对于超时判断,可在IDLE中断中启动一个软件定时器(如基于SysTick或TIM),若在设定时间内未收到下一帧数据,则判定超时并处理。同时,需处理DMA半满中断以应对长帧,避免数据覆盖。建议将DMA配置为循环模式,并在IDLE回调中根据DMA计数值和缓冲索引计算有效数据,确保帧边界准确。实操中,注意关闭DMA中断时的临界区保护,防止数据竞争。
mcuku 阿沐 · 2026-08-27