uart(串口)
知识要点
UART是异步⭐的,就是没有时钟线,一个TX,一个RX,一个GND
硬件流控(RTS/CTS) :接收缓冲区快满时通过CTS让对方暂停发送,防止数据丢失。这两个算可选
UART接收时,硬件依靠波特率时钟将引脚上的跳变一位一位送到移位寄存器中,满8位后再放到接收数据寄存器中,此时 RXNE(接收寄存器非空)标志位置为 1,触发接收中断。
| 协议 | 线数 | 速率 | 特点 | |
|---|---|---|---|---|
| UART | 2线(TX/RX) | 几百Kbps | 异步、点对点、全双工、简单 | 调试串口、蓝牙/GPS模组 |
| I2C | 2线(SDA/SCL) | 100K/400K/3.4Mbps | 同步、半双工、多从机、带寻址 | 传感器、EEPROM、RTC |
| SPI | 4线 | 几十Mbps | 同步、全双工、速度快、无寻址 | Flash、LCD、ADC ,屏幕等高速外设 |
| CAN | 2线(差分) | 1Mbps | 多主多从、差分抗干扰、带仲裁、汽车工业常用 | 汽车和工业总线 |
选型原则:低速简单用 UART,多设备低速用 I2C,高速短距离用 SPI,长距离抗干扰用 CAN。
波特率自适应 方法:
- 发送方先发特定字符(如
0x7F),接收方测量脉冲宽度自动计算波特率 - STM32支持硬件自动波特率检测:利用起始位下降沿到特定边沿的时间推算
波特率计算:
波特率 = 时钟频率 / (分频系数 × 过采样倍数)
以STM32为例:
- USART挂在APB总线上(假设APB时钟=84MHz)
- 过采样16倍:
BRR = APB_CLK / (16 × BaudRate) - 如115200波特率:
BRR = 84000000 / (16 × 115200) = 45.57 - 取整为45,实际波特率 =
84000000 / (16×45) = 116667 - 误差 =
(116667-115200)/115200 ≈ 1.27%(在±3%以内,可用)
关键:误差不超过±3%,否则会出现乱码。高波特率时误差更容易超标。
使用的3种电平的区别:
USART:
这里的s意思是sunchronous,增加了同步的功能