【STM32學習筆記】第三章:STM32的串口使用配置

  之前我們講了簡單的GPIO和定時器的使用,下面這一章我給大家講解一下串口的使用和配置。
  那麼問題來了,什麼時串口呢?,串口是單片機與外部通信的一種方式,如果單片機不需要通信,能夠自己自足那就不需要串口,但是在硬件電路設計的時候一個單片機不夠用或者該設備需要和上位機通信做一些功能那麼串口是必不可少的。
  串口功能有哪些?,串口的功能主要是通信功能,它是和其他設備溝通的橋樑。如果沒有串口就無法和外面交流,有了串口設備之間的通信協議就可以自己定義了。
  下面我給大家介紹一下串口的基本配置和基本功能。

一、準備工作

這裏我們要想配置串口並驗證需要的準備工作如下:

1、MDK for ARM(KEIL5)或者IAR FOR ARM(這個是軟件必備開發平臺) (必須)

2、一塊STM32最小系統開發板(這個是驗證軟件的平臺) (必須)

3、這裏最好有一本關於STM32學習的書籍(這裏就不推薦了,網上有一大把)

4、TTL轉USB模塊(CH340模塊) (必須)

二、具體的操作

1、工程建立

  這裏我們需要一個根據自己的開發板配套的基礎工程。工程建立就不多說了可以參考我的STM32CUBUMX工程建立博客,或者用其它的Demo例程。串口配置參考例程

2、串口初始化配置

  下面我給大家分享一部分代碼。

void Usart1_Init(u32 bound){

GPIO_InitTypeDef GPIO_InitStructure;		//定義GPIO結構體,爲下面初始化IO口做準備
USART_InitTypeDef USART_InitStructure;//定義串口結構體,爲下面初始化串口做準備
NVIC_InitTypeDef NVIC_InitStructure;		//定義中斷結構體,爲下面初始化串口中斷做準備
//使能USART1,GPIOA時鐘,外設才能正常運行
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE);
  
//串口1發送初始化   GPIOA.9
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;	//複用推輓輸出
GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.9
   
//串口1接收初始化   GPIOA.10初始化
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//PA10
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空輸入
GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.10  

//串口中斷優先級配置
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//搶佔優先級3
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;		//子優先級3
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;			//IRQ通道使能
NVIC_Init(&NVIC_InitStructure);	//根據指定的參數初始化VIC寄存器
  
//串口1初始化設置
USART_InitStructure.USART_BaudRate = bound;//串口波特率
USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字長爲8位數據格式
USART_InitStructure.USART_StopBits = USART_StopBits_1;//一個停止位
USART_InitStructure.USART_Parity = USART_Parity_No;//無奇偶校驗位
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//無硬件數據流控制
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;	//收發模式

  USART_Init(USART1, &USART_InitStructure); //初始化串口1
  USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//開啓串口接受中斷
  USART_Cmd(USART1, ENABLE);                    //使能串口1 

}

這裏代碼說的很詳細,我也加了註釋了。大家需要注意的是串口的波特率設置,每個設備的波特率設置都不一樣,你需要看產品手冊瞭解需要通信的設備的波特率。只有在波特率相同的情況下才能實現數據的正常通信。當波特率不同傳輸的數據就會是亂碼!

3、串口接受中斷配置

#define USART_BUFF_LEN	100							//定義串口接收BUFF大小
unsigned char Usart_Buff[USART_BUFF_LEN];			//定義串口接收BUFF
unsigned char Usart_Buff_Index = 0;					//定義串口接收BUFF指針
void USART1_IRQHandler(void)                		//串口1中斷服務程序
{
	u8 Res;
	if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收中斷
	{
		Res =USART_ReceiveData(USART1);//讀取接收到的數據
  		Usart_Buff[Usart_Buff_Index++] = Res;//將接收到的數據傳入BUFF,指針++
		if(Usart_Buff_Index > USART_BUFF_LEN)
		Usart_Buff_Index = 0;
    } 
} 

這裏主要是配置串口的接收中斷,我們定義了一個緩存BUFF專門給串口接收做存儲的。
緩存的方式有很多種,這裏用的是環形存儲方式,當數據將buff塞滿時又會從第一個buff覆蓋。
這樣我們可以保證串口在數據接受的時候不會溢出導致軟件崩潰。

4、串口發送

串口的發送就沒這麼多講究了,我們直接調用庫函數給我們的發送函數就可以了。但要注意的是串口要發送的數據,傳入參數需要傳入的數組和傳入的數組長度。如果沒有發送長度串口發送會在遇到第一個截止符號‘0’中斷髮送,有數組長度,串口會根據長度發送準確的數據。

USART_SendData(Data,Date_Len);

4、總結

總的來說,串口配置在STM32裏面配置比較複雜,使用廣泛。希望大家認真讀懂我寫的文章,玩轉STM32還是沒問題的!~

有問題歡迎加 QQ:380390633,樂意給大家答疑~

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