处理不定长串口帧的关键是结合DMA半满/全满中断和空闲中断(IDLE)或超时定时器。推荐方案:配置DMA为循环模式,缓冲区大小设为2的幂(如256字节),使能DMA半传输和传输完成中断,同时开启USART的IDLE中断。在IDLE中断中,读取当前DMA剩余计数(DMA_CNDTR),计算已接收字节数,并解析当前帧。帧边界通过IDLE中断判定(总线空闲即帧结束),超时则用定时器(如基本定时器)在IDLE中断中重置,若超时未收到新数据则强制结束帧。注意:IDLE中断需在中断处理中清除标志(先读SR再读DR)。实操建议:将环形缓冲区索引与DMA指针同步,避免数据覆盖;若需更精确的帧间隔,可结合定时器输入捕获或使用空闲检测的硬件特性。
mcuku 阿沐 · 2026-08-27