一、USART简介
- USART(Universal Synchronous/Asynchronous Receiver/Transmitter)通用同步/异步收发器
- USART是STM32内部集成的硬件外设,可根据数据寄存器的一个字节数据自动生成数据帧时序,从TX引脚发送出去,也可自动接收RX引脚的数据帧时序,拼接为一个字节数据,存放在数据寄存器里
- 自带波特率发生器,最高达4.5Mbits/s
- 可配置数据位长度(8/9)、停止位长度(0.5/1/1.5/2)
- 可选校验位(无校验/奇校验/偶校验)
- 支持同步模式、硬件流控制、DMA、智能卡、IrDA、LIN
- STM32F103C8T6 USART资源: USART1、 USART2、 USART3
二、USART框图
- 发送数据:STM32把要发送的数据写入发送数据寄存器(TDR),等待硬件电路把发送数据寄存器中的数据转移到发送移位寄存器中,然后从TX把数据发送出去。
- 接收数据:接收的数据从RX进入接收移位寄存器,有硬件电路把数据转移到接收数据寄存器,RXNE(读数据寄存器非空)位会被硬件置一。此时,可以通过RXNE触发中断,把数据读取出来。
三、USART数据帧
3.1 字长设置
通常的数据帧模式:
- 9位字长(11位数据):一位起始位、一位停止位,八位数据位、一位校验位。
- 8位字长(10位数据):一位起始位、一位停止位,八位数据位、无校验位。
3.2 配置停止位
- 可选择1个停止位、1.5个停止位、2个停止位或者0.5个停止位。
四、USART基本结构
- 开启外设时钟
- 初始化GPIO口
- 初始化USART
- USART中断控制输出(选择触发信号)
- NVIC中断优先级分组
- 初始化NVIC
- 使能USART
程序如下:
void Serial_Init(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//开启USART外设时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP;//PA9复用推挽输出
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_9;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStruct);
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IPU;//PA10上拉输入
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_10;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStruct);
USART_InitTypeDef USART_InitStruct;
USART_InitStruct.USART_BaudRate=9600;//波特率
USART_InitStruct.USART_HardwareFlowControl=USART_HardwareFlowControl_None;//硬件流控制
USART_InitStruct.USART_Mode=USART_Mode_Tx|USART_Mode_Rx;//串口模式
USART_InitStruct.USART_Parity=USART_Parity_No;//奇偶校验
USART_InitStruct.USART_StopBits=USART_StopBits_1;//停止位一位
USART_InitStruct.USART_WordLength=USART_WordLength_8b;//数据位数
USART_Init(USART1,&USART_InitStruct);
USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);//中断输出控制
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//中断优先级分组
NVIC_InitTypeDef NVIC_InitStruct;
NVIC_InitStruct.NVIC_IRQChannel=USART1_IRQn;
NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=1;
NVIC_InitStruct.NVIC_IRQChannelSubPriority=1;
NVIC_Init(&NVIC_InitStruct);
USART_Cmd(USART1,ENABLE);
}