USART是什么?
通用同步异步收发器(USART)支持标准的不归零码(Not return to Zero,NRZ)异步串行数据格式,是一个串行通信设备,可以灵活地与外部设备进行全双工数据交换。一般情况下,我们32单片机的串口通信采用的是UART异步通信,传输时只需配置协议层:波特率、起始位、数据位、奇偶效验位、停止位,只有保持双方数据包的格式要一致,才能正常的接受发数据!
1.USART和UART区别
UART全称:universal asynchronous receiver and transmitter通用异步收/发器,它是在 USART 基础上裁剪掉了同步通信功能,只有异步通信。
在异步通讯的情况下,USART是和UART 是没什么区别的;但是在同步通信的情况下,就有一些区别的,因为同步通信是需要依靠时钟来控制实现数据传输的,UART 是不需要时钟信号来同步的异步,全双工串口总线。
USART的配置步骤
1、使能串口时钟及 GPIO 端口时钟
2、GPIO 端口模式设置,设置串口对应的引脚为复用功能
3、初始化串口参数,包含波特率、字长、奇偶校验等参数
4、使能串口
5、设置串口中断类型并使能
6、设置串口中断优先级,使能串口中断通道
7、编写串口中断服务函数
配置USART
使能串口时钟及 GPIO 端口时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);//开启USART时钟
GPIO 端口模式设置,设置串口对应的引脚为复用功能
static void USART_GPIO_Configurature(void)
{
GPIO_InitTypeDef m_gpio;
USART1_TX_IO_CLK_EN();
USART1_RX_IO_CLK_EN();
m_gpio.GPIO_Mode = GPIO_Mode_AF;//复用
m_gpio.GPIO_OType = GPIO_OType_PP;//推挽
m_gpio.GPIO_Pin = USART1_TX_PIN;//发送引脚
m_gpio.GPIO_PuPd = GPIO_PuPd_NOPULL;//浮空
m_gpio.GPIO_Speed = GPIO_Speed_10MHz;//10MHz
GPIO_Init(USART1_TX_PORT, &m_gpio);//初始化
GPIO_PinAFConfig(USART1_TX_PORT,GPIO_PinSource3,GPIO_AF_1);//设置IO的映射关系
m_gpio.GPIO_Pin = USART1_RX_PIN;//接收引脚
GPIO_Init(USART1_RX_PORT, &m_gpio);初始化
GPIO_PinAFConfig(USART1_RX_PORT,GPIO_PinSource6,GPIO_AF_1);//设置IO的映射关系
}
初始化串口参数,包含波特率、字长、奇偶校验等参数
void USART_Configurature(void)
{
USART_InitTypeDef m_usart;
USART_GPIO_Configurature();
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);//开启USART时钟
m_usart.USART_BaudRate = 115200;//设置波特率
m_usart.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//硬件数据流控制
m_usart.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;收发模式
m_usart.USART_Parity = USART_Parity_No;//奇偶性校验位
m_usart.USART_StopBits = USART_StopBits_1;//一位停止位
m_usart.USART_WordLength = USART_WordLength_8b;//字长
USART_Init(USART1, &m_usart);//USART初始化
USART_Cmd(USART1, ENABLE);//使能串口
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//设置串口中断类型并使能
USART_NVIC_Configurature();//设置串口中断优先级,使能串口中断通道
}
结构体成员与组成部分知识重合,不做解释
使能串口
在接收到数据的时候(RXNE 读数据寄存器非空),我们要产生中断
USART_Cmd(USART1, ENABLE);//USART使能
设置串口中断类型并使能
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//USART1接收中断
设置串口中断优先级,使能串口中断通道
USART_NVIC_Configurature();
编写串口中断服务函数
void USART1_IRQHandler(void)
{
uint8_t ch_rx_test;
if((USART1->ISR & USART_ISR_RXNE) != 0)
{
ch_rx_test = USART1->RDR;
USART_SendByte(ch_rx_test);
}
}
中断映射图
发送一个字节
void USART_SendByte(uint8_t ch)
{
while((USART1->ISR & USART_ISR_TXE) == 0);
USART1->TDR = ch;
}
发送字符串
void USART_SendByte(uint8_t ch)
void USART_SendStringLen(uint8_t *p,uint16_t len)
{
while(len--)
{
USART_SendByte(*(p++));
}
}