STM32F1基本配置2.串口的中断配置

  • Post author:
  • Post category:其他




简介

STM32F1基本配置2.串口的配置和常用函数,侧重于即配即用。
因此不会讲述太多原理性的东西,希望做到即拿即用的效果。



串口简介

串口是MCU重要的外部接口,用于数据传输,也是开发中重要的调试手段。
STM32的串口资源丰富,支持多种通讯模式,具有DMA等。
串口的参数有波特率,停止位等。
由于这里侧重于即配即用,更多详细的内容可自行查阅。



串口配置相关知识

至于串口的波特率等相关参数的知识,网上已经有很多资料可自行查阅。

在这里说一下使用printf打印串口的知识:
由于是在MCU上运行的程序,所以无法像写C语言一样直接使用printf。
要想使用printf打印串口则需要改写fputc函数,如下:
int fputc(int ch, FILE *f)
	{      
	  USART_SendData(USART1, (u8)ch);//发送一个字节数据到串口
	  //等待发送完毕
	  while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET)
	  {  
	  }
		return ch;
	}
然后是串口中断的知识:
常用的串口中断有RXNE(读寄存器非空)和TC(发送完成)。
当使能了这两个中断
如:USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
       USART_ITConfig(USART1, USART_IT_TC, ENABLE);
只要产生读寄存器非空和发送完成的事件就会进入到中断函数
void USART1_IRQHandler(void)里面去执行,

一般进入中断函数后先判断是哪种中断(只要产生中断就进入这个中断函数),
判断是哪种中断:USART_GetITStatus(USART1, USART_IT_RXNE)

在出中断函数前要擦除中断标志:
USART_ClearITPendingBit(USART1, USART_IT_RXNE);



串口无中断配置

GPIO_InitTypeDef  GPIO_InitStructure;      //用来配置USART对应引脚的结构体
USART_InitTypeDef USART_InitStructure;     //用来配置USART的结构体

  //开启串口A的时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); 
 //开启串口对应端口组的时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
  
  //配置USART的输出引脚
  GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_9;       //串口1的输出引脚
  GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF_PP;  //设置复用推挽输出
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  //设置输出速率
  GPIO_Init(GPIOA, &GPIO_InitStructure);        //初始化
  
  //配置USART的输入引脚
  GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_10;     //输入引脚
  GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_IN_FLOATING;  //设置浮空输入模式
  GPIO_Init(GPIOA, &GPIO_InitStructure);              //初始化端口
  
  //配置串口
  USART_InitStructure.USART_BaudRate   = 115200;             //设置波特率
  USART_InitStructure.USART_WordLength = USART_WordLength_8b; //设置串口传输的字长
  USART_InitStructure.USART_StopBits   = USART_StopBits_1;  //设置停止位
  USART_InitStructure.USART_Parity     = USART_Parity_No;   //设置奇偶校验位
  USART_InitStructure.USART_Mode       = USART_Mode_Rx | USART_Mode_Tx;           //设置输出和输入模式
  USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //无硬件流控制
  USART_Init(USART1, &USART_InitStructure);                 //根据参数初始化USART

  USART_Cmd(USART1, ENABLE);   //使能串口



串口有中断配置

首先要在配置串口中断配置前设置NVIC中断分组,不然无法使用中断

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

下面是配置STM32F1RC配置相关代码

GPIO_InitTypeDef  GPIO_InitStructure;      //用来配置USART对应引脚的结构体
USART_InitTypeDef USART_InitStructure;     //用来配置USART的结构体
NVIC_InitTypeDef  NVIC_InitStructure;      //用来配置USART中断的结构体

  //开启串口A的时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); 
 //开启串口对应端口组的时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
  
  //配置USART的输出引脚
  GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_9;       //串口1的输出引脚
  GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF_PP;  //设置复用推挽输出
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  //设置输出速率
  GPIO_Init(GPIOA, &GPIO_InitStructure);        //初始化
  
  //配置USART的输入引脚
  GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_10;     //输入引脚
  GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_IN_FLOATING;  //设置浮空输入模式
  GPIO_Init(GPIOA, &GPIO_InitStructure);              //初始化端口
  
  //配置串口
  USART_InitStructure.USART_BaudRate   = 115200;             //设置波特率
  USART_InitStructure.USART_WordLength = USART_WordLength_8b; //设置串口传输的字长
  USART_InitStructure.USART_StopBits   = USART_StopBits_1;  //设置停止位
  USART_InitStructure.USART_Parity     = USART_Parity_No;   //设置奇偶校验位
  USART_InitStructure.USART_Mode       = USART_Mode_Rx | USART_Mode_Tx;           //设置输出和输入模式
  USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //无硬件流控制
  USART_Init(USART1, &USART_InitStructure);                 //根据参数初始化USART

  //配置USART的中断
  NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;         //设置串口中断
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; //抢占优先级
  NVIC_InitStructure.NVIC_IRQChannelSubPriority        = 1; //子优先级
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;           //通道使能
  NVIC_Init(&NVIC_InitStructure);                           //初始化

  USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);  //接收寄存器非空中断使能
  USART_ITConfig(USART1, USART_IT_TXE,  ENABLE);  //发送完成中断使能
  USART_Cmd(USART1, ENABLE);   //使能串口



串口中断函数

不管产生哪种串口中断都会进入到中断函数,所以需要在里面判断是哪种中断

然后需要清除中断标志

void USART1_IRQHandler(void)                
{
  if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //判断是否是RXNE中断
  {
    USART_ClearITPendingBit(USART1, USART_IT_RXNE);  //清除RXNE中断标志位
    //用户代码
  }

  
  if(USART_GetITStatus(USART1, USART_IT_TXE) != RESET)  //判断是否是TC中断
  {
    USART_ClearITPendingBit(USART1, USART_IT_TXE);  //清除TC中断标志位
    //用户代码
  }
}  



版权声明:本文为haiou_原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。