UART/USRAT协议

本文详细介绍了通用异步收发器(UART)的工作原理、数据帧格式及STM32串口配置流程。包括USART的硬件结构、STM32 USART的初始化步骤及中断服务函数实现。

UART

UART全称“通用异步收发器(Universal Asynchronous Receiver/Transmitter)”,是一种串行异步全双工的通信协议,工作原理就是将传输数据的每一个字符一位接一位的传输。

UART的数据帧格式

在这里插入图片描述

起始位:先发出一个逻辑”0”的信号,表示传输字符的开始。
数据位:紧接着起始位之后。数据位的个数可以是4、5、6、7、8等,构成一个字符。通常采用ASCII码。
奇偶校验位:数据位加上这一位后,使得“1”的位数应为偶数(偶校验)或奇数(奇校验),以此来校验数据传送的正确性。
停止位:它是一个字符数据的结束标志。可以是1位、1.5位、2位的高电平。
空闲位:处于逻辑“1”状态,表示当前线路上没有数据传送。
波特率:是衡量数据传送速率的指标。表示每秒钟传送的符号数(symbol)。常用的波特率有9600和115200.
波特率与比特率的区别:一个符号代表的信息量(比特数)与符号的阶数有关。例如传输使用256阶符号,每8bit代表一个符号,资料传送速率为120字符/秒,则波特率就是120baud,比特率是120*8=960bit/s。这两者的概念很容易搞错

USART的硬件结构

在这里插入图片描述输出缓冲寄存器:它接收CPU从数据总线上送来的并行数据,并加以保存。
输出移位寄存器:它接收从输出缓冲器送来的并行数据,以发送时钟的速率把数据逐位移出,即将并行数据转换为串行数据输出。
输入移位寄存器:它以接收时钟的速率把出现在串行数据输入线上的数据逐位移入,当数据装满后,并行送往输入缓冲寄存器,即将串行数据转换成并行数据。
输入缓冲寄存器,它从输入移位寄存器中接收并行数据,然后由CPU取走。
控制寄存器:它接收CPU送来的控制字,由控制字的内容,决定通信时的传输方式以及数据格式等。例如采用异步方式还是同步方式,数据字符的位数,有无奇偶校验,是奇校验还是偶校验,停止位的位数等参数。
状态寄存器:状态寄存器中存放着接口的各种状态信息,例如输出缓冲区是否空,输入字符是否准备好等。在通信过程中,当符合某种状态时,接口中的状态检测逻辑将状态寄存器的相应位置“1”,以便让CPU查询。

stm32串口配置步骤

1、初始化USART时钟
2、配置USRAT的引脚(TX:复用推挽输出;RX:浮空输入)
3、初始化USART结构体(设置波特率、模式、无硬件流控制、奇偶校验、停止位、字长)
4、使能USART
5、使能USART中断(设置中断优先级)
6、编写中断服务函数(判断中断类型,清中断标志位)
下面以stm32f103的USART1为例:
usart初始化函数

void Usart1_Init(u32 baud)
{
	GPIO_InitTypeDef GPIO_InitStruct;
	//开启io时钟和usart1时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_USART1,ENABLE);
	//配置PA9
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9;		//usart1_TX	PA9
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;//复用推挽输出
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_InitStruct);
	//配置PA10
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10;				//usart1_RX	PA10
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;	//浮空输入
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_InitStruct);
	//配置USART1
	USART_InitTypeDef USART1_InitStruct;
	USART1_InitStruct.USART_BaudRate = baud;
	USART1_InitStruct.USART_Mode = USART_Mode_Tx|USART_Mode_Rx;
	USART1_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
	USART1_InitStruct.USART_Parity = USART_Parity_No;
	USART1_InitStruct.USART_StopBits = USART_StopBits_1;
	USART1_InitStruct.USART_WordLength = USART_WordLength_8b;
	USART_Init(USART1,&USART1_InitStruct);
	//使能USART1
	USART_Cmd(USART1,ENABLE);
	//配置USART1中断,接收非空中断 和 空闲中断
	USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
	USART_ITConfig(USART1,USART_IT_IDLE,ENABLE);
	//设置中断分组,这个只用配置一次,以在主函数的while前执行,这里就注释了
//	NVIC_SetPriorityGrouping(NVIC_PriorityGroup_2);
	//设置中断优先级(抢占01,响应01)
	NVIC_SetPriority(USART1_IRQn,4);
	//开启中断
	NVIC_EnableIRQ(USART1_IRQn);
}

中断服务函数:

