蓝桥杯嵌入式——串口配置

蓝桥杯嵌入式——串口配置

作者:闫永成  QQ:793805481

  串行接口,简称串口(USART),简单的理解就是指把数据按顺序一位一位地传送,其特点是通信线路简单,只要一对传输线就可以实现双向通信(例如 可以直接利用电话线作为传输线),从而大大降低了成本,特别适用于远距离通信,但传送速度较慢。

  蓝桥杯嵌入式的板子上有两个串口可供我们使用,分别是串口1和串口2,但是串口1是连接在9针串口上的,所以我们只能通过USB线去使用串口2。
在这里插入图片描述
  通过原理图,可以知道串口2的发送和接收端分别对应PA2和PA3。 使用串口时,需要用到stm32f10x_usart.c这个文件,需要提前添加进去。然后,就可以开始配置了。

1.串口初始化函数

void USART2_Init(u32 bound)//USART初始化函数   参数为波特率
{
   USART_InitTypeDef USART_InitStruct;
   GPIO_InitTypeDef GPIO_InitStruct;
   NVIC_InitTypeDef NVIC_InitStructure;
   //开启时钟  USART2在APB1总线上
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
   RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);
   //发送端  配置为复用推挽输出

   NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn; //开启串口2中断	    
   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢占优先级为最高
   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;   //响应优先级为最高
   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;  //使能中断
   NVIC_Init(&NVIC_InitStructure);

   GPIO_InitStruct.GPIO_Pin=GPIO_Pin_2;
   GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP;
   GPIO_InitStruct.GPIO_Speed=GPIO_Speed_10MHz;
   GPIO_Init(GPIOA,&GPIO_InitStruct);
   //接收端  配置为浮空输入
   GPIO_InitStruct.GPIO_Pin=GPIO_Pin_3;
   GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IN_FLOATING;
   GPIO_InitStruct.GPIO_Speed=GPIO_Speed_10MHz;
   GPIO_Init(GPIOA,&GPIO_InitStruct);
   
   USART_InitStruct.USART_BaudRate=bound;//设置波特率
   USART_InitStruct.USART_WordLength=USART_WordLength_8b;//8位
   USART_InitStruct.USART_StopBits=USART_StopBits_1;//1位停止位
   USART_InitStruct.USART_Parity=USART_Parity_No;//无奇偶校验位
   USART_InitStruct.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;//接受和发送
   USART_InitStruct.USART_HardwareFlowControl=USART_HardwareFlowControl_None;//不需要开启硬件控制
   USART_Init(USART2,&USART_InitStruct);//USART初始化
   USART_Cmd(USART2,ENABLE);//使能串口
   USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);   //使能接收中断
}

  USART_Init(USART2,&USART_InitStruct);是stm32f10x_usart.c里边已经定义的函数,用来配置USART的基本参数——波特率(波特率表示每秒钟传送的码元符号的个数,是衡量数据传送速率的指标,它用单位时间内载波调制状态改变的次数来表示)、数据位数、有无停止位、有无奇偶校验位等。在这里,波特率有初始函数参数给入,设置8位数据位、1位停止位、无奇偶校验、开启USART的发送和接收模式、不开启硬件控制。

  同时,我们需要用到中断,当我们接收到数据时执行中断。(当然,如果我们只是想发送数据,不使用接收数据的话,就不用使用中断)

2.数据发送函数

void USART2_SendString(u8 *str)
{
   u8 index=0;
   do
   {
     USART_SendData(USART2,str[index]);
	 while(USART_GetFlagStatus(USART2, USART_FLAG_TXE) == 0);  //是否发送完成   等待上边数据发送完成的
	 index++;  
   }while(str[index]!=0);
}

  这里,主要用到了USART_SendData(USART2,str[index]);USART_GetFlagStatus(USART2, USART_FLAG_TXE)这两个函数。USART_SendData是用来发送数据的,每次发送1个8位的数据(当我们的板子和PC相连时就能实现向PC发送数据);USART_GetFlagStatus(USART2, USART_FLAG_TXE)是用来判断标志位的,当数据发送完成时返回为1。

3.中断函数(接收函数)

void USART2_IRQHandler(void)
{	
		u8 temp;
		if(USART_GetITStatus(USART2,USART_IT_RXNE) == SET)
		{
				USART_ClearITPendingBit(USART2,USART_IT_RXNE);
				temp =  USART_ReceiveData(USART2);//接收数据
				if(temp == '\n')
				{
						RXCOUNT = 0;
						RXOVER = 1;
						USART_ITConfig(USART2, USART_IT_RXNE, DISABLE);
				}else
				{
						RX_Str[RXCOUNT] = temp;
						RXCOUNT++;
				}
		}
}

  定义全局变量RXCOUNT(计数)、RXOVER(结束标志)、RX_Str[20](存放接收数据的数组)。如果接收到数据时即产生中断,然后判断是否为’\n’(这里我们设接收到’\n’时结束本次接收,即’\n’为结束标志),如果不是’\n’时,我们把接收到的数据存入数组中,否则计数值置零、结束标志置1,关闭中断。这样,我们就可以在主函数里边调用接收到的数据了。注意:中断函数名都是已经定义好的,在startup_stm32f10x_md.s里边可以找到。

4.调用

u8 RX_Str[20];
u16 RXOVER=0;
u16 RXCOUNT=0;
int main(void)
{
	SysTick_Config(SystemCoreClock/1000);
	USART2_Init(19200);//设置波特率为19200
	STM3210B_LCD_Init();
	LCD_Clear(Blue);
	LCD_SetTextColor(Yellow);
    LCD_SetBackColor(White);
	while(1)
	{
	  USART2_SendString("54811");
	  Delay_Ms(1000);
	  if(RXOVER)
	  {
	    u16 i;
	    //利用接收到的数据执行的操作
		LCD_DisplayStringLine(Line0,RX_Str);
		USART2_SendString(RX_Str);//重新发送回电脑
		for(i=0;i<20;i++)//清空
		{
		  RX_Str[i]=0;
		}
		RXOVER=0;//置零  
	    USART_ITConfig(USART2,USART_IT_RXNE,ENABLE);//重新开启中断
	  }
	  }
}

  在主函数中,正常初始化函数后就可以使用发送和接收函数了,可以实现由板子向PC机发送数据和从PC机接收数据(接收后可以执行相关操作后重复接收)。这时,我们需要用到串口调试助手,用来实现板子与电脑的通信。关于串口调试助手的使用并不困难,留给大家自己琢磨
在这里插入图片描述
在这里插入图片描述





   关于串口通信,本篇文章就介绍到这里,欢迎大家私信交流!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章