藍橋杯嵌入式——串口配置
作者:閆永成 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機接收數據(接收後可以執行相關操作後重復接收)。這時,我們需要用到串口調試助手,用來實現板子與電腦的通信。關於串口調試助手的使用並不困難,留給大家自己琢磨。
關於串口通信,本篇文章就介紹到這裏,歡迎大傢俬信交流!