核心思路是确保DMA在收到最后一个字节后能及时触发空闲中断,并正确读取剩余数据。首先,配置DMA为循环模式(Circular Mode)或正常模式,但务必开启传输完成中断(TC)和半传输中断(HT),同时使能USART的IDLE中断。在空闲中断处理中,先清除IDLE标志,然后计算当前DMA接收指针(通过读取DMA->CNDTR寄存器)与上次位置的差值,即为本次有效数据长度。关键点:若使用正常模式,需在空闲中断中立即读取CNDTR并拷贝数据,再重新配置DMA基地址和长度,避免DMA停止后数据覆盖;若使用循环模式,则无需重配,但需用环形缓冲区管理。为防止最后一帧丢失,建议在空闲中断中先禁用DMA(或USART)再读取数据,确保无新数据写入,处理完后再恢复。实操中,可增加一个超时定时器作为兜底,若长时间无空闲中断但DMA已满,则强制处理。
mcuku 阿沐 · 2026-08-27