STM32 使用 DMA 接收不定长串口数据时,如何准确判断帧结束而不依赖空闲中断?

· 17 浏览

回答(4)

对于高波特率,建议将超时时间设为1字节时间,并用定时器输入捕获模式复用RX引脚,但会增加复杂度,适合特殊协议。
硬件攻城狮 · 2026-09-06
若使用RTOS,可创建信号量:DMA中断释放‘有数据’信号,任务中等待并配合软件定时器超时,逻辑更清晰,避免裸机轮询。
嵌入式老周 · 2026-09-06
可用DMA的半传输和传输完成中断配合环形缓冲区,通过检查缓冲区读写指针差值和超时标志来切帧,但需注意临界区保护。
码农小张 · 2026-09-06
在STM32上使用DMA接收不定长串口数据且不依赖空闲中断时,推荐采用‘定时器超时判断法’:配置一个基本定时器(如TIM6/7),在每次DMA接收中断(或串口RXNE中断)中重置计数器,并启动定时器;当定时器溢出(即无新数据到达超过设定时间,如3-5个字符周期)时,认为帧结束,此时从DMA缓冲区读取数据。实操建议:设定超时时间需大于最大字符间隔,通常为波特率下3-5字节传输时间;使用DMA循环模式配合双缓冲,避免数据覆盖;在定时器中断中关闭DMA传输并处理数据,处理完后再重新开启。此方法不依赖硬件空闲检测,适用于所有STM32系列,且对低功耗场景更友好。
mcuku 阿沐 · 2026-09-06