void USART1_IRQHandler(void)
{
	if(USART_GetITStatus(USART1,USART_IT_RXNE) == 1)
	{
		//清中断标志位
		USART_ClearITPendingBit(USART1,USART_IT_RXNE);
		//将接收到的数据放到u1_buff数组中
		u1_buff[u1_bufcnt++]= USART_ReceiveData(USART1);
	}
	if(USART_GetITStatus(USART1,USART_IT_IDLE) == 1)
	{
		USART1->DR;//清空闲中断标志比较特殊,需要读状态寄存器和数据寄存器来清
		u1_r_flag = 1;//一次数据接收完成标志
		u1_buff[u1_bufcnt] = '\0';
	}
}
<think>我们正在讨论TTL电平与UART/USART协议之间的关系及区别。根据引用内容,我们可以知道:1.TTL是一种电平标准(逻辑高电平通常为5V或3.3V,逻辑低电平为0V),用于表示数字信号[^2][^4]。2.UART(UniversalAsynchronousReceiver/Transmitter)是一种异步串行通信协议,它定义了数据格式(起始位、数据位、校验位、停止位)和传输时序,但不规定物理电平[^3]。3.USART(UniversalSynchronous/AsynchronousReceiver/Transmitter)则既可以支持异步模式(即UART模式)也可以支持同步模式(如需要时钟信号的SPI)[^3]。因此,UART/USART是通信协议,而TTL是物理层电平标准。它们之间的关系是:-UART协议可以通过不同的物理层电平来实现,比如TTL电平、RS232电平(±12V)或RS485差分电平。-当UART使用TTL电平时,我们通常称之为TTL串口。在这种配置下,逻辑1由高电平(如3.3V或5V)表示,逻辑0由低电平(0V)表示[^4]。在通信中:-UART协议负责将并行数据转换成串行比特流,并加入起始位、停止位等控制信息,以便在两根导线(TX和RX)上实现全双工通信。-TTL电平则负责将这些逻辑1和0转换成具体的电压信号,以便在电路板上的芯片之间进行短距离传输(通常在几米以内)[^1][^2]。区别总结:1.**性质不同**:TTL是电气特性(电压范围),UART/USART是通信协议(数据格式和时序)。2.**层级不同**:TTL属于物理层,UART/USART属于数据链路层(OSI模型)。3.**实现方式**:UART协议可以搭载在TTL电平上,也可以搭载在其他电平标准(如RS232)上。示例:-当两个单片机直接通过UART通信时,通常使用TTL电平,将一端的TX(发送端)连接到另一端的RX(接收端),共地(GND)即可[^1]。-如果要将数据通过RS232标准传输到较远距离(如15米),则需要在UART接口后添加RS232电平转换芯片(如MAX232),将TTL电平转换为±12V的RS232电平[^4]。因此,TTL电平和UART协议是构成串行通信的两个不同方面:协议定义如何组织数据,电平定义如何用电压表示这些数据。</think> ### TTL电平与UART/USART协议的关系与区别解析 #### **1. 基本概念定义** - **TTL电平**: - 是一种电压标准:逻辑"1"对应$+5V$(或$+3.3V$),逻辑"0"对应$0V$[^2][^4] - 物理层规范,仅定义电气特性 - 典型应用:芯片间短距离通信(通常≤1米) - 公式表达:$$ V_{logic} = \begin{cases} 5V/3.3V & \text{当 bit=1} \\ 0V & \text{当 bit=0} \end{cases} $$ - **UART/USART**: - **协议层规范**:定义数据传输格式(起始位+数据位+校验位+停止位)[^3] - 异步串行通信核心引擎(USART支持同步/异步双模式) - 工作方式:通过移位寄存器实现并/串转换 - 协议帧结构:$$ \boxed{\text{起始位}} + \boxed{\text{数据位(5-9)}} + \boxed{\text{校验位}} + \boxed{\text{停止位(1-2)}} $$ #### **2. 关系模型** ```mermaid graph TD A[UART/USART协议] -->|生成| B[逻辑数据流] B -->|通过| C[物理接口] C -->|TTL电平| D[电压信号传输] C -->|RS232电平| E[±12V信号] C -->|RS485| F[差分信号] ``` - **关键关系**: 1. **层级依赖**:UART协议需依赖物理层电平实现信号传输[^4] 2. **标准组合**:TTL+UART构成最常见嵌入式串口方案 3. **接口转换**: - UART+TTL → 板级通信(MCU与外设) - UART+RS232 → 长距通信(工业设备) - UART+RS485 → 总线通信(多节点) #### **3. 核心区别** | 特性 | TTL电平 | UART/USART协议 | |--------------|--------------------------|------------------------------| | **本质** | 电气规范(物理层) | 通信协议(数据链路层) | | **定义内容** | 电压阈值(0/1表示)[^4] | 数据帧结构与时序控制[^3] | | **独立性** | 可独立存在(如GPIO) | 必须搭载物理层接口 | | **传输距离** | 短距(板级)[^1] | 依赖物理层实现(可拓展) | | **典型应用** | 芯片引脚直连 | 串行数据流组织 | #### **4. 协同工作机制** 1. **发送端**: - UART引擎将并行数据封装为串行帧 - TTL驱动器将逻辑位转换为$+5V/0V$电压 $$ \text{UART帧} \xrightarrow{\text{TTL转换}} V_{out} = \begin{cases} 5V & \text{(bit=1)} \\ 0V & \text{(bit=0)} \end{cases} $$ 2. **接收端**: - TTL比较器将电压转换为逻辑位(阈值通常$1.5V$[^4]) - UART引擎解析帧结构恢复原始数据 $$ V_{in} \xrightarrow{\text{TTL判定}} \text{逻辑值} \xrightarrow{\text{UART解析}} \text{并行数据} $$ #### **5. 典型应用场景** - **嵌入式开发**:STM32 USART + TTL电平(3.3V)连接传感器[^1] - **调试接口**:USB-TTL转换器实现PC与开发板通信 - **协议扩展**:UART协议通过MAX485芯片转换为RS485总线 - **工业控制**:USART+RS232实现PLC与HMI通信(扩展至15米) > **关键结论**:TTL是电压“语言”,UART是数据“语法”,二者协同完成通信任务。没有UART协议,TTL只能传输离散电平;没有TTL支持,UART协议无法实现物理传输[^1][^4]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值