藍橋杯嵌入式——串口配置

藍橋杯嵌入式——串口配置

作者:閆永成  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機接收數據(接收後可以執行相關操作後重復接收)。這時,我們需要用到串口調試助手,用來實現板子與電腦的通信。關於串口調試助手的使用並不困難,留給大家自己琢磨
在這裏插入圖片描述
在這裏插入圖片描述





   關於串口通信,本篇文章就介紹到這裏,歡迎大傢俬信交流!

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