串口
STM32单片机提供了多个串口通信接口,包括USART(通用同步/异步收发器)和UART(通用异步收发器)。这些接口可以用于实现设备之间的异步通信。
Tx发出数据,由Rx接收数据,使用一对交叉导线完成数据传输。
串口数据格式
在串口通信中,数据格式是一个重要的概念,它定义了数据的组织方式和传输规则。对于STM32单片机来说,串口通信(无论是USART还是UART)的数据格式通常包括以下几个方面:
1. 数据位
数据位是指实际传输的数据的位数,可以是8位或9位。在STM32的串口配置中,可以选择数据位的长度。
2. 停止位
停止位用于标识一个数据包的结束。它可以是1位、1.5位或2位。停止位的选择取决于通信双方的约定。
3. 校验位
校验位用于检测数据传输中的错误。常见的校验方式有无校验(None)、奇校验(Odd)、偶校验(Even)等。STM32的串口配置中可以选择是否使用校验位以及使用哪种校验方式。
4. 波特率
波特率是指每秒传输的符号数,它决定了数据传输的速率。在STM32的串口配置中,需要设置波特率以确保通信双方的数据传输速率一致。
5. 起始位和结束位
每个数据包以起始位开始,以停止位结束。起始位通常是一个低电平信号,用于通知接收方一个数据包的开始;停止位则是一个高电平信号(或特定长度的信号),用于标识数据包的结束。
数据格式示意图
串口发送数据1
串口发送数据“Hello”
奇偶校验
在串口通信中,奇偶校验是一种用于检测数据传输错误的简单方法。它通过增加一个额外的校验位来使得传输的数据中1的个数满足奇数或偶数的要求,从而帮助接收方判断数据是否在传输过程中发生了改变。
奇偶校验的原理
-
偶校验:使得一帧数据(包括数据位和校验位)中1的个数为偶数。如果数据位中1的个数已经是偶数,则校验位为0;如果是奇数,则校验位为1。
-
奇校验:使得一帧数据中1的个数为奇数。如果数据位中1的个数是偶数,则校验位为1;如果是奇数,则校验位为0。
USART
USART(通用同步/异步收发器)是STM32单片机中用于串口通信的重要模块。它支持同步和异步两种通信方式,可以与其他USART设备、计算机或其他微控制器进行通信。
USART的主要功能
- 数据发送和接收:USART可以发送和接收串行数据,支持多种数据格式,包括数据位、停止位、校验位等。
- 波特率设置:通过配置USART的波特率,可以确保发送方和接收方以相同的速率传输数据。
- 同步和异步模式:USART支持同步和异步两种通信模式,可以根据需要选择合适的模式。
- 多处理器通信:USART支持多处理器通信,可以将多个USART设备连接在一个网络上,实现数据交换。
- 硬件流控:USART支持硬件流控,通过RTS(请求发送)和CTS(清除发送)信号来控制数据的发送和接收,防止数据溢出。
USART内部结构框图
移位寄存器并串转换
移位寄存器是一种能够存储数据位,并在时钟信号的控制下,将数据位向左或向右移动的寄存器。并串转换则是将并行数据(即多位数据同时传输)转换为串行数据(即数据位一位一位地依次传输)。
并串转换示意图
移位寄存器串并转换
移位寄存器串并转换正是指利用移位寄存器将串行数据转换为并行数据的过程。具体来说,当串行数据以一定的时钟频率输入到移位寄存器时,移位寄存器会在每个时钟周期将输入的数据位移入其内部存储单元,并同时将原有的数据位向一个方向(左或右)移动一位。这样,经过足够多的时钟周期后,原始的串行数据就被逐位地移入了移位寄存器,并形成了并行数据。
串并转换示意图
数据格式和波特率
波特率(Baud Rate)是指在通信线路中,每秒传输的符号数。在数字通信中,这个符号通常指的是一个二进制位(bit),因此波特率也可以理解为每秒传输的比特数(bps,即bits per second)。波特率是衡量通信速率的一个重要参数,它决定了数据传输的快慢。
在STM32单片机的USART(通用同步/异步收发器)配置中,波特率是一个关键的设置项。STM32的USART模块支持多种波特率配置,以适应不同的通信需求。
要设置STM32 USART的波特率,通常需要通过配置USART的波特率寄存器(USART_BRR)来实现。这个寄存器包含了用于生成波特率的分频值。STM32的USART模块会根据PCLK(外设时钟)和USART_BRR寄存器中的值来计算实际的波特率。
波特率的计算
我们要在系统时钟72MHz的情况下获取一个115200的波特率,根据上图设分频器的值为x,列一个关于x的方程,解方程得到x=39.0625,将其转换为二进制存储在波特率寄存器中。
编程实例
int main(){
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//打开时钟
USART_InitTypeDef USART_InitStruct;//建立串口结构体
USART_InitStruct.USART_BaudRate = 115200;//波特率115200
USART_InitStruct.USART_Mode = USART_Mode_Tx|USART_Mode_Rx;//双向传输模式
USART_InitStruct.USART_WordLength = USART_WordLength_8b;//8位数据位
USART_InitStruct.USART_Parity = USART_Parity_No;//无校验
USART_InitStruct.USART_StopBits = USART_StopBits_1;//1位停止位
USART_Init(USART1,&USART_InitStruct);
}
USAET_Inti函数
USART_Init函数是STM32单片机中用于初始化USART(通用同步/异步收发器)模块的重要函数。该函数通过配置USART模块的多个参数,实现对USART模块的初始化设置,以便其能够按照预定的方式进行数据的发送和接收。
void USART_Inti(USARTTypeDef *USARTx, USART_InitTypeDef *USART_InisStruct);
USART_InitTypeDef
结构体
USART_InitTypeDef
结构体是STM32单片机中用于配置USART(通用同步/异步收发器)模块的一个重要数据结构。该结构体包含了多个成员变量,每个变量都对应着USART模块的一个配置参数。以下是对USART_InitTypeDef
结构体中每个参数的作用、配置方法以及它们对USART模块影响的详细解释:
1、USART_BaudRate:
- 作用:指定USART模块的波特率,即每秒传输的符号数(在串行通信中通常指每秒传输的比特数,即bps)。
- 配置方法:在
USART_InitTypeDef
结构体中设置USART_BaudRate
成员变量的值,例如USART_BaudRate = 9600
表示波特率为9600bps。 - 影响:波特率决定了数据传输的速率,需要根据通信需求和系统时钟频率来选择合适的值。
2、USART_WordLength:
- 作用:设置每个数据帧中包含的数据位数。
- 配置方法:在
USART_InitTypeDef
结构体中设置USART_WordLength
成员变量的值,常用的设置有USART_WordLength_8b
(8位数据)和USART_WordLength_9b
(9位数据)。 - 影响:数据位长度决定了每个数据帧能够携带的信息量,需要根据通信协议的要求来选择合适的值。
3、USART_StopBits:
- 作用:设置用于标识一个数据帧结束的停止位数。
- 配置方法:在
USART_InitTypeDef
结构体中设置USART_StopBits
成员变量的值,常用的设置有USART_StopBits_1
(1位停止位)和USART_StopBits_2
(2位停止位,实际为1.5位停止时间,因为第二位为半位)。 - 影响:停止位用于数据帧的同步和错误检测,需要根据通信协议的要求来选择合适的值。
4、USART_Parity:
- 作用:设置奇偶校验位,用于检测数据传输过程中的错误。
- 配置方法:在
USART_InitTypeDef
结构体中设置USART_Parity
成员变量的值,常用的设置有USART_Parity_No
(无奇偶校验)、USART_Parity_Odd
(奇校验)和USART_Parity_Even
(偶校验)。 - 影响:奇偶校验可以提高数据传输的可靠性,但会增加数据位的开销。
5、USART_HardwareFlowControl:
- 作用:设置硬件流控制,用于控制数据的发送和接收,防止数据溢出或丢失。
- 配置方法:在
USART_InitTypeDef
结构体中设置USART_HardwareFlowControl
成员变量的值,常用的设置有USART_HardwareFlowControl_None
(无硬件流控制)和其他与RTS/CTS相关的设置(如USART_HardwareFlowControl_RTS_CTS
,具体取决于STM32型号)。 - 影响:硬件流控制可以确保数据传输的完整性,但需要使用额外的引脚和信号线。
6、USART_Mode:
- 作用:设置USART模块的工作模式,如仅接收(Rx)、仅发送(Tx)或收发(Rx/Tx)模式。
- 配置方法:在
USART_InitTypeDef
结构体中设置USART_Mode
成员变量的值,通过按位或操作组合USART_Mode_Rx
(接收模式)和USART_Mode_Tx
(发送模式)来设置所需的工作模式。 - 影响:工作模式决定了USART模块的功能和用途,需要根据实际应用需求来选择合适的值。