三、STM8的學習筆記-----GPIO操作


三、STM8的學習筆記-----GPIO操作

3.1.前言

3.2.對STM8的GPIO介紹

3.3.簡單操作單個IO口

3.4.模式介紹

3.5.例程

3.6.結尾

 

 

 

 

3.1.前言

STM8系列是意法半導體公司生產的8位的單片機。該型號單片機分為STM8A、STM8S、STM8L三個系列。本次學習我采用的STM8S103這塊板;

在我的學習過程中,學習單片機,首先得知道如何控制它的GPIO口。關於GPIO共有12種工作模式,如果理解了這12種工作模式,那么在GPIO的學習過程中也會事半功倍。

 

3.2.對STM8的GPIO介紹

GPIO(英文:General-purpose input/output),通用型之輸入輸出的簡稱。其引角可以供使用者由程序控制並自由使用,通過對PIN腳的初始化可以實現通用輸入(GPI)或者輸出(GPO)或通用輸入輸出(GPIO)。

 

3.3.簡單操作單個I/O口

STM8系列的單片機每一個端口都有一個輸出數據寄存器(ODR),一個引腳輸入寄存器(IDR),一個數據方向寄存器(DDR)。任何一個I/O引腳可以通過對DDR,ODR,CR1,CR2寄存器的相應位進行編程來配置。一個I/O口在工作是輸入還是輸出取決於該口數據方向寄存器的狀態,對常用的幾個寄存器介紹如下:

 

1、端口x數據方向寄存器(Px_DDR)

地址偏移值:0x20

復位值:0x00

 

 

 Px_DDR寄存器用於配置I/O口的輸入輸出模式,如果要點亮led燈,則需把與led燈相連的口配置成輸出模式,如把PD4口的DDR寄存器置1,寄存器的配置如上圖所示,即 PD_DDR|=0x01;就是DDR與十六進制10(00010000)相或。任何數與0相或都不變,與1相或則為1,所以相或有置位的效果,從右邊低位0開始算起,第五個口剛好是PD4口,所以就是將PD4設置為輸出模式。

2、端口x輸出數據寄存器(Px_ODR) 

地址偏移量:0x00

復位值:0x00

 

 該寄存器通常只在IO口配置成輸出時起作用,ODR寄存器里的值,表示輸出模式下,IO口引腳上的值。所以,要想把IO口里某個或多個引腳置高或置低,只需操作ODR即可,寄存器如上圖所示。

3、端口x輸入寄存器(Px_IDR)

地址偏移值:0x03

復位值:0x00

 

 當IO口配置為輸入時,可從此寄存器中讀取當前IO口的狀態值。

4、端口x控制寄存器1(Px_CR1)

地址偏移值:0x03

復位值:0x00

 

   通常,模擬開漏輸出需要外接上拉電阻,驅動能力較強,推挽輸出不需要外接電阻,驅動能力較弱,對於led燈的點亮,推挽輸出模式足以,所以 通常將IO口設置為推挽輸出模式,當然設置為開漏輸出模式的時候,在學習的過程中可能會遇到。

5、端口x控制寄存器2(Px_CR2)

地址偏移值:0x04

復位值:0x00

 

 CR2控制寄存器多用來在輸入模式下控制外部中斷,在輸出模式下作用不大。至此,我們已經把所有的GPIO口的寄存器都了解完了。

 

6、硬件連接原理

 

操作單個IO口,以點亮LED燈為例子,只需要配置PD4口就好

將下列代碼放置在主函數中

 

PD_DDR |=0x10;     //將PD.4設置為輸出模式
PD_CR1|=0x10;;     //將PD.4設置為推挽輸出模式
PD_CR2 &= ~0x10; //設置PD.4輸出速率最大為2MHZ
PD_ODR |=0x10;    //即PD.4=1
while(1)

 

 操作單個IO口就簡單講到這里

 

 

下面就來了解STM8的12種I/O模式,在官方官方IAR例程中的庫文件stm8s_gpio.h文件中可以找到,STM8全部的I\O模式。

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

 

 

3.4.模式介紹

1.浮空輸入(Input Floating)

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

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

 

2.上拉輸入(Input pull-up)

 

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

 

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

 

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。        

 

開漏輸出就是不輸出電壓,低電平時接地,高電平時不接地。如果外接上拉電阻,則在輸出高電平時電壓會拉到上拉電阻的電源電壓。這種方式適合在連接的外設電壓比單片機電壓低的時候。輸出端出跟集電極開路十分相似,工作原理也是一樣的。不同的是,開漏輸出使用的場效應管,使用時要加上拉電阻。

 

 

 

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的電源低定。

 

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。

 

 

6.初始電平

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

 

3.5.例程

1.編譯環境

我的編譯環境是IAR,這款軟件是現在STM8的主流平台,比較推薦。

 

2.主芯片

本次學習我采用的STM8S103這塊芯片其中STM8S的003、005、和103、105,配置一樣(外設和CPU頻率,FLASH),在代碼相同的情況下均可進行燒寫。

5.3 代碼

GPIO.H

 #define Led_Opt_Pin GPIO_PIN_5
 #define Led_Opt_GPIO_Port GPIOB

 

 GPIO.C

/*******************************************************************************
* Function Name  : MX_GPIO_Init
* Description    : GPIO_Init
* Input          : None
* Output         : None
* Return         : None
********************************************************************************/
void MX_GPIO_Init(void)
{
  //LED                                    模式為推挽高速輸出
  GPIO_Init(Led_Opt_GPIO_Port,Led_Opt_Pin, GPIO_MODE_OUT_PP_HIGH_FAST);
 
}

/*******************************************************************************
* Function Name  : GPIO_TogglePin
* Description    : None
* Input          : None
* Output         : None
* Return         : None
********************************************************************************/
void GPIO_TogglePin(GPIO_TypeDef* GPIOx, GPIO_Pin_TypeDef GPIO_Pin)
{
 
  GPIOx->ODR ^= GPIO_Pin;
 
}
最后在主函數里調用一下就可以了。

 

 LED燈滅

 

LED燈亮

 

3.6.結尾

以上的代碼是使用庫函數開發的,控制LED燈。

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

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

 本博客轉載了一部分浩宇99的博文,大家如果有興趣也可以前往下方鏈接去查看浩宇99的博客。

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


免責聲明!

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



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