STM32下UART协议的一些认识与使用方法
- 串口定义
- 通用串行异步收发器
- 协议中相关的概念
- 空闲位
- 起始位
- 数据位
- 奇偶校验位
- 三种校验方式
- BT接收数据的流程
- 停止位
- 波特率
- 总结
- UART的三种工作方式
- UART控制器
- 发送数据流程
- 接收数据流程
- UART初始化
- UART相关结构体和库函数
串口定义
通用串行异步收发器
• 通用:UART的应用非常广泛,应用领域:工控行业,电力系统等
• 串行:处理器和外设之间只需连接一根信号线,处理器和外设数据传输是一个bit位一个bit位的传输
○ 切记:UART数据传输从低位开始传输
○ 例如:处理器给BT发送数据0x95(1001 0101)
最终处理器和BT之间的信号线的时序(高低电平序列):
高->低->高->低->高->低->低->高
1 0 1 0 1 0 0 1
• 并行:处理器和外设之间数据传输会连接多根数据线(8/16/32), 一次可以传输多个字节
• 串行和并行对比:
□ 传输速度:一般来说,并行要快于串行
□ 抗干扰:串行优于并行
□ 传输距离:串行优于并行
• 异步:数据以独立的字节形式传输,每个字节都被单独同步。发送方和接收方必须事先约定好数据速率
(波特率)、数据位、停止位和奇偶校验位等参数,以确保数据能被正确解析。
• 收发器:发送数据和接收数据的硬件单元
如果CPU给外设发送数据:CPU是发送器,外设是接收器
如果外设给CPU发送数据:外设是发送器,CPU是接收器
问:何为数据同步呢?
答:处理器和外设的数据传输必须在同一个步调上,保证双方数据传输无误,不能出现数据丢失现象
例如:CPU给BT外设发送1,2,CPU发送完1之后,BT只有将1接收完毕,CPU才能发送数据2
问:何为异步呢?
答:“异步”是指在数据传输时,发送方和接收方没有统一的时钟信号来同步数据。
在异步通信中,每个数据字节(通常是8位)前面会加上一个起始位,后面加上一个或多个停止位,
有时还会加上奇偶校验位。这种方式允许接收方在接收到每个字节的起始位时重新同步。
因此,即便是在没有共享时钟信号的情况下,接收方也能准确地捕获发送方发出的每个字节。
问:何为同步呢?
答:说明处理器和外设之间不仅仅需要数据线(顾名思义用来传输数据的信号线)
还需要连接一根时钟控制信号线,此信号线用于双方的数据同步,此方式就是同步方式
简单来说就四个字:低放高取
协议中相关的概念
空闲位
处理器和外设不进行数据传输时,数据线上持续发送空闲位,空闲位的有效位数为一个 bit位, 高电平有效
起始位
如果处理器和外设开始传输数据,首先传输起始位,有效位数为一个bit位,低电平有效
数据位
表示处理器和外设传输数据的有效位数,数据位的有效位数:5/6/7/8,一般选择8位(表示传输的数据有效位数为8个bit位)
注意:处理器和外设数据位保持一致
奇偶校验位
用于检测双方数据传输是否发生了错误,有效位数为一个bit位,如果不校验,则无需发送校验位
注意:双方的校验方式保持一致
三种校验方式
- 奇校验(odd)
- 偶校验(even)
- 不校验(None)
例如:处理器给BT发送数据0x95(1001 0101),采用奇校验方式
处理器发送数据流程:
首先处理器将0x95通过一根数据线发给bt
然后处理器计算0x95中"1"的个数,为4个,而现在采用的是奇校验
所以处理器此时心里就明白将来要发送的校验位的值为1,因为:4+1=5(奇数)
最后处理器通过数据线再给BT发送一个校验位为1
BT接收数据的流程
首先BT从数据线上将处理器发送来的数据进行接收,0x95(1001 1010 假设传输无误)
然后BT计算0x95中"1"的个数为4,而BT也采用奇校验,所以BT心里明白待会儿处理器发送的校验位肯定是1
最后BT从数据线上将处理器发送来的校验位1进行接收然后判断:
a.如果确实是1,则数据传输无误
b.如果是0,说明数据传输出错了
停止位
如果处理器和外设要结束数据的传输,只需发送停止位即可,有效位数为:1/2
有效电平是高电平,注意:处理器和外设停止位保持一致
波特率
表示双方数据传输的速率,常用的两个波特率:115200bps/9600bps
(bps = bit per second = 每秒传输多少位)
注意:双方的配置也要一致
总结
UART数据传输的协议流程:
空闲位->起始位->数据位->(校验位)->停止位->空闲位
问:如果要传输2个字节或者2个字节以上的数据,流程应该是什么样呢?
答:空闲位->起始位->低字节的8位数据->(校验位)->停止位->
起始位->高字节的8位数据->(奇偶校验)->停止位...->空闲位
UART的三种工作方式
单工:数据传输永远朝一个方向
半双工:数据传输可以双向进行,但是同一时刻只能朝一个方向
全双工:数据传输可以同时双向进行,一般都是工作在全双工模式下
结论:UART实际硬件连接至少三根线:TX(发送),RX(接收),GND(共地)
UART控制器
发送数据流程
• 由于CPU核发送数据的速度,也就是向数据寄存器DR中写入数据的速度远远快于发送移位寄存器将数据
一位一位的发送到TX引脚上的速度,所以首先判断TC位是否为1,如果为1表示发送数据寄存器为空
则CPU方可发送数据,否则采用轮询方式等待,直到发送数据寄存器为空也就是TC为1时才能发送下一
个数据
• 如果TC为1,则CPU核软件上以指针或者采用库函数将数据放到数据寄存器DR中
• 发送数据寄存器的数据硬件上自动拷贝到发送移位器中
• 发送移位器根据给定的波特率将数据一位一位的按照UART协议发送到TX引脚上
接收数据流程
• 接收移位器首先根据给定的波特率将数据一位一位的按照UART协议从RX引脚上获取数据
• 接收移位寄存器中的数据硬件上自动拷贝到数据寄存器DR中
• 由于CPU核从数据寄存器DR中读取数据的速度远远快于接收移位器从RX引脚上一位一位接收数据的速度,
所以当RXNE为1时,CPU核方可从数据寄存器DR中获取数据,否则CPU核轮询等待,直到数据寄存器DR中有
数据也就是RXNE为1时CPU才能读取数据
• 如果RXNE为1,则CPU核软件上以指针或者采用库函数从数据寄存器DR中读取数据
UART初始化
使能串口时钟及GPIO端口时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //使能GPIOA时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//使能USART1时钟
GPIO端口模式设置,设置串口对应的引脚为复用功能
UART相关结构体和库函数
typedef struct
{
uint32_t USART_BaudRate; //波特率,例如:115200
uint16_t USART_WordLength; //字长
uint16_t USART_StopBits; //停止位
uint16_t USART_Parity; //校验位
uint16_t USART_Mode; //USART模式
uint16_t USART_HardwareFlowControl; //硬件流控制
} USART_InitTypeDef;