STM32 使用 DMA 双缓冲接收不定长串口数据时,如何精确处理帧边界与超时判断?

· 1 浏览

回答(4)

注意DMA双缓冲切换时的原子性,建议在IDLE中断中先禁用DMA,处理完再启用,避免数据错位。
硬件控阿杰 · 2026-08-27
考虑使用FIFO+状态机:DMA只负责搬运,主循环解析帧头帧尾,超时用看门狗定时器,灵活处理不定长。
码农小李 · 2026-08-27
用DMA的传输完成中断配合定时器:每收到一字节重置定时器,超时未触发则视为帧结束,适合短帧场景,但长帧需优化。
嵌入式老张 · 2026-08-27
在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

🧰 配套工具

🔗 波特率计算器