前注:本文章主要讲解【原理】【固件库(标准库)】【HAL库】
内容为 'Jojo'编写,日常学习总结,内容如有不足、不妥之处请私信告知,谢谢!
A.硬件原理
一、通信理论知识
串行/并行通信
按数据传送的方式,通讯可分为串行通讯与并行通讯。
串行通讯就像单个车道的公路,同一时刻只能传输 一个数据位的数据。
并行通讯就像多个车道的公路,可以同时传输多个数据位的数据。
特性对比
传输方向
根据串行通信数据传输的方向,可将串行通信方式分为:单
工方式、半双工
方式和全双工方式
。
单工
方式指数据传输仅能沿着一个方向,不能反向传输。
半双工
指的是数据传输可以沿着两个方向, 但是不能同时发送,这就表示 发送/
接收 是有先后顺序的。
全双工
指的是可以同时进行双向传输。全双工和半双工通信的本质区别是半双工通信双方只共用一条线路实现双向通信,但是全双工却利用两条线路,一条作发送数据用,另一条作接收数据用。
同步通讯与异步通讯
根据传输方式的不同,可以分为同步通信和异步通信
在同步通讯中,收发设备双方会使用一根信号线表示时钟信号,在时钟信号的驱动下双方进行协调,同步数据,
通讯中通常
双方会统一规定在时钟信号的上升沿或下降沿对数据线进行采样(时钟线)
。
在异步通讯中不使用时钟信号进行数据同步,它们直接在数据信号中穿插一些同步用的信号位,或者把主体数据进行打包,以数据帧的格式传输数据,某些通讯中还
需要双方约定数据的传输速率(波特率)
,以便更好地同步。
串口电平
串口连接和时序
- 波特率:一般选波特率都会有9600,19200,115200等选项。其实意思就是每秒传输这么多个比特位数 (bit);
- 起始位:先发出一个逻辑”0”的信号,表示传输数据的开始;
- 数据位:可以是5~8位逻辑”0”或”1”,先传输bit 0,在传输bit 1,依次类推;
- 校验位:数据位加上这一位后,使得“1”的位数应为偶数(偶校验)或奇数(奇校验),以此来校验数据传送的正确性。校验位是可选的,可以不传输;
- 停止位:它是一个字符数据的结束标志,数据线变回逻辑”1”;
二、串口
STM32F103
系列最多有
3
个通用同步异步收发器(usart),2个通用异步收发器(uart)。USART和UART的主要区别在于,USART支持同步通信,该模
式有一根时钟线提供时钟。
串口在嵌入式中经常使用,一般使用
UART
就足够了,常见的用途如下:
1.
作为调试口,打印程序运行的状态信息;
2.
连接串口接口的模块(比如
GPS
模块),传输数据;
3.
通过电平转换芯片变为
RS232/RS485
电平,连接工控设备;
STM32功能支持图

框图
1. ①功能引脚
- TX:发送数据输出引脚。
- RX:接收数据输入引脚。
- SW_RX:数据接收引脚,只用于单线和智能卡模式,属于内部引脚,没有具体外部引脚。
- nRTS:请求以发送(Request To Send),n 表示低电平有效。如果使能 RTS 流控制,当USART接收器准备好接收新数据时就会将 nRTS 变成低电平;当接收寄存器已满时, nRTS 将被设置为高电平。该引脚只适用于硬件流控制。
- nCTS:清除以发送(Clear To Send),n 表示低电平有效。如果使能 CTS 流控制,发送器在发送下一帧数据之前会检测 nCTS 引脚,如果为低电平,表示可以发送数据,如果为高电平则在发送完当前数据帧之后停止发送。该引脚只适用于硬件流控制。
- SCLK:发送器时钟输出引脚。这个引脚仅适用于同步模式。
USART1
最大频率为
72MHz
,其他四个最大频率为 36MHz
。
UART
只是异步传输功能,所以没有
SCLK
、
nCTS
和
nRTS
功能引脚
2. ②数据寄存器
USART
数据寄存器
(USART_DR)
只有低
9
位有效,并且第
9
位数据是否有效要取决于USART 控制寄存器
1(USART_CR1)
的
M
位设置,当
M
位为
0
时表示
8
位数据字长,当
M位为 1
表示
9
位数据字长,我们一般使用
8
位数据字长。

USART_DR
包含了已发送的数据或者接收到的数据。
USART_DR
实际是包含了两个寄存器,一个专门用于发送的可写 TDR
,一个专门用于接收的可读
RDR
。当进行发送操作时,往USART_DR
写入数据会自动存储在
TDR
内;当进行读取操作时,向
USART_DR 读取数据会自动提取 RDR
数据。
TDR
和
RDR
都是介于系统总线和移位寄存器之间。串行通信是一个位一个位传输的,发送时把 TDR
内容转移到发送移位寄存器,然后把移位寄存器数据每一位发送出去,接收时把接收到的每一位顺序保存在接收移位寄存器内然后才转移到 RDR。
USART_DR
寄存器包含了一个内部总线和发送移位寄存器之间的缓冲器。


3. ③控制器
USART 有专门控制发送的发送器、控制接收的接收器,还有唤醒单元、中断控制等等。
使用
USART
之前需要向
USART_CR1 寄存器的 UE 位置 1 使能 USART
,
UE
位用来开启
供给给串口的时钟。发送或者接收数据字长可选
8
位或
9
位,由
USART_CR1
的
M
位控制。

发送器(搭配手册发送器篇一起看 效果更佳)

当 USART_CR1
寄存器的发送使能位
TE
置
1
时,启动数据发送,发送移位寄存器的
数据会在
TX
引脚输出,
低位在前,高位在后
。如果
是同步模式 SCLK 也输出时钟信号
。

1 .在数据传输期间不能复位 TE 位,否则将破坏 TX 脚上的数据,因为波特率计数器停止计数。 正在传输的当前数据将丢失。2 . TE 位被激活后将发送一个空闲帧。
一个字符帧发送需要三个部分:起始位+
数据帧
+
停止位。起始位是
一个位周期的低电
平
,位周期就是每一位占用的时间;数据帧就是我们要发送的
8
位或
9
位数据,数据是从
最低位开始传输
的;停止位是一定时间周期的高电平。
停止位时间长短是可以通过 USART
控制寄存器
2(USART_CR2)
的
STOP[1:0]
位控制, 可选 0.5
个、
1
个、
1.5
个和 2 个停止位。
1 个停止位 |
停止位位数的默认值
|
2 个停止位 |
可用于常规
USART
模式、单线模式以及调制解调器模式。
|
0.5 个停止位 | 在智能卡模式下接收数据时使用。 |
1.5
个停止位
|
在智能卡模式下发送和接收数据时使用。
|
当发送使能位
TE
置
1
之后,发送器开始会先发送
一个空闲帧(一个数据帧长度的高电
平)
,接下来就可以往
USART_DR
寄存器写入要发送的数据。在写入最后一个数据后,需
要等待
USART
状态寄存器
(USART_SR)
的
TC
位为
1
,表示数据传输完成,如果
USART_CR1
寄存器的
TCIE 位置 1
,将产生中断。

接收器

如果将
USART_CR1
寄存器的
RE 位置 1
,
使能 USART 接收
,使得接收器在
RX
线开
始搜索起始位。在确定到起始位后就根据
RX
线电平状态把数据存放在接收移位寄存器内。
接收完成后就把接收移位寄存器数据移到 RDR 内,并把 USART_SR 寄存器的 RXNE 位置 1,同时如果 USART_CR1 寄存器的 RXNEIE 置 1 的话可以产生中断。
4. ④小数波特率生成
接收器和发送器的波特率在
USARTDIV
的整数和小数寄存器中的值应设置成相同。

其中,
f
PLCK
为
USART
时钟,
USARTDIV
是一个存放在波特率寄存器
(USART_BRR)
的 一个 无符号定点数。 其中
DIV_Mantissa[11:0] 位 定义 USARTDIV 的 整数 部分 ,
DIV_Fraction[3:0]位定义 USARTDIV 的小数部分。

假设所需波特率为
115200
,当前
USART
时钟为
72MHz
,则
USARTDIV=72000000/(115200*16)=39.0625
。
USART_BRR
寄存器使用高
12
位
[15:4]
存放整数部分,低
4
位
[3:0]
存放小数部分,小数部分每一位对应 1/2的4次方
=0.0625(0.625*2的4次方=1)
。因此,整数
39
对应
16
进制为
0x27
,左移
4
位为
0x270
,小数
0.0625
,对应
0x1
,
USART_BRR=0x271 即可。
只有USART1的波特率计算中的
能取最大系统时钟72MHz,其它的
USART/UART
只能取
36MHz
。

