核心思路是采用“双缓冲+空闲中断+DMA传输完成中断”的三级联动机制。首先,将DMA配置为循环模式,并设置两个大小相等的缓冲区(如BUFF_A和BUFF_B),通过DMA的半传输和全传输中断来切换当前写入缓冲区。当串口空闲中断(IDLE)触发时,立即读取DMA的当前数据计数器(NDTR),结合已切换的缓冲区指针,即可确定完整帧的起始和长度。为避免覆盖,需在中断服务中快速拷贝数据到应用层队列,并确保处理时间短于下一帧到达间隔。实操建议:1)使用双缓冲时,务必在DMA传输完成中断中置标志位,主循环轮询处理,避免在中断内做耗时操作;2)空闲中断需在接收每字节后由硬件自动清除,但需注意在帧间隔小于1字节时间时可能误触发,可结合超时定时器辅助判断;3)若帧率很高,建议将缓冲区大小设为最大帧长的2倍以上,并启用DMA的FIFO模式(若支持)减少总线竞争。最终,通过信号量或环形队列将数据交给协议解析层,确保无锁或短临界区。
mcuku 阿沐 · 2026-09-04