USART讲解
一、USART讲解
二、问题
1.TTL电平
信号 | 电压范围(典型) |
---|---|
逻辑高(1) | 2V ~ 5V(通常 ≥ 2V 视为高) |
逻辑低(0) | 0V ~ 0.8V |
在 STM32、Arduino 等微控制器中,GPIO 默认就是 TTL 电平兼容的。
在嵌入式串口通信中,经常看到:
-
TTL 串口:使用的是 TTL 电平(比如 3.3V 或 5V),直接连接到 MCU 的 USART 引脚。
-
RS232 串口:使用的是 RS232 电平(±12V 或 ±5V),不能直接接到 MCU,需要芯片转换。
设备类型 | 电平标准 | 描述 |
---|---|---|
STM32 MCU | TTL(3.3V) | 直接输出 TX/RX 信号 |
USB-TTL模块 | TTL | 把 USB 转换成 3.3V/5V UART 电平 |
电脑串口(COM) | RS232 | 电平高低反向,且电压高(±12V) |
-
TTL 电平不能直接接 RS232 电平设备,否则可能烧毁;
-
TTL 通常是 3.3V 或 5V,要匹配 MCU 的供电;
-
常见的 USB 转串口芯片(如 CH340、CP2102、FT232)很多都是 TTL 电平输出。
2.RS232和RS485的区别
1. 通信方式
特性 | RS-232 | RS-485 |
---|---|---|
通信方式 | 单端通信(单线) | 差分通信(双线) |
线数 | 最少3线(TXD, RXD, GND) | 最少2线(A, B) |
通信方向 | 点对点(1对1) | 多点总线(1对N,最多32个节点) |
2. 信号特性
特性 | RS-232 | RS-485 |
---|---|---|
电平定义 | 逻辑1: -3V ~ -15V 逻辑0: +3V ~ +15V | A-B > +200mV:逻辑1 A-B < -200mV:逻辑0 |
接口类型 | 单端电平,容易受干扰 | 差分信号,抗干扰强 |
驱动能力 | 驱动一个接收端 | 驱动多达 32 个接收器 |
接收灵敏度 | 对地参考,容易受地电位差影响 | 对差分信号敏感,地电位差影响小 |
3. 通信距离和速率
特性 | RS-232 | RS-485 |
---|
典型最大距离 | 15 米以内(19200 bps) | 1200 米(低速,100 kbps以下) |
典型速率 | 最高 115200 bps | 可达 10 Mbps(短距离) |
4. 适用场景
应用场景 | RS-232 | RS-485 |
---|
通常用于 | PC串口、调试接口、点对点设备通信 | 工业设备总线、MODBUS、楼宇控制系统 |
可靠性/工业级应用 | 较弱,适用于低干扰场景 | 抗干扰强,适合工业控制环境 |
多机通信 | 不支持 | 支持多点总线通信 |
RS-232 适合短距离、点对点通信;RS-485 适合远距离、多点、抗干扰要求高的工业通信。
5.工作方式
接口 | 是否全双工 | 是否支持半双工 |
---|---|---|
RS-232 | ✅ 是 | ❌ 否 |
RS-485 | 🔄 可选 | ✅ 是(默认) |
-
MCU 通常通过 UART 接口 + RS-232/RS-485 转换芯片 实现通信。
-
对于 RS-485 半双工通信,通常要控制一个 GPIO 用来切换收发方向(比如控制 MAX485 的 DE/RE 引脚(高电平发送,低电平接收))。当然如果硬件设计可以节省一个GPIO来控制收发方向。
5.USART_ITConfig函数
用来使能或失能 USART 中断源的函数。这个函数的作用是配置某个 USART 的中断类型(比如接收、发送完成、溢出等)是否启用。
void USART_ITConfig(USART_TypeDef* USARTx, uint16_t USART_IT, FunctionalState NewState);
参数 | 含义 |
---|---|
USARTx | 指定哪个串口,比如 USART1 、USART2 |
USART_IT | 指定要配置的中断类型,常见的如下(下表有说明) |
NewState | 使能或禁止中断:ENABLE 或 DISABLE |
宏定义 | 含义 |
---|---|
USART_IT_TXE | 发送数据寄存器空(发送中断) |
USART_IT_TC | 发送完成中断 |
USART_IT_RXNE | 接收缓冲非空(接收中断) |
USART_IT_IDLE | 空闲中断 |
USART_IT_PE | 奇偶校验错误中断 |
USART_IT_ERR | 错误中断(帧错误、噪声、过载) |
USART_IT_ORE | 溢出错误中断 |
USART_x的中断通道会统一处理 USART 所有可能的中断源。
中断类型 | 中断标志位 | 中断使能位 |
---|
RXNE 中断 | USART_FLAG_RXNE | USART_IT_RXNE |
TXE 中断 | USART_FLAG_TXE | USART_IT_TXE |
溢出错误中断 | USART_FLAG_ORE | USART_IT_ERR |
帧错误中断 | USART_FLAG_FE | USART_IT_ERR |
噪声错误中断 | USART_FLAG_NE | USART_IT_ERR |
所以需要在中断处理函数中调用USART_GetITStatus这个函数来识别是哪一个中断。
void USART1_IRQHandler(void){OSIntEnter();if(USART_GetFlagStatus(USART1,USART_FLAG_ORE)) //先判断是否溢出{USART2->ICR |= 1 << 3; //读SRUSART_ReceiveData(USART1); //读DR}if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) {USART_ClearITPendingBit(USART2,USART_IT_RXNE);uint8_t ch = USART_ReceiveData(USART1);if (_Usart_Rx_Index < sizeof(_Usart_Rx_Buf)) {_Usart_Rx_Buf[_Usart_Rx_Index++] = ch;}}OSIntExit();
}
注意:USART_ITConfig 并不会自动清除标志位,要在中断处理函数中手动清除。
-
溢出错误不会自动清除,需要先读取
SR
再读取DR
才能清除。 -
如果不处理,会导致接收中断卡死,数据接收中断不再触发。
-
RXNE 与 ORE 是并发可能出现的,中断时必须依次检查所有可能的标志。
-
如果没有处理 ORE,RXNE 的中断可能后续无法再触发!
-
中断中先判断并清 ORE,再读 RXNE。