STM32 GPIO口的配置和應用


STM32F103ZET6

  • 一共有7組IO口(有FT的標識是可以識別5v的)
  • 每組IO口有16個IO
  • 一共16*7=112個IO

4種輸入模式:
(1) GPIO_Mode_AIN 模擬輸入
(2) GPIO_Mode_IN_FLOATING 浮空輸入
(3) GPIO_Mode_IPD 下拉輸入
(4) GPIO_Mode_IPU 上拉輸入

4種輸出模式:
(5) GPIO_Mode_Out_OD 開漏輸出
(6) GPIO_Mode_Out_PP 推挽輸出
(7) GPIO_Mode_AF_OD 復用開漏輸出
(8) GPIO_Mode_AF_PP 復用推挽輸出

四種輸入模式:

1、一圖記住上拉、下拉、浮空輸入模式:
在這里插入圖片描述

原理分析:圖中箭頭表示信號流動方向。從I/O引腳向左沿着箭頭方向,首先遇到兩個開關和電阻,與VDD相連的稱為上拉電阻,與Vss相連的稱為下拉電阻,再連接到施密特觸發器(信號轉換)把電壓信號轉化為0、1的數字信號,存儲在輸入數據寄存器(IDR)。然后通過設置配置寄存器(CRL、CRH)控制這兩個開關,於是就可以得到GPIO的上拉輸入、下拉輸入模式和浮空輸入模式,浮空就是既不接上拉也不接下拉。在上拉/下拉/浮空輸入模式中,輸出緩沖器被禁止(P-MOS和N-MOS),施密特觸發器輸入被激活,根據輸入配置(上拉,下拉或浮動)的不同,弱上拉和下拉電阻被連接,讀輸入數據寄存器的值可得到I/O狀態。

小結:

  1. 上拉輸入:接入上拉電阻,與電源接通,所以默認狀態下讀到的GPIO引腳電平為高電平,即為1
  2. 下拉輸入:接入下拉電阻,與地接通,所以默認狀態下讀到的GPIO引腳電平為低電平,即為0
  3. 浮空輸入:既不接上拉也不接下拉,所以輸入的是高電平就是高電平,低電平就是低電平
  4. 在輸入模式下可以通過ODR寄存器相對應的位來確定具體是上拉還是下拉,0是下拉,1是上拉。

2、一張圖記住模擬輸入:
在這里插入圖片描述

原理分析:圖中箭頭表示信號流動方向。可以看出模擬輸入模式關閉了施密特觸發器,也不接上、下拉電阻,經由另一線路把電壓信號傳送到片上外設模塊。如傳送給 ADC 模數轉換模塊,由ADC 采集電壓信號。所以使用 ADC外設時,必須設置為模擬輸入模式。在此模式中,輸出緩沖器被禁止,禁止施密特觸發輸入,實現了每個模擬I/O引腳上的零消耗,施密特觸發輸出值被強制置為0,弱上拉和下拉電阻被禁止,讀取輸入數據寄存器時數值為0。

小結:模擬輸入模式把圖中的紅色字體部分都禁止了。注意:GPIO在輸入模式下是不需要設置端口的最大輸出速度的。

四種輸出模式:

1、一張圖記住開漏和推挽輸出模式:
在這里插入圖片描述

原理分析:
開漏輸出:圖中箭頭表示信號流動方向。如果往輸出數據寄存器寫入0,因為N-MOS是接地的,低電平信號會激活N-MOS,所以輸出的IO口引腳為低電平。但是反過來是不成立的(另一個模式才可以),你肯定會想,如果寫入1,P-MOS接電源,所以輸出1,不是這樣的。開漏輸出模式P-MOS從不被激活,所以開漏模式只可以輸出強低電平,高電平得靠外部電阻拉高,要得到高電平狀態需要上拉電阻才行。

推挽輸出:輸出數據寄存器上的0激活N-MOS,I/O口輸出低電平;而輸出數據寄存器上的1將激活P-MOS,I/O口輸出高電平。兩個管子輪流導通,一個負責灌電流,一個負責拉電流,使其負載能力和開關速度都比普通方式有很大提高。

小結:開漏就是推挽的二分之一。開漏模式只可以輸出強低電平。

2、一張圖記住開漏復用和推挽復用輸出:
在這里插入圖片描述

當I/O端口被配置為復用功能時,其他配置跟開漏和推挽一樣的,只不過開漏和推挽是由CPU來寫,而復用就是外設來寫0和1。至於選擇復用開漏輸出還是復用推挽輸出,是根據 GPIO 復用功能來選擇的,如 GPIO 的引腳用作串口輸出,則使用復用推挽輸出模式;如用在I2C、SMBUS 等這些需要“線與”功能的復用場合,就使用復用開漏模式。

小結:復用是外設來寫0和1。

GPIO相關寄存器配置

