打印
[STM32]

立创商城STM32F系列——usart文件夹中uart_init函数

[复制链接]
787|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
小乐Tzz|  楼主 | 2018-8-28 11:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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,ENABLE);
//使能 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

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

70

主题

70

帖子

0

粉丝