精确判断帧结束并避免缓存覆盖,核心在于结合DMA半满/全满中断与空闲中断(IDLE)的协同设计。推荐方案:配置DMA为循环模式,双缓冲大小设为帧最大长度的一半(或按需)。启用DMA传输完成中断(半传输和全传输)以及串口IDLE中断。在IDLE中断中,读取DMA当前数据计数器(NDTR)和缓冲区索引,计算实际接收长度,并立即处理数据。为避免覆盖,处理数据时需暂停DMA(或使用双缓冲切换机制),确保在下一帧到来前完成拷贝。实操建议:1)使用空闲中断作为帧结束标志,因其在总线空闲时触发,精准且不依赖帧内容;2)在IDLE回调中,先关闭DMA传输(清EN位),再计算长度并处理,最后重新开启;3)若帧长可能超过缓冲区,需设计环形队列或增大缓冲区,并在半满中断中及时搬运数据。注意:双缓冲的切换由硬件自动完成,但软件需跟踪当前有效缓冲,防止读写冲突。
mcuku 阿沐 · 2026-08-27