每一組IO口都有以下7個寄存器

 - GPIOx_CRL:端口配置低寄存器(32位)
 - GPIOx_CRH:端口配置高寄存器(32位)
 - GPIOx_IDR:端口輸入寄存器(32位)
 - GPIOx_ODR:端口輸出寄存器(32位)
 - GPIOx_BSRR:端口位設置/清除寄存器(32位)
 - GPIOx_BRR:端口位清除寄存器(16位)
 - GPIOx_LCKR:端口配置鎖存寄存器(32位)不常用

1、CRL和CRH寄存器
這兩個32位寄存器是選擇輸入輸出模式的時候起作用的,每4個位控制一個IO口,一組IO口有16個,所以一共需要64位,CRL管理(0~7)的IO口,CRH管理(8 ~15)的IO口。相應的值在MDK中通過一個枚舉類型定義,只需要選擇對應得值即可。

typedef enum
{ 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;

2、ODR和IDR寄存器
在這里插入圖片描述

ODR寄存器只用到了前面的16位。作用是控制GPIOx(x=A ~ G)的輸出,即設置某個IO口輸出低電平還是高電平,只有在輸出模式下有效。

在固件庫中設置ODR寄存器來控制IO口的輸出狀態是通過這兩個函數來實現的:
void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal);//讀取一組
void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);//讀取幾個

uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);//讀取一組
uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);//讀取幾個
兩個函數功能類似,區別是,前面的函數用來一次讀取一組I/O口所有I/O口輸出狀態
后面的函數用來一次讀取一組I/O口中一個或者幾個I/O口的輸出狀態。

在這里插入圖片描述

IDR寄存器也只用到了前面的16位。該寄存器用於讀取GPIOx的輸入,讀取的某個I/O電平,如果對應的位為0(IDRy=0),則說明該腳輸入為低電平;如果是1(IDRy=1),則表示輸入的是高電平。用於寄存器設置的相關庫函數為:

前面的函數用來讀取一組I/O口的一個或者幾個I/O口輸入電平,后面的函數用來一次讀取一組I/O口中所有I/O口的輸入電平。
uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef*GPIOx,uint16_t GPIO_Pin);//讀取一組
uint16_t GPIO_ReadInputData(GPIO_TypeDef*GPIOx);//讀取幾個
比如要讀取GPIOF.3的輸入電平,方法為:GPIO_ReadInputDataBit(GPIOF,GPIO_Pin_3)。

3、端口位 設置/清除寄存器(GPIOx_BSRR)
在這里插入圖片描述

該寄存器用來置位或復位I/O口,它和ODR寄存器具有類似的作用,都可以用來設置GPIO端口的輸出位是1還是0。如果同時設置了BSy和BRy的對應位,BSy位起作用。其中,對於低16位(0 ~ 15),在相應位ODRy寫1,對應的I/O口會輸出高電平,寫0,則對I/O口沒有任何影響。高16位(16~31)作用剛好相反,對相應的位ODRy寫1會輸出低電平,寫0沒有任何影響。即對於BSRR寄存器,寫0對I/O口電平是沒有任何影響的。要設置某個I/O口電平,只需要設置相關位為1即可。而ODR寄存器要設置某個I/O口電平,首先需要讀出來ODR寄存器的值,然后對整個ODR寄存器重新賦值來達到設置某個或某些I/O口的目的,而BSRR寄存器,就不需先讀,而是直接設置。BSRR 寄存器使用方法如下:

GPIOA->BSRR=1<1;//設置GPIOA.1為高電平
GPIOA->BSRR=1<(16+1);//設置GPIOA.1為低電平

操作BSRR寄存器來設置I/O電平的庫函數為:

//設置一組I/0口中的一個或者多個I/0口為高電平.
void GPIO_SetBits(GPIO_TypeDef * GPIOx, uint16_t GPIO_Pin);

4、端口位清除寄存器(GPIOx_BRR)
在這里插入圖片描述

寄存器用來置位或復位I/O口,即設置GPIO端口輸出低電平。對於低16位(0~15),在相應位ODRy寫1,對應的I/O口會輸出低電平,寫0則對I/O口沒有任何影響。BRR 寄存器使用方法如下:

GPIOA->BRR=0×0001;//設置GPIOA.0為低電平

操作BRR寄存器來設置I/O電平的庫函數為:

//設置一組I/0口中的一個或者多個I/0口為低電平
void GPIO_ResetBits(GPIO_TypeDef*GPIOx,uint16_t GPIO_Pin);

小結:BSRR和BRR寄存器最終也是操作ODR寄存器,BRR的作用相當於BSRR的高16位,一般使用BSRR的低16位和BRR來設置電平,BSRR的高16位很少使用。

歡迎關注我的公眾號:物聯網技術猿
我可以免費幫你下載csdn積分資料!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM