一. 前言
??GPIO全稱General Purpose Input Output,是微控制數(shù)字輸入/輸出的基本模塊,可以實現(xiàn)微控制器與外部環(huán)境的數(shù)字進行交換。借助GPIO微控制器可以實現(xiàn)對外圍設備(像控制led亮滅,按鍵控制,軟件模擬IIC等)直觀又簡單的控制。
GPIO的8種模式
?1. 輸入模式:
??(1)上拉輸入模式 GPIO_Mode_IPU
??(2)下拉輸入模式 GPIO_Mode_IPD
??(3)模擬輸入模式 GPIO_Mode_AIN
??(4)浮空輸入模式 GPIO_Mode_IN_FLOATING
2. 輸出模式:
??(1)推挽輸出模式 GPIO_Mode_Out_PP
??(2)開漏輸出模式 GPIO_Mode_Out_OD
??(3)復用推挽輸出模式 GPIO_Mode_AF_PP
??(4)復用開漏輸出模式 GPIO_Mode_AF_OD
3. 最大輸出速度:
??(1)2MHz GPIO_Speed_2MHz
??(2)25MHz GPIO_Speed_25MHz
??(3)50MHz GPIO_Speed_50MHz
二. 輸入模式
輸入驅動器
??GPIO的輸入驅動器主要由TTL肖特基觸發(fā)器、帶開關的上拉電阻和帶開關的下拉電阻組成,GPIO的輸入驅動器沒有多路選擇開關,輸入信號送到GPIO輸入數(shù)據(jù)寄存器的同時,送給了片上外設,所以GPIO的輸入沒有復用功能選項。
1. 上拉輸入模式
??上拉就是把當前引腳的電位拉高,比如拉到VDD。弱上拉和強上拉的區(qū)別只是上拉電阻的阻值不同。
??輸出緩沖器被禁止,TTL施密特觸發(fā)輸入被激活,此時圖中GPIO內部上拉電阻端的開關閉合,接通VDD,下拉電阻端開關斷開。此時引腳默認輸入為高電平。
2. 下拉輸入模式
??下拉就是把當前引腳的電位拉低,比如拉到GND。
??輸出緩沖器被禁止,TTL施密特觸發(fā)輸入被激活,此時圖中GPIO內部下拉電阻端的開關閉合,接通VSS,上拉電阻端開關斷開。此時引腳默認輸入為低電平。
3. 模擬輸入模式
??應用于ADC模擬輸入,或者是低功耗下的省電。
??輸出緩沖器被禁止,TTL施密特觸發(fā)輸入被禁止。
4. 浮空輸入模式
??浮空就是GPIO輸入引腳即不接高電平,也不接低電平。由于邏輯器件的內部結構,當它輸入引腳懸空時,相當于該引腳接了高電平。實際運用時,引腳不建議懸空,容易受到干擾。
輸出緩沖器被禁止,TTL施密特觸發(fā)輸入被激活,GPIO內部下拉電阻端的開關斷開,上拉電阻端開關也斷開。
三. 輸出模式
輸出驅動器
GPIO的輸出驅動器主要由多路選擇器、輸出控制邏輯和一對互補的MOS管組成。多路選擇器是根據(jù)用戶的設置決定某個引腳是輸出還是復用功能輸出。輸出控制邏輯和一對互補的MOS管是根據(jù)用戶的設置通過控制P-MOS管和N-MOS管的導通還是斷開決定GPIO是開漏、推挽輸出模式還是關閉。
1. 推挽輸出模式
??推挽輸出既可以輸出高電平,也可以輸出低電平,連接數(shù)字器件。推挽輸出的結構一般是指兩個三極管分別受到兩個互補信號的控制,在一個三極管被導通的時候另一個三極管被截止。輸出的高點電平則是由IC的電源決定。
2. 開漏輸出模式
??開漏模式一般用在IIC等需要“線與”功能的總線電路中,除此之外,還可以用在電平不匹配的場合,像需要輸出5V的高電平就可以在外部接入一個上拉電阻,上拉電源為5v,并把GPIO設置為開漏模式,當輸出高阻態(tài)時,由上拉電源向外部輸出5V的電平。
在開漏輸出時,只有N-MOS會參與工作,上方的P-MOS管完全不工作。當輸出控制為0(低電平)時,P-MOS管關閉,N-MOS管導通,使得輸出GND。當輸出控制為1(高電平)時,P-MOS管和N-MOS管全部關閉,引腳既不輸出高電平也不輸出低電平,此時呈現(xiàn)一個高阻態(tài)。正常使用的情況下,必須接一個上拉電阻,若不接上拉電阻,則引腳只能輸出低電平。
??在推挽輸出時,施密特觸發(fā)器是打開的,即輸入可用,通過輸入數(shù)據(jù)寄存器GPIOx_IDR可讀取I/O的實際狀態(tài)。
3. 復用推挽輸出模式
??GPIO復用為其他外設(IIC的SCL,SDA)。除了輸出信號的來源改變 ,其他操作與推挽輸出的功能相同。
4. 復用開漏輸出模式
??GPIO復用為其他外設(TX1,MOSI,MISO,SCK,SS)。除了輸出信號的來源改變 ,其他操作與開漏輸出的功能相同。
四. GPIO的選用
當作為普通GPIO輸入:根據(jù)需要配置該引腳為浮空、上拉或下拉輸入,同時不使能該引腳對應的所有復用功能模塊。
當作為普通GPIO輸出:根據(jù)需要配置該引腳為推挽輸出或開漏輸出,同時不使能該引腳對應的所有復用功能模塊。
當作為普通模擬輸入:配置該引腳為模擬輸入模式,同時不使能該引腳對應的所有復用功能模塊。
當作為內置外設的輸入:根據(jù)需要配置該引腳為浮空、上拉或下拉輸入,同時使能該引腳對應的某個復用功能模塊。
當作為內置外設的輸出:根據(jù)需要配置該引腳為復用推挽輸出或復用開漏輸出,同時使能該引腳對應的所有復用功能模塊。
五. 有關GPIO輸入/輸出模式的初始化(F1系列 HAL庫函數(shù))
?GPIO_InitTypeDef 類型的結構體
typedef struct{ uint32_t Pin; /*!<指定要配置的GPIO引腳。該參數(shù)可以是@ref GPIO_pins_define 的任意值 */ uint32_t Mode; /*!<指定所選引腳的工作模式。該參數(shù)可以是@ref GPIO_mode_define 的值 */ uint32_t Pull; /*!< 指定所選引腳的上拉或下拉激活。該參數(shù)可以是@ref GPIO_pull_define的值 */ uint32_t Speed; /*!< 指定所選引腳的速度。該參數(shù)可以是@ref GPIO_speed_define的值 */} GPIO_InitTypeDef;
可以選擇的GPIO引腳
/** @defgroup GPIO_pins_define GPIO pins define * @{ */#define GPIO_PIN_0 ((uint16_t)0x0001) /* Pin 0 selected */#define GPIO_PIN_1 ((uint16_t)0x0002) /* Pin 1 selected */#define GPIO_PIN_2 ((uint16_t)0x0004) /* Pin 2 selected */#define GPIO_PIN_3 ((uint16_t)0x0008) /* Pin 3 selected */#define GPIO_PIN_4 ((uint16_t)0x0010) /* Pin 4 selected */#define GPIO_PIN_5 ((uint16_t)0x0020) /* Pin 5 selected */#define GPIO_PIN_6 ((uint16_t)0x0040) /* Pin 6 selected */#define GPIO_PIN_7 ((uint16_t)0x0080) /* Pin 7 selected */#define GPIO_PIN_8 ((uint16_t)0x0100) /* Pin 8 selected */#define GPIO_PIN_9 ((uint16_t)0x0200) /* Pin 9 selected */#define GPIO_PIN_10 ((uint16_t)0x0400) /* Pin 10 selected */#define GPIO_PIN_11 ((uint16_t)0x0800) /* Pin 11 selected */#define GPIO_PIN_12 ((uint16_t)0x1000) /* Pin 12 selected */#define GPIO_PIN_13 ((uint16_t)0x2000) /* Pin 13 selected */#define GPIO_PIN_14 ((uint16_t)0x4000) /* Pin 14 selected */#define GPIO_PIN_15 ((uint16_t)0x8000) /* Pin 15 selected */#define GPIO_PIN_All ((uint16_t)0xFFFF) /* All pins selected */ #define GPIO_PIN_MASK 0x0000FFFFu /* PIN mask for assert test *//** * @} */
可以選擇的GPIO引腳模式
/** @defgroup GPIO_mode_define GPIO mode define * @{ */#define GPIO_MODE_INPUT 0x00000000u /*!< 輸入模式 */#define GPIO_MODE_OUTPUT_PP 0x00000001u /*!< 推挽輸出模式 */#define GPIO_MODE_OUTPUT_OD 0x00000011u /*!< 開漏輸出模式 */#define GPIO_MODE_AF_PP 0x00000002u /*!< 復用推挽輸出模式 */#define GPIO_MODE_AF_OD 0x00000012u /*!< 復用開漏輸出模式 */#define GPIO_MODE_AF_INPUT GPIO_MODE_INPUT /*!< 復用功能輸入模式 */ #define GPIO_MODE_ANALOG 0x00000003u /*!< 模擬輸入模式 */ #define GPIO_MODE_IT_RISING 0x10110000u /*!< 上升沿觸發(fā)檢測的外部中斷模式 */#define GPIO_MODE_IT_FALLING 0x10210000u /*!< 下降沿觸發(fā)檢測的外部中斷模式 */#define GPIO_MODE_IT_RISING_FALLING 0x10310000u /*!< 上升/下降沿觸發(fā)檢測的外部中斷模式 */ #define GPIO_MODE_EVT_RISING 0x10120000u /*!< 上升沿觸發(fā)檢測的外部事件模式 */#define GPIO_MODE_EVT_FALLING 0x10220000u /*!< 下降沿觸發(fā)檢測的外部事件模式 */#define GPIO_MODE_EVT_RISING_FALLING 0x10320000u /*!< 上升/下降沿觸發(fā)檢測的外部事件模式 *//** * @} */
可以選擇的GPIO引腳上拉/下拉激活
/** @defgroup GPIO_pull_define GPIO pull define * @brief GPIO Pull-Up or Pull-Down Activation * @{ */#define GPIO_NOPULL 0x00000000u /*!< 沒有激活上拉或下拉 */#define GPIO_PULLUP 0x00000001u /*!< 上拉激活 */#define GPIO_PULLDOWN 0x00000002u /*!< 下拉激活 *//** * @} */
可以選擇的GPIO引腳的速度
/** @defgroup GPIO_speed_define GPIO speed define * @brief GPIO Output Maximum frequency * @{ */#define GPIO_SPEED_FREQ_LOW (GPIO_CRL_MODE0_1) /*!< Low speed 低速 */#define GPIO_SPEED_FREQ_MEDIUM (GPIO_CRL_MODE0_0) /*!< Medium speed 中速 */#define GPIO_SPEED_FREQ_HIGH (GPIO_CRL_MODE0) /*!< High speed 高速 *//** * @} */
審核編輯 黃宇
-
STM32
+關注
關注
2270文章
10895瀏覽量
355728 -
GPIO
+關注
關注
16文章
1204瀏覽量
52051
發(fā)布評論請先 登錄
相關推薦
評論