一、前言
GPIO全稱General Purpose Input Output
即通用輸入/輸出,其實GPIO
的本質就是芯片的一個引腳,通常在ARM
中所有的I/O
都是通用的。不過由于每個開發板上都會設計不同的外圍電路,這就造成GPIO
的功能可能有所不同,大部分GPIO
都是有復用功能的,比如有些GPIO
可能是串口的TX
或RX
,也可能是I2C
的SCL
或SDA
線。
所以我們不僅要知道GPIO能夠輸出高低電平,還要理解為什么有些GPIO可以復用某些功能,而其他的不可以。
二、GPIO內部結構
我們在使用GPIO的時候可能不會去想為什么我們通過寫代碼或者操作寄存器就可以控制一個引腳的高低電平。
今天就讓我們一起來看看為什么我們通過操作寄存器(其實寫代碼的過程就是在操作寄存器)就能控制引腳輸入或者輸出。
我們想要想控制一個GPIO口的需要操作7個寄存器,分別是CRL,CRH,IDR,ODR,BRR,BSRR,LCKR
我們對GPIO的操作本質上就是在對這些寄存器進行讀寫操作,以下是這些寄存器的名稱:
GPIOx_CRL(x=A..E)端口配置低寄存器32位寄存器
GPIOx_CRH(x=A..E)端口配置高寄存器32位寄存器
GPIOx_IDR(x=A..E)端口輸入數據寄存器32位寄存器但僅用低16位
GPIOx_ODR(x=A..E)端口輸出數據寄存器32位寄存器但僅用低16位
GPIOx_BRR(x=A..E)端口位清除寄存器16位寄存器
GPIOx_BSRR(x=A..E)端口位設置/清除寄存器16位寄存器
GPIOx_LCKR(x=A..E)端口配置鎖定寄存器32位寄存器
我們首先分析上面的結構電路:
1、保護二極管: 保護二極管從它的名字就不難想到他是用來對系統進行保護的,通過兩個二極管的導通可以防止引腳外部輸入電壓過低或過高。當電壓過高時,上方的保護二極管導通。當電壓過低時,下方的二極管導通,防止不正常電壓導入到芯片內部造成芯片燒毀。
2、P·MOS管和N·MOS管: GPIO經過兩個二極管的保護后向上流入輸入模式,向下流入輸出模式,而輸出模式的控制是由一個由P·MOS管和N·MOS管
組成的單元電路,該電路主要是控制輸出的模式,由該結構狗策劃給你的單元電路具有推挽輸出和開漏輸出兩種模式。
當系統配置為推挽輸出模式時:
-
若向該結構中輸入高電平,經過反向后,上方的
P-MOS
導通,下方的N-MOS
關閉,對外輸出高電平; -
若向該結構中輸入低電平時,經過反向后,下方的
N-MOS
管導通,上方的P-MOS
關閉,對外輸出低電平。 -
當引腳高低電平切換時,兩個
MOS
管輪流導通,P
管負責灌電流,N
管負責拉電流,使其負載能力和開關速度都比普通的方式有很大的提高。**推挽輸出的低電平為0V
,高電平為3.3V
**。
當系統配置為開漏輸出模式時:
-
上方的P-MOS管完全不工作;
-
如果我們控制輸出為0,低電平,則
P-MOS
管關閉,N-MOS
管導通,使輸出接地; -
若控制輸出為
1
(它無法直接輸出高電平)時,則P-MOS
管和N-MOS
管都關閉,所以開漏輸出模式下引腳既不輸出高電平,也不輸出低電平,為高阻態。
推挽輸出模式一般應用在輸出電平為0和3.3V而且需要高速切換開關狀態的場合。開漏輸出模式一般應用在I2C、SMBUS通信等需要 線與
功能的總線電路中。
在單片機中除了必須用開漏模式的場合,一般習慣使用推挽輸出模式
3、輸出數據寄存器:前面我們知道雙了MOS
管結構電路的輸入信號,是由GPIO
輸出數據寄存器GPIOx_ODR
提供的,因此我們可以通過修改輸出數據寄存器的值,就可以修改GPIO
引腳的輸出電平。而置位/復位寄存器GPIOx_BSRR
可以通過修改輸出數據寄存器的值,從而影響電路的輸出。
4、復用功能輸出:復用功能輸出中的復用
是指STM32
的其他片上外設對GPIO
引腳進行控制,此時GPIO
引腳用作該外設功能的一部分,算是第二用途。從其他外設引出來的復用功能輸出信號與GPIO
本身的數據寄存器都連接到雙MOS
管結構的輸入中。
三、輸入輸出模式
GPIO共有8中輸入輸出模式,分別是:上拉輸入、下拉輸入、浮空輸入、模擬輸入、開漏輸出、推挽輸出、開漏復用輸出、推挽復用輸出
,下面我們詳細介紹以下上面的八種輸入輸出模式。
-
上拉輸入:
GPIO_Mode_IPU
-
下拉輸入:
GPIO_Mode_IPD
-
浮空輸入:
GPIO_Mode_IN_FLOATING
-
模擬輸入:
GPIO_Mode_AIN
-
開漏輸出:
GPIO_Mode_Out_OD
-
推挽輸出:
GPIO_Mode_Out_PP
-
開漏復用:
GPIO_Mode_AF_OD
-
推完復用:
GPIO_Mode_AF_PP
這里詳細講一下幾個常用的模式:
3.1 浮空輸入
浮空輸入模式下,I/O
端口的電平信號直接進入輸入數據寄存器。也就是說,I/O的電平狀態是不確定的,完全由外部輸入決定;如果在該引腳懸空(在無信號輸入)的情況下,讀取該端口的電平是不確定的,通常用于IIC
、USART
等總線設備上。
3.2 上拉輸入模式
上拉輸入模式下,I/O
端口的電平信號直接進入輸入數據寄存器。但是在I/O
端口懸空(在無信號輸入)的情況下,輸入端的電平保持在高電平(并且在I/O
端口輸入為低電平的時候,輸入端的電平也是低電平)
3.3 下拉輸入模式
下拉輸入模式下,I/O
端口的電平信號直接進入輸入數據寄存器。但是在I/O
端口懸空(在無信號輸入)的情況下,輸入端的電平保持在低電平;并且在I/O端口輸入為高電平的時候,輸入端的電平也是高電平。
3.4 模擬輸入模式
模擬輸入模式下,I/O
端口的模擬信號(電壓信號,而非電平信號)直接模擬輸入到片上外設模塊,比如ADC
模塊等。
3.5 開漏輸出模式
見上面二中的詳細介紹;
3.6 開漏復用輸出模式
開漏復用輸出模式,與開漏輸出模式很是類似。只是輸出的高低電平的來源,不是讓CPU直接寫輸出數據寄存器,取而代之利用片上外設模塊的復用功能輸出來決定的,一般用于片內外設功能:TX1,MOSI,MISO,SCK,SS
3.7 推挽輸出模式
見上面二中的詳細介紹;
3.8 推挽復用輸出模式
推挽復用輸出模式,與推挽輸出模式很是類似。只是輸出的高低電平的來源,不是讓CPU直接寫輸出數據寄存器,而是利用片上外設模塊的復用功能輸出來決定的,常見采用推挽輸出模式的一般為片內外設功能IIC
的SCL
、SDL
。
四、開漏輸出和推挽輸出的區別
開漏輸出和推挽輸出模式的區別主要是開漏輸出只可以輸出強低電平,高電平得靠外部電阻拉高。輸出端相當于三極管的集電極,適合于做電流型的驅動,其吸收電流的能力相對強(一般20ma以內);推挽輸出可以輸出強高、低電平,連接數字器件。
五、STM32中GPIO的配置
在固件庫開發中,操作寄存器 CRH
和 CRL
來配置 IO
口的模式和速度是通過 GPIO
初始化函數完成:
voidGPIO_Init(GPIO_TypeDef*GPIOx,GPIO_InitTypeDef*GPIO_InitStruct);
/*第一個參數是用來指定 GPIO,取值范圍為 GPIOA~GPIOG。
*第二個參數為初始化參數結構體指針,結構體類型為GPIO_InitTypeDef
*/
初始化 GPIO 的常用格式是:
GPIO_InitTypeDefGPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5;//LED0--PB.5端口配置
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//推挽輸出
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//速度50MHz
GPIO_Init(GPIOB,GPIO_InitStructure);//根據設定參數配置GPIO
IO
口速度設置有三個可選值:
typedefenum
{
GPIO_Speed_10MHz,
GPIO_Speed_2MHz,
GPIO_Speed_50MHz
}GPIOSpeed_TypeDef;
模式則有8個可選定義如下:
typedefenum
{GPIO_Mode_AIN=0x0,//模擬輸入
GPIO_Mode_IN_FLOATING=0x04,//浮空輸入
GPIO_Mode_IPD=0x28,//下拉輸入
GPIO_Mode_IPU=0x48,//上拉輸入
GPIO_Mode_Out_OD=0x14,//開漏輸出
GPIO_Mode_Out_PP=0x10,//通用推挽輸出
GPIO_Mode_AF_OD=0x1C,//復用開漏輸出
GPIO_Mode_AF_PP=0x18//復用推挽
}GPIOMode_TypeDef;
六、總結
本文主要介紹了GPIO的定義和GPIO不同模式間的區別與實現方式,觀看完本文相信你對于GPIO會有一個更深的理解,我們如果是做軟件的可以不用太關注于GPIO是如何實現的,但是我們需要知道每個模式下GPIO的特點和應用場合,只有這樣我們在實際應用中才能更好的配置出最合適的那個。
審核編輯 :李倩
-
芯片
+關注
關注
456文章
51062瀏覽量
425810 -
寄存器
+關注
關注
31文章
5360瀏覽量
120867 -
GPIO
+關注
關注
16文章
1216瀏覽量
52248
原文標題:關于GPIO你真的懂了嗎?這篇文章都給你整理好了!
文章出處:【微信號:嵌入式悅翔園,微信公眾號:嵌入式悅翔園】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論