立创商城STM32F系列——usart文件夹中uart_init函数
2018-08-28 11:09阅读:
usart文件夹中uart_init函数
void uart_init(u32
bound)函数是串口1初始化函数。该函数有1个参数为波特率,波特率这个参数对于大家来说应该不陌生,这里就不多说了。uart_init函数代码如下:
//初始化 IO 串口
1
//bound:波特率
void uart_init(u32 bound){
//GPIO端口设置
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);
//使能
GPIOA时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,EN
ABLE);
//使能
USART1时钟
GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1);
//GPIOA9复用为USART1
GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1);
//GPIOA10复用为USART1
//USART1 PA.9
PA.10
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;
//GPIOA9与GPIOA10
GPIO_InitStructure.GPIO_Mode =
GPIO_Mode_AF;//复用功能
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
//速度 50MHz
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
//推挽复用输出
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
//上拉
GPIO_Init(GPIOA,&GPIO_InitStructure);
//初始化PA9,PA10
//USART
初始化设置
USART_InitStructure.USART_BaudRate =
bound;//一般设置为9600;
USART_InitStructure.USART_WordLength =
USART_WordLength_8b;//字长为8位
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_Cmd(USART1, ENABLE); //使能串口
USART_ClearFlag(USART1, USART_FLAG_TC);
#if EN_USART1_RX
USART_ITConfig(USART1, USART_IT_RXNE,
ENABLE);//开启中断
//Usart1 NVIC 配置
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;//抢占优先级3
NVIC_InitStructure.NVIC_IRQChannelSubPriority =3;
//响应优先级
3
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
//IRQ 通道使能
NVIC_Init(&NVIC_InitStructure);
//根据指定的参数初始化VIC
寄存器、
#endif
}
下面我们一一分析一下这段初始化代码。首先是时钟使能代码:
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);
//使能 GPIOA 时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//使能
USART1 时钟
这个时钟使能我们在端口复用的时候已经讲解过,大家可以翻到端口复用那一章节,有详细的讲解。在使用一个内置外设的时候,我们首先要使能相应的
GPIO 时钟,然后使能复用功能外设时钟。
然后我们要配置相应的引脚复用器映射。这里我们调用函数为:
GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1);
//PA9 复用为USART1
GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1);
//PA10复用为USART1
把PA9和PA10
复用为串口1。
接下来我们要初始化相应的GPIO
端口模式(GPIO_Mode)为复用功能。配置方法如下:
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;
//GPIOA9与GPIOA10
GPIO_InitStructure.GPIO_Mode =
GPIO_Mode_AF;//复用功能
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
//速度 50MHz
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
//推挽复用输出
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
//上拉
GPIO_Init(GPIOA,&GPIO_InitStructure);
//初始化PA9,PA10
对于GPIO的知识我们在跑马灯实例会讲解到,这里暂时不做深入的讲解。
紧接着,我们要进行usart1
的中断初始化,设置抢占优先级值和响应优先级的值:
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
//Usart1中断配置
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3
;//抢占优先级 3
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
//响应优先级
3
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
//IRQ
通道使能
NVIC_Init(&NVIC_InitStructure);
//根据指定的参数初始化VIC
寄存器
这段代码在我们的中断管理函数章节4.5有讲解中断管理相关的知识,大家可以翻阅一下。
在设置完中断优先级之后,接下来我们要设置串口1
的初始化参数:
USART_InitStructure.USART_BaudRate =
bound;//一般设置为9600;
USART_InitStructure.USART_WordLength =
USART_WordLength_8b;//字长为8位
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_Init()函数实现,而这个函数重要的参数就是就是结构体指针变量USART_InitStructure,下面我们看看结构体定义:
typedef struct
{
uint32_t USART_BaudRate;
uint16_t USART_WordLength;
uint16_t USART_StopBits;
uint16_t USART_Parity;
uint16_t USART_Mode;
uint16_t USART_HardwareFlowControl;
} USART_InitTypeDef;
这个结构体有6个成员变量,所以我们有6
个参数需要初始化。
第一个参数USART_BaudRate为串口波特率,波特率可以说是串口最重要的参数了,我们这里通过初始化传入参数baund来设定。第二个参数USART_WordLength为字长,这里我们设置为
8位字长数据格式。第三个参数USART_StopBits为停止位设置,我们设置为
1位停止位。第四个参数 USART_Parity
设定是否需要奇偶校验,我们设定为无奇偶校验位。第五个参数USART_Mode
为串口模式,我们设置为全双工收发模式。第六个参数为是否支持硬件流控制,我们设置为无硬件流控制。
在设置完成串口中断优先级以及串口初始化之后,接下来就是开启串口中断以及使能串口
了:
USART_ITConfig(USART1, USART_IT_RXNE,
ENABLE);//开启中断
USART_Cmd(USART1, ENABLE);
//使能串口
在开启串口中断和使能串口之后接下来就是写中断处理函数了,下面一节我们将着重讲解中断处理函数。
【立创商城】STM32F103CBT6 托盘
https://item.szlcsc.com/8796.html