基於STM8的GPIO操作---STM8-第一章


1. 綜訴

也許單片機在你看來是一件不太容易的事,但據我所知,單片機,無非就是控制它的GPIO口,所以可以看出,學會如何操作控制GPIO口對使用單片機來說是很重要的一件事。

在裝載STM8的單片機中,I/O共有12種工作模式。實際上這里的概念也是和STM32等其他單片機,理解了這12種狀態,也就基本上理解了大部分I/O口。

 

2. STM8S103的GPIO介紹

GPIO(英文:General-purpose input/output),通用型之輸入輸出的簡稱,其引角可以供使用者由程控自由使用,PIN腳依現實參考量可作為通用輸入(GPI)或者輸出(GPO)或通用輸入輸出(GPIO)。

 

打開官方IAR例程中的庫文件stm8s_gpio.h文件中可以找到,STM8全部的I\O模式

 1 typedef enum
 2 {
 3   GPIO_MODE_IN_FL_NO_IT      = (uint8_t)0x00,  /*!< Input floating, no external interrupt */
 4   GPIO_MODE_IN_PU_NO_IT      = (uint8_t)0x40,  /*!< Input pull-up, no external interrupt */
 5   GPIO_MODE_IN_FL_IT         = (uint8_t)0x20,  /*!< Input floating, external interrupt */
 6   GPIO_MODE_IN_PU_IT         = (uint8_t)0x60,  /*!< Input pull-up, external interrupt */
 7   GPIO_MODE_OUT_OD_LOW_FAST  = (uint8_t)0xA0,  /*!< Output open-drain, low level, 10MHz */
 8   GPIO_MODE_OUT_PP_LOW_FAST  = (uint8_t)0xE0,  /*!< Output push-pull, low level, 10MHz */
 9   GPIO_MODE_OUT_OD_LOW_SLOW  = (uint8_t)0x80,  /*!< Output open-drain, low level, 2MHz */
10   GPIO_MODE_OUT_PP_LOW_SLOW  = (uint8_t)0xC0,  /*!< Output push-pull, low level, 2MHz */
11   GPIO_MODE_OUT_OD_HIZ_FAST  = (uint8_t)0xB0,  /*!< Output open-drain, high-impedance level,10MHz */
12   GPIO_MODE_OUT_PP_HIGH_FAST = (uint8_t)0xF0,  /*!< Output push-pull, high level, 10MHz */
13   GPIO_MODE_OUT_OD_HIZ_SLOW  = (uint8_t)0x90,  /*!< Output open-drain, high-impedance level, 2MHz */
14   GPIO_MODE_OUT_PP_HIGH_SLOW = (uint8_t)0xD0   /*!< Output push-pull, high level, 2MHz */
15 }GPIO_Mode_TypeDef;

 

在芯片資料中我們可以看到,I/O口的基本結構如下:

 

由於我們使用庫函數開發,因此本文就不再解釋具體的寄存器操作了,如想了解請察看STM8芯片的手冊。

 

3. 模式介紹

3.1 浮空輸入(Input Floating)

  浮空輸入在 I\O 模式中帶有 IN_FL 字眼,如:GPIO_MODE_IN_FL_NO_IT 、GPIO_MODE_IN_FL_IT。

  浮空輸入也叫懸浮輸入,一般把浮空輸入和上拉輸入做類比學習。浮空輸入的電平不確定的,即使外部的一個很小的輸入信號都會使其發生改變。如果引腳設置為懸空的情況下,讀取該端口的電平是不確定的。

 

3.2 上拉輸入(Input pull-up)

  上拉輸入在 I\O 模式中帶有 IN_PU 字眼,如:GPIO_MODE_IN_PU_NO_IT 、GPIO_MODE_IN_PU_IT。

  上拉輸入的時候,引腳內部有一個上拉電阻通過開關連接到電源VDD, 當引腳沒有和外部電路連接時,設置上拉輸入方式的I/O引腳電平是確定的高電平。

 

3.3 開漏輸出(Output open-drain)

  開漏輸入在 I\O 模式中帶有 OUT_OD 字眼,如:GPIO_MODE_OUT_OD_LOW_FAST 、GPIO_MODE_OUT_OD_LOW_SLOW 、 GPIO_MODE_OUT_OD_HIZ_FAST 、 GPIO_MODE_OUT_OD_HIZ_SLOW。        

  開漏輸出就是不輸出電壓,低電平時接地,高電平時不接地。如果外接上拉電阻,則在輸出高電平時電壓會拉到上拉電阻的電源電壓。這種方式適合在連接的外設電壓比單片機電壓低的時候。輸出端出跟集電極開路十

分相似,工作原理也是一樣的。不同的是,開漏輸出使用的場效應管,使用時要加上拉電阻。

 

3.4 推挽輸出(Output push-pull)

  推挽輸入在 I\O 模式中帶有 Output push-pull 字眼,如:GPIO_MODE_OUT_PP_LOW_FAST 、 GPIO_MODE_OUT_PP_LOW_SLOW 、 GPIO_MODE_OUT_PP_HIGH_FAST 、GPIO_MODE_OUT_PP_HIGH_SLOW。

  推挽輸出可以輸出高,低電平,連接數字器件; 推挽結構一般是指兩個三極管分別受兩互補信號的控制,總是在一個三極管導通的時候另一個截止。高低電平由IC的電源低定。

 

3.5 中斷和輸出速度

  中斷在 I\O 模式中帶有 IT 字眼。中斷只存在 I\O 輸入中,因為在輸出中設置中斷也沒有任何意義。中斷的意思就是中止當前的工作,然后去執行另外的任務,執行完之后再回來執行原來的任務。

  輸出速度也只存在 I\O 輸出中,可以調整 I\O 的輸出速度來將它們進行等級划分,如:low level,10MHz、low level,2MHz、high-impedance level,10MHz、high level,10MHz、high-impedance level, 2MHz、high level, 2MHz。

 

 3.6 初始電平

  我們初始化GPIO時候,會有一個初始電平的操作,例如GPIO_MODE_OUT_OD_LOW_FAST,GPIO_MODE_OUT_OD_HIZ_FAST,GPIO_MODE_OUT_PP_HIGH_FAST中,含有LOW、HIZ、HIGH,分別為低電平、高阻抗電平、高電平三種狀態。

  

4. 例程

4.1 編譯環境:

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

 

4.2 主芯片:

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

 

4.3 代碼

  先在頭文件里定義相對應的LED引角參數。

1 /* Define --------------------------------------------------------------------*/
2 
3 /*LED*/ 
4 #define Led_Opt_Pin GPIO_PIN_5
5 #define Led_Opt_GPIO_Port GPIOB

  在主函數調用MX_GPIO_Init()函數初始 I\O 的引角,再調用GPIO_TogglePin()函數對 I\O 進行一個翻轉,直接將一個LED燈進行翻轉的話則可以看到明顯的變化。

 1 /*******************************************************************************
 2 * Function Name  : MX_GPIO_Init
 3 * Description    : GPIO_Init
 4 * Input          : None
 5 * Output         : None
 6 * Return         : None
 7 ********************************************************************************/
 8 void MX_GPIO_Init(void)
 9 {
10   //LED                                    模式為推挽高速輸出
11   GPIO_Init(Led_Opt_GPIO_Port,Led_Opt_Pin, GPIO_MODE_OUT_PP_HIGH_FAST);
12   
13 }
14 
15 
16 /*******************************************************************************
17 * Function Name  : GPIO_TogglePin
18 * Description    : None
19 * Input          : None
20 * Output         : None
21 * Return         : None
22 ********************************************************************************/
23 void GPIO_TogglePin(GPIO_TypeDef* GPIOx, GPIO_Pin_TypeDef GPIO_Pin)
24 {
25   
26   GPIOx->ODR ^= GPIO_Pin;
27   
28 }

 

        

             LED滅                                              LED亮

5. 結尾

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

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

 

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

 


免責聲明!

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



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