三、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
版權聲明:本文原創發表於 博客園,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則視為侵權。