通用同步异步收发器
USART通讯协议
同步通讯 和 异步通讯
根据通讯的数据同步方式,又分为同步和异步两种,可以根据通讯过程中是否有使用到时钟信号进行简单的区分。
在同步通讯中,收发设备双方会使用一根信号线表示时钟信号,在时钟信号的驱动下双方进行协调,同步数据,见下图。通讯中通常双方会统一规定在时钟信号的上升沿或下降沿对数据线进行采样。
在异步通讯中不使用时钟信号进行数据同步,它们直接在数据信号中穿插一些同步用的信号位,或者把主体数据进行打包,以数据帧的格式传输数据,见下图,某些通讯中还需要双方约定数据的传输速率,以便更好地同步 。
在同步通讯中,数据信号所传输的内容绝大部分就是有效数据,而异步通讯中会包含有帧的各种标识符,所以同步通讯的效率更高,但是同步通讯双方的时钟允许误差较小,而异步通讯双方的时钟允许误差较大。
USART寄存器
-
状态寄存器 --- SR(Status register):存放各种状态的标志位;
- 复位值:0x0000 00C0
-
数据寄存器 --- DR(Data register):存放发送或接收的数据;
- 复位值:未定义
-
波特比率寄存器 --- BRR(Baud rate register):储存USART分频器除法因子,需要使用者赋值;
-
作用---储存USART分配器除法因子:低16位有效;其中高12位存储整数部分,低4位存储小数部分;除法因子与波特率的关系如图所示;
复位值:0x0000 0000
-
-
控制寄存器1 --- CR1(Control register 1):USART使能、发送接收使能、校验、字长设定;
- 复位值:0x0000 0000
-
控制寄存器2 --- CR2(Control register 2):时钟与停止位设定;
- 复位值:0x0000 0000
-
控制寄存器3 --- CR3(Control register 3):CTS、RTS、DMA、智能卡、半双工、红外模式使能;
- 复位值:0x0000 0000
-
保护时间和预分频寄存器 --- GTPR(Guard time and prescaler register):保护时间值与预分频值;
- 复位值:0x0000 0000
常用USART固件库函数(stm32f10x_usart.h)
使用USART时仍然要初始化GPIO口,并且不需要打开AFIO(因为可以直接通过RCC寄存器使能USART时钟)。
发送端(Tx)设置为 复用模式,接收端(Rx)设置为 输入模式
USART初始化函数 --- USART_Init
void USART_Init(USART_TypeDef* USARTx, USART_InitTypeDef* USART_InitStruct);
- USARTx:选择串口端口,可以为 USART1、USART2、USART3、UART4、UART5;
-
USART_InitStruct:USART_InitTypeDef 结构体
- USART_BaudRate:串口的波特率;
- USART_WordLength:字长,可选8bit或9bit;
- USART_StopBits:停止位的长度,可选0.5、1、1.5、2位;
- USART_Parity:校验的方式,可选无校验、奇校验、偶校验;
- USART_HardwareFlowControl:是否启动硬件流控制,一般不启动,即 None;(硬件流控制:在半双工情况下,当接收端数据处理不过来或要进行收发转换时,硬件自动发出不再接收/发送数据的信号)
- USART_Mode:工作模式,选择是接收数据(Rx)或者发送数据(Tx),或者均可(Rx | Tx);
- 示例:
//创建GPIO初始化结构体
GPIO_InitTypeDef GPIO_InitStructure;
//创建USART初始化结构体
USART_InitTypeDef USART_InitStructure;
//打开USART1对应GPIOA的时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
//打开USART1的时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
//备注:必须先时钟使能再配置
//将串口 USART1-Tx 的 GPIO 设置为推挽复用模式
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
//将串口 USART-Rx 的 GPIO 设置为浮空输入模式
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);
//配置串口工作参数
//配置波特率为115200
USART_InitStructure.USART_BaudRate = 115200;
//配置 针数据字长
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
//配置停止位
USART_InitStructure.USART_StopBits = USART_StopBits_1;
//配置校验位
USART_InitStructure.USART_Parity = USART_Parity_No;
//配置硬件流控制
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
//配置工作模式,收发一起
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
//完成串口初始化配置
USART_Init(USART1, &USART_InitStructure);
USART使能函数 --- USART_Cmd
void USART_Cmd(USART_TypeDef* USARTx, FunctionalState NewState);
- USARTx:选择串口端口,可以为 USART1、USART2、USART3、UART4、UART5;
- NewState:使能或关闭,ENABLE、DISABLE;
- 示例:
//使能USART1
USART_Cmd(USART1, ENABLE);
USART中断使能函数 --- USART_ITConfig
void USART_ITConfig(USART_TypeDef* USARTx, uint16_t USART_IT, FunctionalState NewState);
USARTx:选择串口端口,可以为 USART1、USART2、USART3、UART4、UART5;
-
USART_IT:开启的中断类型;
NewState:使能或关闭,ENABLE、DISABLE;
示例:
//使能USART1的接收中断
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE)
USART发送数据函数 --- USART_SendData
void USART_SendData(USART_TypeDef* USARTx, uint16_t Data);
- USARTx:选择串口端口,可以为 USART1、USART2、USART3、UART4、UART5;
- DATA:需要发送的16位数据;
- 示例:
uint32_t Data = 0x10;
//向 USART1 发送 Data
USART_SendData(USART1, Data);
//等待发送完成
while( USART_GetFlagStatus(USARTx,USART_FLAG_TXE) != SET );
USART获取标志位函数 --- USART_GetFlagStatus
typedef enum {RESET = 0, SET = !RESET} FlagStatus, ITStatus;
FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t USART_FLAG);
- USARTx:选择串口端口,可以为 USART1、USART2、USART3、UART4、UART5;
-
USART_FLAG:对应的标志位;
USART接收数据函数 --- USART_ReceiveData
uint16_t USART_ReceiveData(USART_TypeDef* USARTx);
- USARTx:选择串口端口,可以为 USART1、USART2、USART3、UART4、UART5;
USART读取中断标志位函数 --- USART_GetITStatus
typedef enum {RESET = 0, SET = !RESET} FlagStatus, ITStatus;
ITStatus USART_GetITStatus(USART_TypeDef* USARTx, uint16_t USART_IT);
USARTx:选择串口端口,可以为 USART1、USART2、USART3、UART4、UART5;
-
USART_IT:对应的中断标志位;
示例:
//当接收寄存器非空时
if( USART_GetITStatus(DEBUG_USART, USART_IT_RXNE) != RESET )
{
//处理程序
}