STM32 UART串口怎么配置?波特率怎么算、printf怎么重定向?嵌入式面试

浏览量:8
时间: 2026-09-16 10:04:04
一句话答案

STM32 UART 配置三步:开时钟→配 GPIO 复用(TX/RX)→设波特率/数据位/停止位/校验;printf 重定向重写 fputc() 到 USART DR 寄存器;波特率误差要<2%,否则通信乱码。

本文概述

UART 是嵌入式最常用调试接口,面试常考:波特率怎么算、8N1 是什么、printf 重定向、收发中断、波特率误差。回答要能讲清配置流程和常见坑。

核心要点

  • UART 是异步串口:TX/RX 两根线,无时钟线,双方约定波特率

  • 帧格式常见 8N1:8 数据位、无校验、1 停止位

  • 波特率误差要<2%(常用 9600/115200/921600),误差大了采样错位

  • printf 重定向重写 fputc(),把字符写到 USART->DR

  • 接收用中断(RXNE)或 DMA,不要在主循环轮询

USB转TTL模块连 STM32 开发板,串口终端显示 printf 输出,示波器显示 TX 波形

面试官:STM32F103 用 USART1 做 115200 通信,怎么配?printf 怎么用?

面试官考察点

面试官看你是否真配过 UART、是否理解波特率和重定向。重点听:时钟、GPIO、波特率计算、fputc。

回答思路

按「时钟→GPIO→UART 参数→收发→printf」讲,给配置思路和代码片段。

参考回答

第一步,开时钟。

USART1 在 APB2 总线上,GPIOA 也在 APB2,所以:

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_USART1, ENABLE);

第二步,配 GPIO。

  • PA9 (TX):复用推挽输出(AF_PP),50MHz;

  • PA10 (RX):浮空输入或上拉输入(IN_FLOATING)。

第三步,配 USART1。

参数常用值说明
波特率115200PCLK2=72MHz,USARTDIV=72M/(115200×16)≈39.06
数据位88N1 最常用
停止位11 stop bit
校验None无校验
模式TX+RX收发都开

第四步,收发。

  • 发送:写 USART->DR,等 TC(发送完成)标志;

  • 接收:开 RXNEIE 中断,进中断读 DR;或开 DMA 自动收;

  • 不要在主循环 while(RXNE==0) 轮询,浪费 CPU。

第五步,printf 重定向。

在 Keil 里重写 fputc:

int fputc(int ch, FILE *f) {
  while(USART_GetFlagStatus(USART1, USART_FLAG_TC)==RESET);
  USART_SendData(USART1, (uint8_t)ch);
  return ch;
}

注意 Keil 要勾选 Use MicroLIB,否则 printf 走半主机模式会卡死。

常见坑。

  • 波特率不对:算错分频导致乱码,用示波器量一位宽≈8.68us(115200);

  • GPIO 配成推挽输出而不是复用:TX 没接到 USART 外设;

  • 忘了开 USART 时钟:寄存器写不进;

  • RX 悬空:噪声导致中断狂进。

面试官可能追问

追问 1:115200 一位时间多少?
1/115200≈8.68us。示波器量起始位到停止位应该约 10×8.68=86.8us(10 位帧)。
追问 2:8N1 是什么意思?
8 数据位、No parity 无校验、1 stop bit 1 停止位。是最常用的异步串口帧格式。
追问 3:printf 为什么要重定向?
标准库 printf 默认走半主机(和调试器通讯),在裸机上没调试器会卡死;重写 fputc 把字符发到 UART。
追问 4:接收用中断还是 DMA?
数据量小用中断;持续数据流(如 GPS NMEA)用 DMA+空闲中断,CPU 不用管。
追问 5:波特率误差多少以内可以接受?
一般<2%。误差大会累积,一帧 10 位后采样点偏到下一位,出现乱码。

常见失分表达

✗ printf 直接用 — Keil 没勾 MicroLIB 会走半主机卡死。
✗ RX 配成推挽输出 — RX 必须是输入,配错收不到数据。
✗ while 死等接收 — 轮询浪费 CPU,应该用中断或 DMA。

准备动作

1
在 STM32 上配 USART1 115200,用 USB-TTL 连电脑看 printf
2
用示波器量 TX 一位时间,验证波特率
3
准备一个 UART 乱码的排查案例
4
了解 DMA+空闲中断接收不定长数据

核心关键词

UARTSTM32波特率8N1printf重定向fputc


声明:本网站所收集的部分公开资料来源于互联网,转载的目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。仅供学习交流使用,不构成商业目的。版权归原作者所有,如果您发现网站上有侵犯您的知识产权的作品,请与我们取得联系,我们会及时删除。侵权投诉
相关推荐HOT
ADC采样前端滤波网络怎么设计

分类:硬件设计经验级别:1-3年难度:中级题型:原理+选型硬件工程师在实验室调试ADC采样电路,测试前端滤波效果本文概述ADC采样前端滤波的核心目的有两个:抗混... 详情>>

2026-08-11 17:44:55
电子工程师技术面试自我介绍怎么说?STAR法则与高分回答框架

电子工程师技术面试自我介绍怎么说?STAR法则与高分回答框架其他类面试基础难度面试技巧题本文概述"请你做个自我介绍"几乎是所有面试的第一题,也是建立第一印象的关... 详情>>

2026-08-28 15:09:49
Linux中断为什么要分顶半部和底半部?嵌入式Linux面试详解

分类:嵌入式Linux经验级别:中级难度:★★★☆☆题型:原理理解+选型本文概述:Linux中断分为顶半部和底半部,核心原因是顶半部运行在中断上下文,不能被打断... 详情>>

2026-08-14 10:34:25
高速连接器在PCB上的布局位置怎么确定?PCB面试要从信号入口讲到阻抗过渡

分类:PCB设计工程师面试题经验要求:中级难度:中高级题型:布局设计📖 本文概述高速连接器布局位置是PCB设计工程师面试高频题。本文从结构接口坐标定位、参考平... 详情>>

2026-08-04 15:59:25
IBIS模型怎么理解与使用?PCB仿真工程师面试SPICE与IBIS对比

PCB仿真中高级技术基础题本文概述IBIS是信号完整性仿真最常用的模型格式,面试中需要讲清IBIS是什么(I/O Buffer Information Spec... 详情>>

2026-09-01 13:50:52
开班信息