波特率的常用值有 2400、9600、19200、115200。
小数x16就是寄存器的值
5. 校验控制
STM32F103 系列控制器
USART
支持奇偶校验。当使用校验位时,串口传输的长度将
是
8
位的数据帧加上
1
位的校验位总共
9
位,此时
USART_CR1
寄存器的
M
位需要设置为
1
,即
9
数据位。将
U
SART_CR1 寄存器的 PCE 位置 1 就可以启动奇偶校验控制
,奇偶校
验由硬件自动完成。启动了奇偶校验控制之后,在发送数据帧时会自动添加校验位,接收
数据时自动验证校验位。接收数据时如果出现奇偶校验位验证失败,会见
USART_SR
寄存
器的
PE 位置 1,并可以产生奇偶校验中断
。
使能了奇偶校验控制后,每个字符帧的格式将变成:起始位+
数据帧
+
校验位
+
停止位。

6. 中断控制
B.固件库
结构体
涉及文件stm32f10x_usart.h,stm32f10x_usart.c,stm32f10x.h
USART 寄存器结构体
typedef struct
{
__IO uint16_t SR; //状态寄存器
uint16_t RESERVED0; //保留0
__IO uint16_t DR; //数据寄存器
uint16_t RESERVED1; //保留1
__IO uint16_t BRR; //波特比率寄存器
uint16_t RESERVED2; //保留2
__IO uint16_t CR1; //控制寄存器1
uint16_t RESERVED3; //保留3
__IO uint16_t CR2; //控制寄存器2
uint16_t RESERVED4; //保留4
__IO uint16_t CR3; //控制寄存器3
uint16_t RESERVED5; //保留5
__IO uint16_t GTPR; //保护时间和预分频寄存器
uint16_t RESERVED6; //保留6
} USART_TypeDef;
USART 初始化结构体
1 typedef struct {
2 uint32_t USART_BaudRate; // 波特率
3 uint16_t USART_WordLength; // 字长
4 uint16_t USART_StopBits; // 停止位
5 uint16_t USART_Parity; // 校验位
6 uint16_t USART_Mode; // USART 模式
7 uint16_t USART_HardwareFlowControl; // 硬件流控制
8 } USART_InitTypeDef;
1) USART_BaudRate
:波特率设置。一般设置为
2400
、
9600
、
19200
、
115200
。标准
库函数会根据设定值计算得到
USARTDIV
值,从而设置
USART_BRR
寄存器值。
2) USART_WordLength
:数据帧字长,可选
8
位或
9
位。它设定
USART_CR1
寄存
器的
M
位的值。如果没有使能奇偶校验控制,一般使用
8
数据位;如果使能了奇
偶校验则一般设置为
9
数据位。
3) USART_StopBits
:停止位设置,可选
0.5
个、
1
个、
1.5
个和
2
个停止位,它设定
USART_CR2
寄存器的
STOP[1:0]
位的值,一般我们选择
1
个停止位。
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
、⑷不使能硬件流。
USART 时钟初始化结构体
typedef struct {
2 uint16_t USART_Clock; // 时钟使能控制
3 uint16_t USART_CPOL; // 时钟极性
4 uint16_t USART_CPHA; // 时钟相位
5 uint16_t USART_LastBit; // 最尾位时钟脉冲
6 } USART_ClockInitTypeDef;
- USART_Clock:同步模式下 SCLK 引脚上时钟输出使能控制,可选禁止时钟输出(USART_Clock_Disable)或开启时钟输出(USART_Clock_Enable);如果使用同步模式发送,一般都需要开启时钟。它设定 USART_CR2 寄存器的 CLKEN 位的值。
- USART_CPOL:同步模式下 SCLK 引脚上输出时钟极性设置,可设置在空闲时SCLK 引脚为低电平(USART_CPOL_Low)或高电平(USART_CPOL_High)。它设定 USART_CR2 寄存器的 CPOL 位的值。
- USART_CPHA:同步模式下 SCLK 引脚上输出时钟相位设置,可设置在时钟第一个变化沿捕获数据(USART_CPHA_1Edge)或在时钟第二个变化沿捕获数据。它设定 USART_CR2 寄存器的 CPHA 位的值。USART_CPHA 与 USART_CPOL 配合使用可以获得多种模式时钟关系。
- USART_LastBit:选择在发送最后一个数据位的时候时钟脉冲是否在 SCLK 引脚输 出 , 可以 是 不 输 出 脉 冲 (USART_LastBit_Disable) 、 输 出 脉 冲(USART_LastBit_Enable)。它设定 USART_CR2 寄存器的 LBCL 位的值。