当前位置: 首页 > news >正文

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 MCUTTL(3.3V)直接输出 TX/RX 信号
USB-TTL模块TTL把 USB 转换成 3.3V/5V UART 电平
电脑串口(COM)RS232电平高低反向,且电压高(±12V)

  • TTL 电平不能直接接 RS232 电平设备,否则可能烧毁;

  • TTL 通常是 3.3V5V,要匹配 MCU 的供电;

  • 常见的 USB 转串口芯片(如 CH340、CP2102、FT232)很多都是 TTL 电平输出。

2.RS232和RS485的区别

1. 通信方式
特性RS-232RS-485
通信方式单端通信(单线)差分通信(双线)
线数最少3线(TXD, RXD, GND)最少2线(A, B)
通信方向点对点(1对1)多点总线(1对N,最多32个节点)
 2. 信号特性
特性RS-232RS-485
电平定义逻辑1: -3V ~ -15V
逻辑0: +3V ~ +15V
A-B > +200mV:逻辑1
A-B < -200mV:逻辑0
接口类型单端电平,容易受干扰差分信号,抗干扰强
驱动能力驱动一个接收端驱动多达 32 个接收器
接收灵敏度对地参考,容易受地电位差影响对差分信号敏感,地电位差影响小
3. 通信距离和速率 
特性RS-232RS-485
典型最大距离15 米以内(19200 bps)1200 米(低速,100 kbps以下)
典型速率最高 115200 bps可达 10 Mbps(短距离)
 4. 适用场景
应用场景RS-232RS-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指定哪个串口,比如 USART1USART2
USART_IT指定要配置的中断类型,常见的如下(下表有说明)
NewState使能或禁止中断:ENABLEDISABLE

宏定义含义
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_RXNEUSART_IT_RXNE
TXE 中断USART_FLAG_TXEUSART_IT_TXE
溢出错误中断USART_FLAG_OREUSART_IT_ERR
帧错误中断USART_FLAG_FEUSART_IT_ERR
噪声错误中断USART_FLAG_NEUSART_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


http://www.mrgr.cn/news/98784.html

相关文章:

  • OpenHarmony Camera开发指导(五):相机预览功能(ArkTS)
  • Ubuntu20.04配置cartographer记录
  • 【问题】一招解决vscode输出和终端不一致的困扰
  • 十二种存储器综合对比——《器件手册--存储器》
  • MATLAB 控制系统设计与仿真 - 34
  • Java虚拟机(JVM)平台无关?相关?
  • 22、字节与字符的概念以及二者有什么区别?
  • 《Java 并发编程实践》阅读笔记(一):线程重要性
  • 【教学类-102-13】蝴蝶外轮廓03——Python三色图修图代码+制作230灰度的蝴蝶描线图(可以改变描边线条的灰色深浅度)
  • C++编译与链接:从源码到可执行文件的魔法之旅(Visual Studio实践)
  • android如何在生产环境中做到详实的日志收集而不影响性能?
  • 线性回归 (Linear Regression) 多项式回归 (Polynomial Regression)
  • Qt GUI 库总结
  • 批量上传OpenStack镜像
  • 鬼泣:远程攻击
  • MCP理解笔记及deepseek使用MCP案例介绍
  • 关于C语言的模拟物理模型
  • 12孔AG调陶笛音域全解析:从E4到C6的演奏艺术
  • 在高数据速度下确保信号完整性的 10 个关键策略
  • 林纳斯·托瓦兹:Linux系统之父 Git创始人