USART 配置:GPIO 复用(TX/RX)→波特率设置(BRR 寄存器)→数据位/停止位/校验→使能;波特率 = fCK / (16×USARTDIV), oversampling 16;DMA 收发减轻 CPU 负担,TX 用 DMA 内存→外设,RX 用 DMA 外设→内存,配合 IDLE 中断判断帧结束。
本文概述
串口是单片机最常用通信,面试常考:波特率计算、DMA 收发、IDLE 中断、收发流程。回答要给配置步骤和波特率公式。
核心要点
USART 配置:GPIO 复用→波特率→数据格式→使能 TX/RX
波特率 = fCK / (16 × USARTDIV),USARTDIV 写入 BRR 寄存器
DMA TX:内存→外设,发送完成中断;DMA RX:外设→内存,循环模式+IDLE 中断
IDLE 中断:总线空闲时触发,用来判断一帧数据接收完成
常用参数:115200 8N1(8 数据位、无校验、1 停止位)

面试官考察点
串口基础题。面试官看你是否会算波特率。重点听:公式、USARTDIV、BRR。
回答思路
用公式算 USARTDIV,再转 BRR。
参考回答
波特率公式(oversampling=16)。
波特率 = fCK / (16 × USARTDIV)
USARTDIV = fCK / (16 × 波特率)
72MHz,115200:
USARTDIV = 72000000 / (16 × 115200)
= 72000000 / 1843200
= 39.0625
BRR 寄存器格式:整数部分左移 4 位 + 小数部分×16:
整数 = 39,小数 = 0.0625 × 16 = 1
BRR = (39 << 4) | 1 = 0x271
HAL 库用 HAL_UART_Init 自动算,直接设 BaudRate=115200 即可。
配置步骤(HAL)。
使能 USART 和 GPIO 时钟;
GPIO 配置为复用推挽(AF7 为 USART1);
UART_HandleTypeDef 配置:BaudRate、WordLength(8位)、StopBits(1)、Parity(无)、Mode(TX_RX);
HAL_UART_Init;
发送:HAL_UART_Transmit(阻塞)或 HAL_UART_Transmit_DMA(DMA);
接收:HAL_UART_Receive(阻塞)或 HAL_UART_Receive_DMA(DMA)。
接收方式对比。
| 方式 | CPU 占用 | 丢数据风险 | 适用 |
|---|---|---|---|
| 阻塞接收 | 高(等数据) | 高 | 简单调试 |
| 中断接收 | 中 | 中 | 低速少量数据 |
| DMA+IDLE | 低 | 低 | 高速不定长(推荐) |
DMA 接收 + IDLE 中断(不定长数据)。
配置 DMA 循环模式,接收缓冲区固定大小(如 256 字节);
使能 USART IDLE 中断(总线空闲时触发);
IDLE 中断里:读 SR 清 IDLE 标志,计算已接收长度 = 缓冲区大小 - DMA 剩余计数;
处理数据,然后重新启动 DMA 接收;
优点:不占用 CPU,适合不定长协议(如 Modbus、AT 指令)。
注意。
波特率误差要 <2%,否则通信出错。72MHz/115200 误差 0.16%,没问题;
TX/RX 要交叉连接(A 的 TX 接 B 的 RX);
RS232 电平(±12V)要加 MAX232 转换,TTL 电平(3.3V)直接连;
接收引脚要加下拉或上拉,防止空闲时噪声误触发。

扫码关注





























