STM32 怎么同时跑多个串口?

STM32 · 6 浏览
STM32 怎么同时跑多个串口?

回答(5)

同时跑多串口,优先用HAL库的UART_Receive_IT和UART_Transmit_IT,每个串口实例独立回调。注意HAL库的DMA接收要处理IDLE事件,否则半字对齐问题。实测F429跑5个串口,每个115200,CPU占用不到30%。别用printf重定向,会冲突。
嵌入式老炮儿 · 2026-08-14
给你个模板:初始化时写个函数,参数传USART_TypeDef*和波特率,内部配置GPIO和NVIC。中断服务函数里switch(USARTx)判断,分别处理。我试过同时跑3个串口,9600波特率,收发都正常。关键要开USART_IT_RXNE,接收用标志位。
单片机爱好者小张 · 2026-08-14
先确认你的型号有几个串口,F103有5个,F407有6个。每个串口要独立的时钟使能和引脚复用。注意中断优先级分组,避免嵌套混乱。发送建议用环形缓冲区,接收用DMA,这样多串口互不干扰。记得把每个串口的错误中断也开了,防止溢出。
硬件老兵李工 · 2026-08-14
多串口同时跑,核心是中断或DMA。USART1~6每个独立外设,初始化时分别配置GPIO、波特率、中断优先级。用DMA+空闲中断接收,发送用阻塞或DMA。共享一个中断服务函数,通过ID判断是哪个串口。别用while轮询,会卡死主循环。
嵌入式工程师阿强 · 2026-08-14
STM32 多个串口同时跑是常规需求,核心是让每个串口独立工作,互不阻塞。推荐做法: 1. **使用中断或 DMA**:避免在主循环中轮询等待,否则一个串口繁忙会拖累其他串口。 2. **每个串口独立配置**:如 USART1、USART2 各自使能时钟、引脚、中断,中断服务函数分开。 3. **配合环形缓冲区**:接收中断里只存数据到缓冲区,主循环或任务中解析,发送可用中断或 DMA。 4. **注意中断优先级**:若串口波特率高或数据量大,可将中断优先级适当调高,但避免长时间占用 CPU。 5. **调试建议**:先单独测每个串口,再一起跑;用逻辑分析仪查看波形。 示例(HAL 库,使用中断接收): ```c // 初始化两个串口 MX_USART1_UART_Init(); MX_USART2_UART_Init(); HAL_UART_Receive_IT(&huart1, &rx1_buf, 1); HAL_UART_Receive_IT(&huart2, &rx2_buf, 1); // 各自中断回调 void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { if (huart == &huart1) { // 处理 USART1 数据 HAL_UART_Receive_IT(&huart1, &rx1_buf, 1); } else if (huart == &huart2) { // 处理 USART2 数据 HAL_UART_Receive_IT(&huart2, &rx2_buf, 1); } } ``` 如果数据量大,建议用 DMA + 空闲中断,降低 CPU 负载。注意中断服务函数里不要做耗时操作,保证实时性。
mcuku 阿沐 · 2026-08-14

🧰 配套工具

🔗 波特率计算器