GPIO
(General-purpose input/output)
GPIO
(General-purpose input/output)
1、4種輸入模式
(1)GPIO_Mode_IN_FLOATING 浮空輸入
(2)GPIO_Mode_IPU 上拉輸入
(3)GPIO_Mode_IPD 下拉輸入
(4)GPIO_Mode_AIN 模擬輸入
2、4種輸出模式
(5)GPIO_Mode_Out_OD 開汲極輸出(帶上拉或者下拉)
(6)GPIO_Mode_AF_OD 複用開汲極輸出(帶上拉或者下拉)
(7)GPIO_Mode_Out_PP 推輓輸出(帶上拉或者下拉)
(8)GPIO_Mode_AF_PP 複用推輓輸出(帶上拉或者下拉)
3、4種最大輸出速度
(1)400KHZ (低速)
(2)2MHZ (中速)
(3)10MHZ (快速)
(4)40MHZ (高速)
我們所用到的每一個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低電平導通,高電平關閉
浮空輸入模式下,I/O端口的電平信號直接進入輸入數據寄存器。MCU直接讀取I/O口電平,I/O的電平狀態是不確定的,完全由外部輸入決定;如果在該引腳懸空(在無信號輸入)的情況下,讀取該端口的電平是不確定的。 (接用電壓表測量其引腳電壓爲1點幾伏,這是個不確定值) 以用來做KEY識別
上拉輸入模式
IO內部接上拉電阻,此時如果IO口外部沒有信號輸入或者引腳懸空,IO口默認爲高電平 如果I/O口輸入低電平,那麼引腳就爲低電平,MCU讀取到的就是低電平
STM32的內部上拉是"弱上拉",即通過此上拉輸出的電流是很弱的,如要求大電流還是需要外部上拉。
下拉輸入模式
IO內部接下拉電阻,此時如果IO口外部沒有信號輸入或者引腳懸空,IO口默認爲低電平 如果I/O口輸入高電平,那麼引腳就爲高電平,MCU讀取到的就是高電平
當GPIO引腳用於ADC採集電壓的輸入通道時,用作"模擬輸入"功能,此時信號不經過施密特觸發器,直接直接進入ADC模塊,並且輸入數據暫存器爲空 ,CPU不能在輸入數據暫存器上讀到接腳狀態
當GPIO用於模擬功能時,接腳的上、下拉電阻是不起作用的,這個時候即使配置了上拉或下拉模式,也不會影響到模擬信號的輸入輸出
除了 ADC 和 DAC 要將 IO 配置爲模擬通道之外其他外設功能一律 要配置爲複用功能模式,
在開汲極輸出模式時,只有N-MOS工作,如果我們控制輸出爲0,低電平,則P-MOS關閉,N-MOS導通,使輸出低電平,I/O端口的電平就是低電平,若控制輸出爲1時,高電平,則P-MOS和N-MOS都關閉,輸出指令就不會起到作用,此時I/O端口的電平就不會由輸出的高電平決定,而是由I/O端口外部的上拉或者下拉決定 如果沒有上拉或者下拉 IO口就處於懸空狀態
並且此時施密特觸發器是打開的,即輸入可用,通過輸入數據寄存器GPIOx_IDR可讀取I/O的實際狀態。,I/O口的電平不一定是輸出的電平
在推輓輸出模式時,N-MOS和P-MOS都工作,如果我們控制輸出爲0,低電平,則P-MOS關閉,N-MOS導通,使輸出低電平,I/O端口的電平就是低電平,若控制輸出爲1 高電平,則P-MOS導通N-MOS關閉,使輸出高電平,I/O端口的電平就是高電平, 外部上拉和下拉的作用是控制在沒有輸出時IO口電平
此時施密特觸發器是打開的,即輸入可用,通過輸入數據暫存器GPIOx_IDR可讀取I/O的實際狀態。I/O口的電平一定是輸出的電平
GPIO複用爲其他外設,輸出數據寄存器GPIOx_ODR無效; 輸出的高低電平的來源於其它外設,施密特觸發器打開,輸入可用,通過輸入數據暫存器可獲取I/O實際狀態 除了輸出信號的來源改變 其他與開汲極輸出功能相同
GPIO複用爲其他外設(如 I2C、SPI),輸出數據寄存器GPIOx_ODR無效; 輸出的高低電平的來源於其它外設,施密特觸發器打開,輸入可用,通過輸入數據暫存器可獲取I/O實際狀態 除了輸出信號的來源改變 其他與開汲極輸出功能相同
在STM32中選用IO模式:
上拉輸入、下拉輸入可以用來檢測外部信號;例如,按鍵等;
模擬輸入 ——應用ADC模擬輸入,或者低功耗下省電
開汲極輸出一般應用在I2C、SMBUS通訊等需要"線與"功能的匯流排電路中。
推輓輸出模式一般應用在輸出電平爲0和3.3伏而且需要高速切換開關狀態的場合。在STM32的應用中,除了必須用開汲極模式的場合,我們都習慣使用推輓輸出模式。
複用功能的推輓輸出_AF_PP ——片內外設功能(I2C的SCL,SDA)
複用功能的開汲極輸出_AF_OD——片內外設功能(TX1,MOSI,MISO.SCK.SS)
GPIO的主要暫存器
每個GPIO埠都有
-兩個32位配置暫存器(GPIOx_CRL , GPIOx_CRH)
-兩個32位資料暫存器(GPIOx_IDR 和 GPIOx_ODR)
-一個32位置位/復位暫存器(GPIOx_BSRR)
-一個16位復位暫存器(GPIOx_BRR)
-一個32位鎖定暫存器(GPIOx_LCKR)
每個I/O埠位可以自由程式設計,然而I/O埠暫存器必須按32位字被訪問(不允許半字或位元組訪問)
埠配置低暫存器(GPIOx_CRL)
埠配置高暫存器(GPIOx_CRH)
埠輸入資料暫存器(GPIOx_IDR)
埠輸出資料暫存器(GPIOx_ODR)