STM32F3 GPIO的八種模式及工作原理

一、GPIO簡介

    GPIO(英語:General-purpose input/output),通用型之輸入輸出的簡稱,簡單來說就是STM32可控制的引腳,STM32晶片的GPIO引腳與外部設備連接起來,從而實現與外部通訊、控制以及數據採集的功能。STM32晶片的GPIO被分成很多組,每組有16個引腳,所有的GPIO引腳都有基本的輸入輸出功能。
    最基本的輸出功能是由STM32控制引腳輸出高、低電平,實現開關控制,如把GPIO引腳接入LED燈,那就可以控制LED燈的亮滅,引腳接入到繼電器或三極體,那就可以通過繼電器或三極體控制外部大功率電路的通斷。
    最基本的輸入功能是檢測外部電平,如把GPIO引腳連接到按鍵,通過電平高低區分按鍵是否被按下。

二、GPIO的工作模式

  1. 4種輸入模式
  • GPIO_Mode_IN_FLOATING 浮空輸入
  • GPIO_Mode_IPU 上拉輸入
  • GPIO_Mode_IPD 下拉輸入
  • GPIO_Mode_AIN 模擬輸入
  1. 4種輸出模式
  • GPIO_Mode_Out_OD 開漏輸出(帶上拉或者下拉)
  • GPIO_Mode_AF_OD 復用開漏輸出(帶上拉或者下拉)
  • GPIO_Mode_Out_PP 推挽輸出(帶上拉或者下拉)
  • GPIO_Mode_AF_PP 復用推挽輸出(帶上拉或者下拉)
  1. 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的引腳:
  1. 浮空輸入模式

    注意:浮空輸入模式下,I/O的電平狀態是不確定的,完全由外部輸入決定;如果在該引腳懸空(在無訊號輸入)的情況下,讀取該埠的電平是不確定的

  2. 上拉輸入模式

    注意:上拉輸入模式下,IO口默認為高電平

  3. 下拉輸入模式

    注意:下拉輸入模式下,IO口默認為低電平

  4. 模擬輸入模式

    注意:模擬輸入模式下,訊號不經過施密特觸發器,直接直接進入ADC模組,所以CPU不能讀取輸入暫存器上的引腳狀態。除了ADC和DAC要將 IO 配置為模擬通道之外其他外設功能一律 要配置為用功能模式。

  5. 開漏輸出模式

    注意:在開漏輸出模式時,只有N-MOS管工作,如果我們控制輸出為0,則P-MOS管關閉,N-MOS管導通,使輸出低電平,若控制輸出為1時,則P-MOS管和N-MOS管都關閉,輸出指令就不會起到作用而是由
    I/O埠外部的上拉或者下拉決定,如果沒有上拉或者下拉 IO口就處於懸空狀態。

  6. 推挽輸出模式(帶上拉)

    注意:在推挽輸出模式時,N-MOS管和P-MOS管都工作,如果控制輸出為0,則P-MOS管關閉,N-MOS管導通,若控制輸出為1,則P-MOS管導通N-MOS管關閉。

  7. 復用開漏輸出

    注意:復用開漏輸出下,GPIO復用為其他外設,輸出數據暫存器GPIOx_ODR無效; 輸出的高低電平的來源於其它外設,

  8. 復用推挽輸出(帶上拉)

    注意:復用推挽輸出下,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。

  1. 配置模式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推挽輸出

  1. 埠輸入數據暫存器IDR

  2. 埠輸出數據暫存器ODR

  3. 埠位設置/清除暫存器BSRR

  4. 埠位清除暫存器BRR

  5. 埠配置鎖定暫存器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中文參考手冊》

Tags: