基於STM8的UART發送和中斷接收---STM8-第二章


1. 綜述

  UART的基礎知識,通用異步收發傳輸器(Universal Asynchronous Receiver/Transmitter),通常稱作UART,是一種異步收發傳輸器。

  做軟件開發的人都知道打印信息的重要,說到打印信息,我們就不得不說UART串口打印。做單片機開發的人,打印信息主要的來源就是UART串口打印。因此,UART會比較常用到,所以在此對UART串口進行一個說明。

 

2. 關於STM8S103手冊的UART簡介

 

 

3. UART初始化參數詳細講解

3.1 BaudRate(波特率)

  所謂的波特率就是每秒鍾傳送的碼元符號的個數,可以理解為串口的輸出速率。可選的波特率有很多,常用的波特率有115200bps,9600bps等...

 

3.2 WordLength(數據長度)

  即為傳輸的數據轉成二進制后有多少位。可選的數據位數:8位、9位,常用的數據位數為8位。

 

3.3 StopBits(停止位)

  即為數據幀的尾部傳輸停止位個數。可選的停止位:0.5位、1位、1.5位、2位,常用的停止位為1位。

 

3.4 Parity(奇偶校驗)

  即為輸出結果是否經過奇偶校驗,根據被傳輸的一組二進制代碼的數位中“1”的個數是奇數或偶數來進行校驗。可選的奇偶校驗:奇校驗、偶校驗、不進行奇偶校驗。常用的為不進行奇偶校驗。

 

3.5 SyncMode(同步模式 )(本博客對此模式只進行一個粗略講解,如想深入了解,請察看官方的手冊。)

    通信時雙方是否有共同的時鍾參考,能否通過時鍾參考准確收發數據。可選擇的模式有很多,常用的模式為 同步模式禁用,SLK PIN禁用。

 

3.6 Mode(UART模式)

  可選的模式:接收使能、接收不使能、發送使能、發送不使能、發送接收都使能。常用的模式為發送接收都使能。

  

4. 例程

4.1 編譯環境

  我的編譯環境是IAR,這款軟件是現在STM8的主流平台,比較推薦。不過我打算等到STCubeMX更新出比較方便的版本后再去使用Keil5,因為我在用STM32的時候就是利用Keil5,的確很方便,你們也可以學着用一下。

 

4.2 主芯片

  我的主芯片是STM8S系列中的103,其中STM8S的003、005、和103、105,配置一樣(外設和CPU頻率,FLASH),在代碼相同的情況下均可進行燒寫。

 

4.3 庫文件的添加

我們的工程可以在IAR中的官方例程中復制,操作過程:打開STM8S_StdPeriph_Lib(這是一個官方的庫文件,下載IAR STM8包的時候就攜帶,里面有庫文件和相對應的例程),將Libraries文件復制到你工程所在的文件下,並將有關於ADC的庫文件添加到你的工程列表當中。添加完成后,就可以開始編寫代碼了(如果你將全部的庫文件都添加進來的話,編譯程序后庫文件還有紅點報錯的話,這是因為你選的芯片上沒有該功能,你需要將其刪掉才能不報錯。)如圖。

                   

 

4.4 代碼

4.4.1 UART初始化

 

  我們所要用到的IO口和Uart都需要初始化,而IO的初始化就比較簡單,具體步驟可以參考我上一篇博客,UART的初始化就需要到stm8s_uart1.c庫文件中找到相對應的函數進行調用才能初始化成功。該庫文件中的大部分函數都有一定意義和價值,大家可以根據需求進行調用,我這里就不進行一一細述了。

  下面是串口初始化的函數。

 1 /*******************************************************************************
 2 * Function Name  : MX_UART1_Init
 3 * Description    : UART1_Init
 4 * Input          : None
 5 * Output         : None
 6 * Return         : None
 7 ********************************************************************************/
 8 void MX_UART1_Init(void)
 9 {
10   //初始化UART中的所有寄存器
11   UART1_DeInit();
12   
13   //發送接收引角口初始化
14   GPIO_Init(Uart_TX_GPIO_Port, Uart_TX, GPIO_MODE_OUT_PP_HIGH_FAST);
15   GPIO_Init(Uart_RX_GPIO_Port, Uart_RX, GPIO_MODE_IN_PU_IT);  
16   
17   //UART的參數初始化
18   UART1_Init(115200, UART1_WORDLENGTH_8D, UART1_STOPBITS_1, UART1_PARITY_NO, UART1_SYNCMODE_CLOCK_DISABLE, UART1_MODE_TXRX_ENABLE);
19   
20   //UART中斷使能
21   UART1_ITConfig(UART1_IT_RXNE_OR, ENABLE);
22   
23   //使能UART
24   UART1_Cmd(ENABLE);
25   
26   //中斷使能
27   enableInterrupts(); 
28   
29 }

 

擴展一下基本知識就是:起始位 +數據(8位) +停止位(這里沒有校驗位)。
所以我們傳輸一個字節數據要用到10個位。這樣算下來 115200/10 = 11520 字節/s。(即速度為11520 B/s)

通俗一點的說的話,KB是1024個B,11520 (B/S) / 1024 = 11.25KB/S就是我們這個功能所擁有的速度了。

這個是為了讓你知道它的速度局限在哪里。因此來做一些它所力所能及的事情。

4.4.2 發送

  我們使用的是unsigned char類型的數據,所以要在stm8s_uart1.c文件里找到UART1_SendData8(uint8_t Data)函數然后放在main函數里調用就行,然后發送字符串的話,我們需要用到此函數。此函數在庫函數中沒有,所以需要我們手動添加進去,不過也相當於該庫文件的一個功能,我們可以直接將此函數放進庫文件里面,位置就放在發送函數UART1_SendData8(uint8_t Data)的下面即可。

 1 /**
 2   * @brief  Transmits 8 bit *data through the UART peripheral.
 3   * @param  Data: the data to transmit.
 4   * @retval None
 5   */
 6 void UART1_SendWord(uint8_t *Data)
 7 {
 8     while(*Data)
 9     {
10         UART1_SendData8(*Data++);
11         while(!UART1_GetFlagStatus(UART1_FLAG_TXE));
12     }
13     
14 }

 

 

這里直接調用這兩個函數便可實現發送。不過,發送的數據0x31是十六進制數,轉成10十進制后為49,即為1的ASCII值。

1     UART1_SendData8(0x31);
2     UART1_SendWord("國維不行"); 

 

 

實驗結果:

 

4.4.2 中斷接收

1    if(UART1_GetITStatus(UART1_IT_RXNE) != RESET)        //檢查指定的UART1中斷是否發生。 
2    {
3      UART1_SendData8(UART1_ReceiveData8());             //將接收的數據再用串口發送出去
4      UART1_ClearITPendingBit(UART1_IT_RXNE);            //清除UART1掛起標志
5    }

 

由於IAR中庫函數工程模板的中斷都寫在 stm8s_it.c 庫文件中,我們需要打開將上面的代碼加入函數內部中,如圖。

如果不懂的如何操作中斷函數,請看這里:我們只需要在中斷的庫函數里面添加代碼即可,不用在主函數中對該中斷函數進行調用,只要我們使能中斷,系統會自動幫我們運行該函數的。

注意:這里的中斷處理有芯片型號的區分,如果不是STM8S103芯片請自行選擇相對應的芯片的中斷處理函數。

 

實驗結果:

 

5. 結尾

  相對來說,STM8庫文件的UART調用還是比較容易的,希望該博客能夠幫助到大家實現UART功能。

  對STM8的UART的說明和引用到這里結束,感謝各位看官的點擊。

  如果覺得有所收獲請點下推薦,若認為該博客中存在錯誤的說明或者對博客中某方面有疑問請留言。

 

作 者:浩宇99✌
出 處:https://www.cnblogs.com/zhenghaoyu/p/10698471.html
版權聲明:本文原創發表於 博客園,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則視為侵權。

 

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM