【STM32笔记4】UART的时序解读与硬件运用(即硬件UART的实现,另有硬件UART运用和软件UART运用/硬件串口和软件串口/USART的差异说明)

一、UART简介

1、UART(Universal Asynchronous Receiver Transmitter)总线是异步串口,故一般比I2C、SPI两种同步串口的结构要复杂很多,该总线双向通信,是一种通用串行数据总线,可以实现全双工传输和接收。一般由波特率产生器(产生的波特率等于传输波特率的16倍)、UART接收器UART发送器组成,硬件上由两根线,一根用于发送(TX),一根用于接收(RX);

2、引脚连接方式(参考下图)

【STM32笔记4】UART的时序解读与硬件运用(即硬件UART的实现,另有硬件UART运用和软件UART运用/硬件串口和软件串口/USART的差异说明)_第1张图片

3、STM32F1中UART引脚的分配(参考下图)

【STM32笔记4】UART的时序解读与硬件运用(即硬件UART的实现,另有硬件UART运用和软件UART运用/硬件串口和软件串口/USART的差异说明)_第2张图片

 4、UART通信过程(参考下图)

 

5、UART通信时需要配置参数的定义(起始位、数据位、奇偶校验位、停止位、波特率) 

(1)起始位:它是单个包的第一位,用来表示数据传送的开始。在通信线上没有数据传送时处于逻辑“1”状态。当发送设备发送一个字符数据时,首先发出一个逻辑“0”信号,这个逻辑低电平就是起始位。起始位通过通信线传向接收设备,当接收设备检测到这个逻辑低电平后,就开始准备接收数据信号。

(2)数据位 :它是用来衡量通信中实际数据位的。当计算机发送一个信息包,实际的数据不会是8位的,标准的值是5、7和8位。如何设置取决于你想传送的信息。比如,标准的ASCII码是0~127(7位)。扩展的ASCII码是0~255(8位)。如果数据使用简单的文本(标准 ASCII码),那么每个数据包使用7位数据。每个包是指一个字节,包括开始/停止位,数据位和奇偶校验位。由于实际数据位取决于通信协议的选取,术语“包”指任何通信的情况。

(3)奇偶校验位:它是串口通信中一种简单的检错方式。有四种检错方式:偶、奇、高和低。当然没有校验位也是可以的。对于偶和奇校验的情况,串口会设置校验位(数据位后面的一位),用一个值确保传输的数据有偶个或者奇个逻辑高位。例如,如果数据是011,那么对于偶校验,校验位为0,保证逻辑高的位数是偶数个。如果是奇校验,校验位位1,这样就有3个逻辑高位。高位和低位不真正的检查数据,简单置位逻辑高或者逻辑低校验。这样使得接收设备能够知道一个位的状态,有机会判断是否有噪声干扰了通信或者是否传输和接收数据是否不同步。

(4)停止位:它是单个包的最后一位,用来表示数据传送的结束。典型的值为1,1.5和2位。由于数据是在传输线上定时的,并且每一个设备有其自己的时钟,很可能在通信中两台设备间出现了小小的不同步。因此停止位不仅仅是表示传输的结束,并且提供计算机校正时钟同步的机会。适用于停止位的位数越多,不同时钟同步的容忍程度越大,但是数据传输率同时也越慢。

(5)波特率:它是用来衡量通信速度的。它表示每秒钟传送的bit的个数。例如300波特表示每秒钟发送300个bit。当我们提到时钟周期时,我们就是指波特率例如如果协议需要4800波特率,那么时钟是4800Hz。这意味着串口通信在数据线上的采样率为4800Hz。通常电话线的波特率为14400,28800和36600。波特率可以远远大于这些值,但是波特率和距离成反比。高波特率常常用于放置的很近的仪器间的通信,典型的例子就是GPIB(通用接口总线)设备的通信。 

数据传输时参数运用参考如下:

【STM32笔记4】UART的时序解读与硬件运用(即硬件UART的实现,另有硬件UART运用和软件UART运用/硬件串口和软件串口/USART的差异说明)_第3张图片

 二、UART总线数据传输时的总时序图

【STM32笔记4】UART的时序解读与硬件运用(即硬件UART的实现,另有硬件UART运用和软件UART运用/硬件串口和软件串口/USART的差异说明)_第4张图片

时序解读:

UART 首先将接收到的并行数据转换成串行数据来传输。消息帧从一个低位起始位开始,后面是7个或8个数据位(是在已带奇偶校验位/停止位的数据字中去掉校验位/停止位后的有效数据位个数,可参考下面的示意图进行理解) ,一个可用的奇偶位和一个或几个高位停止位(通常UART为1、1.5、2,USART还包含0.5)。接收器发现起始位时它就知道数据准备发送,并尝试与发送器时钟频率同步。如果选择了奇偶,UART就在数据位后面加上奇偶位。奇偶位可用来帮助错误校验。在接收过程中,UART 从消息帧中去掉起始位和结束位,对进来的字节进行奇偶校验,并将数据字节从串行转换成并行。
UART 也产生额外的信号来指示发送和接收的状态。例如,如果产生一个奇偶错误,UART 就置位奇偶标志。 

