1. 程式人生 > >STM32F103學習筆記(四) 串列埠實驗

STM32F103學習筆記(四) 串列埠實驗

串列埠通訊,首先進行串列埠的設定:

 串列埠設定的一般步驟可以總結為如下幾個步驟:
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進位制  0011111111111111
USART_SendData(USART1, USART_RX_BUF[t]); //向串列埠 1 傳送資料
while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);
第一句,其實就是傳送一個位元組到串列埠。第二句呢,就是我們在我們傳送一個數據到串列埠
之後,要檢測這個資料是否已經被髮送完成了。 USART_FLAG_TC 是巨集定義的資料傳送完成標
識符