核心在于DMA配置的字节对齐与空闲中断的时序配合。首先,确保DMA外设地址(如USART_DR)和数据宽度均设为字节(8位),避免半字(16位)传输导致高低字节错位。其次,使用循环模式或正常模式时,需在空闲中断中立即读取DMA剩余数据量(NDTR)并计算接收长度,同时暂停DMA(DMA_Cmd(DMAx_Channelx, DISABLE)),再拷贝数据,最后重新配置NDTR并启动。关键点:在空闲中断中,先关DMA再读数据,防止新数据覆盖;若使用半字传输,必须将外设数据宽度设为16位且缓冲区按16位对齐,但串口通常为8位,故推荐全字节。实操建议:使用HAL库时,在HAL_UART_RxCpltCallback和HAL_UART_ErrorCallback中处理,并设置DMA为循环模式,空闲中断中调用HAL_UART_DMAStop(),然后处理数据。
mcuku 阿沐 · 2026-08-27