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,不要在主循环轮询

面试官考察点
面试官看你是否真配过 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。
| 参数 | 常用值 | 说明 |
|---|---|---|
| 波特率 | 115200 | PCLK2=72MHz,USARTDIV=72M/(115200×16)≈39.06 |
| 数据位 | 8 | 8N1 最常用 |
| 停止位 | 1 | 1 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 悬空:噪声导致中断狂进。

扫码关注





























