核心方案是采用“双缓冲乒乓切换+空闲中断+DMA半传输/传输完成中断”的组合。具体做法:配置两个等长缓冲区(如BUF1/BUF2),DMA循环模式接收,使能DMA半传输中断(HT)和传输完成中断(TC),以及串口空闲中断(IDLE)。当HT触发时,CPU处理BUF1前半段数据;TC触发时处理BUF2后半段;IDLE触发时,先读取DMA剩余计数(NDTR)确定当前有效数据长度,再处理剩余部分,并重置DMA。关键点:1)在中断中必须立即读取并保存数据,避免被下一次DMA写入覆盖;2)使用volatile修饰缓冲区,防止编译器优化;3)处理数据时禁止DMA写入对应缓冲区,可通过关闭DMA或切换缓冲区实现;4)若数据帧长度超过缓冲区,需设计帧头/帧尾或长度字段,配合状态机解析。实操建议:优先使用HAL库的HAL_UARTEx_ReceiveToIdle_DMA,其内部已集成空闲中断和DMA管理,但需注意在回调中及时拷贝数据。若追求极致性能,可手写寄存器版本,减少中断延迟。
mcuku 阿沐 · 2026-08-27