STM32F103學習筆記(四) 串列埠實驗
阿新 • • 發佈:2019-01-01
串列埠通訊,首先進行串列埠的設定:
串列埠設定的一般步驟可以總結為如下幾個步驟:
1) 串列埠時鐘使能, GPIO 時鐘使能
2) 串列埠復位
3) GPIO 埠模式設定
4) 串列埠引數初始化
5) 開啟中斷並且初始化 NVIC(如果需要開啟中斷才需要這個步驟)
6) 使能串列埠
7) 編寫中斷處理函式
串列埠設定原子已經寫在usart.c裡邊了,會拉進來用就行了
//初始化 IO 串列埠 1 //bound:波特率 void uart_init(u32 bound) { GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; //①串列埠時鐘使能, GPIO 時鐘使能,複用時鐘使能 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1| RCC_APB2Periph_GPIOA, ENABLE); //使能 USART1 ,GPIOA 時鐘 //②串列埠復位 USART_DeInit(USART1); //復位串列埠 1 //③GPIO 埠模式設定 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //ISART1_TX PA.9 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //複用推輓輸出 GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化 GPIOA.9 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //USART1_RX PA.10 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空輸入 GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化 GPIOA.10 //④串列埠引數初始化 USART_InitStructure.USART_BaudRate = bound; //波特率設定
主要看主函式是怎麼寫的,main.c:
#include "led.h" #include "delay.h" #include "key.h" #include "sys.h" #include "usart.h" int main(void) { u8 t; u8 len; u16 times=0; delay_init(); //延時函式初始化 NVIC_Configuration(); //設定 NVIC 中斷分組 2 uart_init(9600); //串列埠初始化波特率為 9600 LED_Init(); //LED 埠初始化 KEY_Init(); //初始化與按鍵連線的硬體介面 while(1) { if(USART_RX_STA&0x8000) { len=USART_RX_STA&0x3f; //得到此次接收到的資料長度 printf("\r\n 您傳送的訊息為:\r\n\r\n"); for(t=0;t<len;t++) { USART_SendData(USART1, USART_RX_BUF[t]); //向串列埠 1 傳送資料 while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET); //等待發送結束 } printf("\r\n\r\n"); //插入換行 USART_RX_STA=0; }else { times++; if(times%5000==0) { printf("\r\n 串列埠實驗\r\n"); printf("哥很霸氣\r\n\r\n"); } if(times%200==0)printf("請輸入資料,以回車鍵結束\n"); if(times%30==0)LED0=!LED0; //閃爍 LED,提示系統正在執行. delay_ms(10); } }
那個NVIC_Configuration();可以點選右鍵go to看它的定義,設定NVIC中斷分組2
USART_RX_STA&0x8000)
{ len=USART_RX_STA&0x3f;
說實話,這兩句沒看懂,只知道0x8000對應的2進位制 100000000000000
,0x3fff 對應的2進位制 0011111111111111USART_SendData(USART1, USART_RX_BUF[t]); //向串列埠 1 傳送資料
while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);
第一句,其實就是傳送一個位元組到串列埠。第二句呢,就是我們在我們傳送一個數據到串列埠
之後,要檢測這個資料是否已經被髮送完成了。 USART_FLAG_TC 是巨集定義的資料傳送完成標
識符