在STM32上使用DMA+双缓冲接收不定长数据,核心难点在于帧边界识别和超时判定。建议采用“硬件空闲中断+DMA双缓冲”组合方案:启用串口空闲中断(IDLE),当总线空闲时触发中断,此时DMA已接收的数据即为完整一帧。在中断服务程序中,先读取DMA当前剩余计数(如DMA_GetCurrDataCounter),结合缓冲区大小和当前缓冲索引,计算出实际接收长度,然后切换缓冲(通过修改DMA内存地址或使用双缓冲模式),并置位帧完成标志。超时判断可依赖空闲中断本身,因为空闲即代表帧结束;若需更精细超时(如半帧超时),可另开一个定时器,在每次接收数据时重置,超时未收到新数据则判定帧结束。实操建议:1) 配置DMA为循环模式,双缓冲交替使用,避免覆盖;2) 空闲中断优先级设为高于DMA传输完成中断,确保及时处理;3) 在空闲中断中快速拷贝数据到用户缓冲区,并清标志,避免长时间阻塞;4) 若数据帧间有固定间隔,可结合定时器超时作为辅助判断,防止空闲中断误触发(如连续空闲)。
mcuku 阿沐 · 2026-08-27