STM32与串口(Usart)的通俗介绍与使用(例子:串口控制小灯)
一、说明
写本文目的是从 对串口知识了解不清或刚接触的朋友 的角度出发,帮助此类朋友了解掌握串口的配置与使用。
前面介绍三组串口的具体配置,文章最后举一个例子:串口控制小灯。
二、串口的简单介绍
什么是串口?
简单来说就是实现printf(""),getchar()等函数,即实现字符或字符串的接收发送,从而实现通讯。
其中串口又分为:USART(同步异步收发器)——全双工数据交换 和 UART(异步收发器)——只有异步传输功能,本文只介绍三个USART的配置与使用。
三、串口中断功能的流程图(从右到左看)
四、有关管脚的电路原理图介绍
如上图所示:该板子具有三组串口接口(TX为发送引脚,RX为接收引脚),分别对应:
RX1/TX1 ——> PA10/PA9 ——> USART1
RX2/TX2 ——> PA3/PA2 ——> USART2
RX3/TX3 ——> PB11/PB10 ——> USART3
引脚 | USART1 | USART2 | USART3 |
---|---|---|---|
TX | PA9 | PA2 | PB10 |
RX | PA10 | PA3 | PB11 |
时钟线 | APB2 | APB1 | APB1 |
中断函数名 | USART1_IRQHandler(void) | USART2_IRQHandler(void) | USART3_IRQHandler(void) |
五、代码配置
1.USART1
(1)发送、接收管脚配置和串口配置
void USART1_Config(void)
{
GPIO_InitTypeDef x;
USART_InitTypeDef y;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //开启管脚PA9,PA10对应的时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE); //开启串口USART1的时钟,注意:**APB2**
x.GPIO_Pin=GPIO_Pin_9;
x.GPIO_Mode=GPIO_Mode_AF_PP;
x.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&x); //配置发送引脚——选择管脚9,模式为复用推挽输出(因为是发送引脚),频率为50MHz,初始化到GPIOA
x.GPIO_Pin=GPIO_Pin_10;
x.GPIO_Mode=GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA,&x); //配置接收引脚——选择管脚10,模式为浮空输入(因为是接收引脚),输入模式不用配置频率,初始化到GPIOA
y.USART_BaudRate=9600; //配置波特率9600/115200等,具体看你的硬件配置要求
y.USART_WordLength=USART_WordLength_8b; //配置数据位8位
y.USART_StopBits=USART_StopBits_1; //配置停止位为1
y.USART_Parity=USART_Parity_No; //奇偶校验位为无校验
y.USART_HardwareFlowControl=USART_HardwareFlowControl_None; //配置硬件控制流选择为无
y.USART_Mode=USART_Mode_Rx|USART_Mode_Tx; //配置串口模式为接收和发送
USART_Init(USART1,&y); //初始化到USART1
USART_ITConfig(USART1,USART_IT_RXNE,ENABLE); //开启窗口接收中断(即当发生接收数据或发送数据时将触发对应的中断处理函数)
USART_Cmd(USART1,ENABLE); //使能USART1,也就是打开USART1功能
NVIC_Configuration(); //中断优先级配置
}
(2)配置中断优先级
优先级分组 | 主优先级 | 子优先级 |
---|---|---|
NVIC_ PriorityGroup0(0位用于抢占优先级 4位用于子优先级) | 0 | 0~15 |
NVIC_ PriorityGroup1(1位用于抢占优先级 3位用于子优先级) | 0~1 | 0~7 |
NVIC_ PriorityGroup2(2位用于抢占优先级 2位用于子优先级) | 0~3 | 0~3 |
NVIC_ PriorityGroup3(3位用于抢占优先级 1位用于子优先级) | 0~7 | 0~1 |
NVIC_ PriorityGroup4(4位用于抢占优先级 0位用于子优先级) | 0~15 | 0 |
void NVIC_Configuration()
{
NVIC_InitTypeDef NVIC_InitStruct;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //配置分组为组2
NVIC_InitStruct.NVIC_IRQChannel = USART1_IRQn; //配置中断源为USART1
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1; //配置主优先级
NVIC_InitStruct.N