STM32F3 GPIO的八種模式及工作原理
一、GPIO簡介
GPIO(英語:General-purpose input/output),通用型之輸入輸出的簡稱,簡單來說就是STM32可控制的引腳,STM32晶片的GPIO引腳與外部設備連接起來,從而實現與外部通訊、控制以及數據採集的功能。STM32晶片的GPIO被分成很多組,每組有16個引腳,所有的GPIO引腳都有基本的輸入輸出功能。
最基本的輸出功能是由STM32控制引腳輸出高、低電平,實現開關控制,如把GPIO引腳接入LED燈,那就可以控制LED燈的亮滅,引腳接入到繼電器或三極體,那就可以通過繼電器或三極體控制外部大功率電路的通斷。
最基本的輸入功能是檢測外部電平,如把GPIO引腳連接到按鍵,通過電平高低區分按鍵是否被按下。
二、GPIO的工作模式
- 4種輸入模式
- GPIO_Mode_IN_FLOATING 浮空輸入
- GPIO_Mode_IPU 上拉輸入
- GPIO_Mode_IPD 下拉輸入
- GPIO_Mode_AIN 模擬輸入
- 4種輸出模式
- GPIO_Mode_Out_OD 開漏輸出(帶上拉或者下拉)
- GPIO_Mode_AF_OD 復用開漏輸出(帶上拉或者下拉)
- GPIO_Mode_Out_PP 推挽輸出(帶上拉或者下拉)
- GPIO_Mode_AF_PP 復用推挽輸出(帶上拉或者下拉)
- 3種最大輸出速度
- 2MHZ
- 10MHZ
- 50MHZ
三、GPIO框圖剖析
我們所用到的每一個GPIO其內部結構都是這樣,分別對應著GPIO的八種模式 這裡我們簡單的介紹下:
- 保護二極體: IO引腳上下兩邊兩個二極體用於防止引腳外部過高、過低的電壓輸入,當引腳電壓高於VDD_FT時,上方的二極體導通,當引腳電壓低於VSS時,下方的二極體導通,防止不正常電壓引入晶片導致晶片燒毀
- 上拉、下拉電阻(輸入驅動器中):控制引腳默認狀態的電壓,開啟上拉的時候引腳默認電壓為高電平,開啟下拉的時候引腳默認電壓為低電平
- TTL施密特觸發器(輸入驅動器中):基本原理是當輸入電壓高於正向閾值電壓,輸出為高;當輸入電壓低於負向閾值電壓,輸出為低;IO口訊號經過觸發器後,模擬訊號轉化為0和1的數字訊號 也就是高低電平 並且是TTL電平協議 這也是為什麼STM32是TTL電平協議的原因
- P-MOS管和N-MOS管(輸出暫存器中):訊號由P-MOS管和N-MOS管,依據兩個MOS管的工作方式,使得GPIO具有「推挽輸出」和「開漏輸出」的模式 P-MOS管高電平導通,低電平關閉,下方的N-MOS低電平導通,高電平關閉
注意: VDD_FT 代表IO口,兼容3.3V和5V,如果沒有標註「FT」,就代表著只支援3.3V 。在晶片手冊中可以查看支援5V的引腳:
-
浮空輸入模式
注意:浮空輸入模式下,I/O的電平狀態是不確定的,完全由外部輸入決定;如果在該引腳懸空(在無訊號輸入)的情況下,讀取該埠的電平是不確定的 -
上拉輸入模式
注意:上拉輸入模式下,IO口默認為高電平 -
下拉輸入模式
注意:下拉輸入模式下,IO口默認為低電平 -
模擬輸入模式
注意:模擬輸入模式下,訊號不經過施密特觸發器,直接直接進入ADC模組,所以CPU不能讀取輸入暫存器上的引腳狀態。除了ADC和DAC要將 IO 配置為模擬通道之外其他外設功能一律 要配置為用功能模式。 -
開漏輸出模式
注意:在開漏輸出模式時,只有N-MOS管工作,如果我們控制輸出為0,則P-MOS管關閉,N-MOS管導通,使輸出低電平,若控制輸出為1時,則P-MOS管和N-MOS管都關閉,輸出指令就不會起到作用而是由
I/O埠外部的上拉或者下拉決定,如果沒有上拉或者下拉 IO口就處於懸空狀態。 -
推挽輸出模式(帶上拉)
注意:在推挽輸出模式時,N-MOS管和P-MOS管都工作,如果控制輸出為0,則P-MOS管關閉,N-MOS管導通,若控制輸出為1,則P-MOS管導通N-MOS管關閉。 -
復用開漏輸出
注意:復用開漏輸出下,GPIO復用為其他外設,輸出數據暫存器GPIOx_ODR無效; 輸出的高低電平的來源於其它外設, -
復用推挽輸出(帶上拉)
注意:復用推挽輸出下,GPIO復用為其他外設,輸出數據暫存器GPIOx_ODR無效; 輸出的高低電平的來源於其它外設,
輸出模式下施密特觸發器是打開的,所以mcu是可以讀取到I/O口的實際狀態。
-
開漏輸出和推挽輸出的區別:
推挽輸出:可以輸出強高低電平,連接數字器件,推挽結構一般是指兩個三極體分別受兩互補訊號的控制,總是在一個三極體導通的時候另一個截止。
開漏輸出:可以輸出強低電平,高電平得靠外部電阻拉高,才能實現輸出高電平,適合用做電流型的驅動,其吸收電流的能力相對強(一般20ma以內)。 -
F4系列與F1系列區別:
本質上的區別是F4系列採用了Cortex-M4內核 而F1系列採用Cortex-M3內核
F1系列(M3)IO口基本結構:
F4系列(M4)IO口基本結構:
四、 暫存器介紹
STM32 的每個 IO 埠都有 7 個暫存器來控制,他們分別是:配置模式的 2 個 32 位的埠配置暫存器 CRL 和 CRH;2 個 32 位的數據暫存器 IDR 和 ODR;1 個 32 位的置位/複位暫存器BSRR;一個 16 位的複位暫存器 BRR;1 個 32 位的鎖存暫存器 LCKR;這裡我們僅介紹常用的幾個暫存器,我們常用的 IO 埠暫存器只有 4 個:CRL、CRH、IDR、ODR。
- 配置模式CRL和CRH暫存器
從圖中可以看出配置GPIO的模式需要4位進行配置,分辨是兩位CNFy和兩位MODEy進行配置,因為每組GPIO都有16個引腳,而STM32是32位的,所以一個暫存器無法完成一組GPIO的配置,其中CRL配置 0 ~ 7 引腳,CRH配置 8 ~ 15 引腳。
- 比如我們要設置 PORTB 的 12 位為推挽輸出 ,5 位為上拉輸入。
//配置PB5為上拉輸入
GPIOB->CRH &= 0XFF0FFFFF; //清掉這5引腳位原來的設置,同時也不影響其他位的設置
GPIOB->CRH |= 0X00800000; // 配置PB5上拉輸入
GPIOB->ODR= 1<<5; //PB5 上拉
//配置PB12為推挽輸出
GPIOB->CRH &= 0XFFF0FFFF; //清掉這12引腳位原來的設置,同時也不影響其他位的設置
GPIOB->CRH |= 0X00030000; // 配置PB12推挽輸出
-
埠輸入數據暫存器IDR
-
埠輸出數據暫存器ODR
-
埠位設置/清除暫存器BSRR
-
埠位清除暫存器BRR
-
埠配置鎖定暫存器LCKR
五、編寫程式
上面介紹了GPIO的8中工作模式以及GPIO的暫存器使用,那麼在控制GPIO之前需要配置GPIO的工作模式,這是STM32和51單片存在區別的地方。51單片的引腳功能是確定的,而STM32的引腳都是可以復用的,程式配置GPIO的方式有兩種,一種是通過庫文件的方法進行配置,另一種是通過暫存器進行配置,由於庫文件的配置方式比較簡單,網上也有很多文章講解,這裡我以暫存器為例進行學習。
注意:STM32的所用引腳都可以用於中斷
程式是基於之前創建的項目模板(暫存器版)中進行更改即可,沒創建過STM32項目的小夥伴瀏覽之前的STM32新建模板之庫文件和STM32新建模板之庫文件。
- 更改main.c文件為一下內容即可
#include "stm32f10x.h"
#include "sys.h"
/*------------------------------------------------------------
主函數
------------------------------------------------------------*/
int main()
{
RCC->APB2ENR|=0X0000001c;//先使能外設IO PORTa,b,c時鐘
RCC->APB2ENR |= 1 << 12;
GPIOB->CRH=0X00030000; //設置GPIOB的12引腳為推挽輸出
while (1)
{
delay_ms(100);
GPIOB->ODR = ~(1 << 12); //設置12引腳輸出0
delay_ms(100);
GPIOB->ODR |= 1 << 12; //設置12引腳輸出1
}
}
- 這是一個led閃爍的程式,編譯下載運行即可。
參考文獻
STM32F4 GPIO八種模式及工作原理詳解://blog.csdn.net/as480133937/article/details/98063549
STM32-GPIO詳解://blog.csdn.net/dnfestivi/article/details/104984813
《STM32中文參考手冊》