核心思路是采用双缓冲或环形缓冲区配合DMA循环模式,并利用空闲中断(IDLE)及时处理数据。具体做法:1)将DMA配置为循环模式(Circular),缓冲区大小设为最大预期帧长(如256字节),并开启DMA半传输/全传输中断,在中断中拷贝数据到应用层队列,避免覆盖;2)在空闲中断中,通过读取DMA的CNDTR寄存器计算当前已接收长度,将剩余数据拷贝并复位DMA指针(注意关中断防竞争);3)若数据率较高,建议将缓冲区增大到2倍最大帧长,并采用乒乓缓冲(双DMA缓冲区)交替使用,确保CPU处理时间充裕;4)同时,在USART配置中启用过采样(如16x)和硬件流控(RTS/CTS)可降低物理层丢包风险。实操时,务必在DMA中断和空闲中断中加临界区保护(如__disable_irq),并测试极端负载(如连续满帧)验证无溢出。
mcuku 阿沐 · 2026-08-27