一、介绍
USART是英文Universal Synchronous Asynchronous Receiver and Transmitter的缩写,意思为通用同步异步收发器。USART是一个串行通信协议,可以灵活地与外部设备进行全双工数据交换。在单片机中见到比较相似的是SART,英文全名是Universal Asynchronous Receiver and Transmitter,它是在 USART 基础上裁剪掉了同步通信功能,只有异步通信,在这里就不详细说了,这里主要说USART,感兴趣的可以查阅相关资料。
USART 满足外部设备对工业标准 NRZ 异步串行数据格式的要求,并且使用了小数波特率发生 器,可以提供多种波特率,使得它的应用更加广泛。USART 支持同步单向通信和半双工单线通 信;还支持局域互连网络 LIN、智能卡 (SmartCard) 协议与 lrDA(红外线数据协会) SIR ENDEC 规 范。同时USART 支持使用 DMA,可实现高速数据通信,DMA的介绍请查阅相关资料。
二、功能框图以及框图解说
1、外部引脚说明
TX:发送数据输出引脚。
RX:接收数据输入引脚。
SW_RX:数据接收引脚,只用于单线和智能卡模式,属于内部引脚,没有具体外部引脚。
nRTS:请求以发送
(Request To Send)
,
n
表示低电平有效。如果使能
RTS
流控制,当
USART
接 收器准备好接收新数据时就会将 nRTS
变成低电平;当接收寄存器已满时,
nRTS
将被设置为高 电平。该引脚只适用于硬件流控制。
nCTS:清除以发送
(Clear To Send)
,
n
表示低电平有效。如果使能
CTS
流控制,发送器在发送下 一帧数据之前会检测 nCTS
引脚,如果为低电平,表示可以发送数据,如果为高电平则在发送完 当前数据帧之后停止发送。该引脚只适用于硬件流控制。
SCLK:发送器时钟输出引脚。这个引脚仅适用于同步模式。
2、数据的寄存器说明(USART_DR)
![](https://img-blog.csdnimg.cn/direct/ede81a16d5834ce6991ab0fd8cee76d9.png)
它是由两个寄存器组成的,一个给发送用(TDR)
,一个给接收 用(RDR)
,该寄存器兼具读和写的功能。
TDR
寄存器提供了内部总线和输出移位寄存器之间的 并行接口(
参见功能框图
)
。
RDR
寄存器提供了输入移位寄存器和内部总线之间的并行接口。
3、控制器
USART 有专门控制发送的发送器、控制接收的接收器,还有唤醒单元、中断控制等等。使用
USART
之前需要向
USART_CR1
寄存器的
UE
位置
1
使能
USART
,
UE
位用来开启供给给串口
的时钟。 发送或者接收数据字长可选 8
位或
9
位,由
USART_CR1
的
M
位控制。
4、发送器
当 USART_CR1
寄存器的发送使能位
TE
置
1
时,启动数据发送,发送移位寄存器的数据会在
TX 引脚输出,低位在前,高位在后。如果是同步模式 SCLK 也输出时钟信号。一个字符帧发送需要三个部分:起始位
+ 数据帧 + 结束位。起始位:是一个低电平,结束位:USART
支持多种停止位的配置:
0.5
、
1
、
1.5
和
2
个停止位,通过 USART_CR2寄存器 的 STOP[1:0] 位控制,可选 0.5个、1 个、1.5 个和 2 个停止位。看图理解停止位的设置:
![](https://img-blog.csdnimg.cn/direct/661f9f4373474a66b72fec264954a4d8.png)
默认使用 1 个停止位。2 个停止位适用于正常 USART 模式、单线模式和调制解调器模式。0.5 个和 1.5 个停止位用于智能卡模式。
数据帧,它有不同的字长,详细请看图:
![](https://img-blog.csdnimg.cn/direct/2bb68e85ec9846ddabdb1a47933bf9c6.png)
发送器的其他重要标志
![](https://img-blog.csdnimg.cn/direct/6b51049ade104dfab24673c5a35465dc.png)
5、接收器
将 USART_CR1
寄存器的
RE
位置
1
,使能
USART
接收,使得接收器在
RX
线开始搜索
起始位。在确定到起始位后就根据
RX
线电平状态把数据存放在接收移位寄存器内。接收完成
后就把接收移位寄存器数据移到
RDR
内,并把
USART_SR
寄存器的
RXNE
位置
1
,同时如果
USART_CR2
寄存器的
RXNEIE
置
1
的话可以产生中断。接收器的重要标志:
![](https://img-blog.csdnimg.cn/direct/71f4ae580599466d98afdbc418359ff7.png)
6、USART引脚在STMF103VET6上的分布
![](https://img-blog.csdnimg.cn/direct/687e6c20b0614c9b9acb6cfba9bc6d15.png)
7、
USART
的发送器和接收器使用相同的波特率。计算公式如下:
![](https://img-blog.csdnimg.cn/direct/c8a4a3c7dfb540b68ad71fba3985e8ac.png)
在公式中,f
PLCK
为表示
USART
时钟,
USARTDIV
是一个存放在波特率寄存器
(USART_BRR)
的一个无 符号定点数。其中 DIV_Mantissa[11:0]
位定义
USARTDIV
的整数部分
DIV_Fraction[3:0]
位定义USARTDIV 的小数部分。
三、校验控制
设置USART_CR1
寄存器上的
PCE
位,可以使能奇偶控制,
根据
M
位定义的帧长度,可能的
USART
帧格式列在下表中:
![](https://img-blog.csdnimg.cn/direct/debf8b93580d4ebb88517418f72b0d16.png)
偶校验:校验位使得一帧中的
7
或
8
个
LSB
数据以及校验位中
’1’
的个数为偶数。
奇校验:此校验位使得一帧中的
7
或
8
个
LSB
数据以及校验位中
’1’
的个数为奇数。
四、USART的中断请求请见表格
![](https://img-blog.csdnimg.cn/direct/095cfdb803264a318dfdad49838ab613.png)
五、USART初始化结构体
typedef struct {
uint32_t USART_BaudRate; // 波特率
uint16_t USART_WordLength; // 字长
uint16_t USART_StopBits; // 停止位
uint16_t USART_Parity; // 校验位
uint16_t USART_Mode; // USART 模式
uint16_t USART_HardwareFlowControl; // 硬件流控制
} USART_InitTypeDef;
(1) USART_BaudRate:波特率设置。一般设置为
2400
、
9600
、
19200
、
115200
。标准库函数会根据 设定值计算得到 USARTDIV
值,从而设置
USART_BRR
寄存器值。
(2) USART_WordLength:设置数据帧的长度8或9
。它由
USART_CR1
寄存器的
M
位的值来决定。
(3) USART_StopBits:停止位设置,可选
0.5
个、
1
个、
1.5
个和
2
个停止。它由
USART_CR2 寄存器的 STOP[1:0]
位的值来决定。
(4) USART_Parity:奇偶校验控制选择,可选
USART_Parity_No(
无校验
)
、
USART_Parity_Even(
偶 校验)
以及
USART_Parity_Odd(
奇校验
)
,它设定
USART_CR1
寄存器的
PCE
位和
PS
位的值。
( 5) USART_Mode:
USART
模式选择,有
USART_Mode_Rx
和
USART_Mode_Tx
,允许使用逻辑或 运算选择两个,它设定 USART_CR1
寄存器的
RE
位和
TE
位。
(6) USART_HardwareFlowControl:硬件流控制选择,只有在硬件流控制模式才有效,可选有使能 RTS、使能
CTS
、同时使能
RTS
和
CTS
、不使能硬件流。 当使用同步模式时需要配置 SCLK
引脚输出脉冲的属性,标准库使用一个时钟初始化结构体 USART_ClockInitTypeDef 来设置,该结构体内容也只有在同步模式才需要设置。
六、USART时钟初始化结构体
typedef struct {
uint16_t USART_Clock; // 时钟使能控制
uint16_t USART_CPOL; // 时钟极性
uint16_t USART_CPHA; // 时钟相位
uint16_t USART_LastBit; // 最尾位时钟脉冲
} USART_ClockInitTypeDef;