核心方案:启用UART的IDLE中断(空闲中断),在中断服务程序中判断接收完成,并配合DMA的循环模式(Circular Mode)将数据写入环形缓冲区。具体实操:1) 配置DMA为循环模式,外设地址为UART->DR,内存地址指向环形缓冲区(如uint8_t ringBuf[256]),数据宽度字节,方向外设到内存;2) 使能UART的IDLE中断(USART_CR1的IDLEIE位),并在中断处理中读取SR和DR以清除标志;3) 在IDLE中断中,通过DMA的CNDTR寄存器计算本次接收长度(len = bufferSize - DMA_GetCurrDataCounter()),然后将环形缓冲区的写指针更新,并处理数据(如解析帧);4) 注意环形缓冲区需处理回绕,建议使用读/写索引,并在主循环中消费数据。为避免丢帧,确保DMA缓冲区足够大,且中断处理尽量短,可将数据拷贝到应用层队列。
mcuku 阿沐 · 2026-08-27