注:

数据字的长度(此处定义为有效数据位个数+奇偶校验位(1)+停止位(此处以1位为例))可以通过编程CR1寄存器中的M位,选择成8或9位,即USART接收器/发送器可以根据CR1的M位接收/发送8位或9位的数据字,参考如下图:

【STM32笔记4】UART的时序解读与硬件运用(即硬件UART的实现,另有硬件UART运用和软件UART运用/硬件串口和软件串口/USART的差异说明)_第5张图片

 下面以STM32FI的串口1为例,分别进行初始化(参数配置)、中断服务函数的运用(接收中断)、printf函数的运用,其代码实现参考如下三张图:

1、串口1的初始化

【STM32笔记4】UART的时序解读与硬件运用(即硬件UART的实现,另有硬件UART运用和软件UART运用/硬件串口和软件串口/USART的差异说明)_第6张图片

2、 串口1的中断服务函数

【STM32笔记4】UART的时序解读与硬件运用(即硬件UART的实现,另有硬件UART运用和软件UART运用/硬件串口和软件串口/USART的差异说明)_第7张图片

 3、串口1的printf()功能

【STM32笔记4】UART的时序解读与硬件运用(即硬件UART的实现,另有硬件UART运用和软件UART运用/硬件串口和软件串口/USART的差异说明)_第8张图片

另:

1、硬件UART运用和软件UART运用的区别如下(此为个人理解与总结):

(1)硬件UART运用:即在实现UART通讯功能时,直接采用芯片内部集成的UART相关硬件组件与电路,通过代码实现其通讯功能时,直接操作其寄存器或直接调用其现成IAP函数(已完成寄存器的操作与运用)即可,有助于加深开发者对芯片底层寄存器操作的理解和UART设备的硬件实现原理的理解。

(2)软件UART运用:即在实现UART通讯功能时,不直接采用芯片内部集成的UART相关硬件组件与电路,而是通过CPU对芯片自身空余的IO口操作而软件模拟实现其波特率的控制、接受器/发送器功能,从而实现时序功能,达到可与相应设备通信的目的,有助于开发者加深开发者对于IO模拟时序功能的运用和UART设备的数据输出输入时序的理解。

2、硬件串口与软件串口的区别如下:

(1)硬件串口: 一般说来是具有满足RS232或其他串口通讯连接协议的串口,这些协议不光是通讯协议,还有接口协议。硬件串口的特点就是,你连接这种设备时要用专用串口线连接设备和主控机。比如R232接口采用12V的电平信号互相传送信号。

(2)软件串口: 一般说来是在通讯协议上采用串口的设备,但在物理连接上,不一定遵从该串口的硬件协议。特点是可以用灵活的接口与现成的设备进行通讯。比如在USB线上模拟网络通讯,在USB线上模拟RS232串口。如许多现成的模块如GPRS,其接口都是串口的,但这个模块声明是5V的或3.3V的接口,那就不能直接接在通用串口上,而需要直接走TTL信号线与CPU连接,然后CPU运行一套串口通信协议即可轻松连接它们。

3、USART(Universal Synchronous/Asynchronous Receiver/Transmitter)是一个全双工通用同步/异步串行收发模块,该接口是一个高度灵活的串行通信设备。(和 UART 有区别,带有时钟驱动功能,故同步/异步通讯具有可选性) 

USART 收发模块一般分为三大部分:时钟发生器、数据发送器和接收器

控制寄存器为所有的模块共享。时钟发生器由同步逻辑电路(在同步从模式下由外部时钟输入驱动)和波特率发生器组成。发送时钟引脚 XCK 仅用于同步发送模式下,发送器部分由一个单独的写入缓冲器(发送 UDR)、一个串行移位寄存器、校验位发生器和用于处理不同浈结构的控制逻辑电路构成。使用写入缓冲器,实现了连续发送多浈数据无延时的通信。接收器是 USART 模块最复杂的部分,最主要的是时钟和数据接收单元。数据接收单元用作异步数据的接收。除了接收单元,接收器还包括校验位校验器、控制逻辑、移位寄存器和两级接收缓冲器(接收 UDR)。接收器支持与发送器相同的帧结构,同时支持帧错误、数据溢出和校验错误的检测。

附:此文为本人经STM32实战后总结所得,欢迎大家参考指点,谢谢。

 

 

 

 

 

你可能感兴趣的:(单片机,串行通信,嵌入式,嵌入式,stm32,uart,单片机,串口通信)