STM32F103ZET6函數
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 複用推輓輸出ui
一、一圖記住上拉、下拉、浮空輸入模式:
code
原理分析:圖中箭頭表示信號流動方向。從I/O引腳向左沿着箭頭方向,首先遇到兩個開關和電阻,與VDD相連的稱爲上拉電阻,與Vss相連的稱爲下拉電阻,再鏈接到施密特觸發器(信號轉換)把電壓信號轉化爲0、1的數字信號,存儲在輸入數據寄存器(IDR)。而後經過設置配置寄存器(CRL、CRH)控制這兩個開關,因而就能夠獲得GPIO的上拉輸入、下拉輸入模式和浮空輸入模式,浮空就是既不接上拉也不接下拉。在上拉/下拉/浮空輸入模式中,輸出緩衝器被禁止(P-MOS和N-MOS),施密特觸發器輸入被激活,根據輸入配置(上拉,下拉或浮動)的不一樣,弱上拉和下拉電阻被鏈接,讀輸入數據寄存器的值可獲得I/O狀態。blog
小結:圖片
二、一張圖記住模擬輸入:
it
原理分析:圖中箭頭表示信號流動方向。能夠看出模擬輸入模式關閉了施密特觸發器,也不接上、下拉電阻,經由另外一線路把電壓信號傳送到片上外設模塊。如傳送給 ADC 模數轉換模塊,由ADC 採集電壓信號。因此使用 ADC外設時,必須設置爲模擬輸入模式。在此模式中,輸出緩衝器被禁止,禁止施密特觸發輸入,實現了每一個模擬I/O引腳上的零消耗,施密特觸發輸出值被強制置爲0,弱上拉和下拉電阻被禁止,讀取輸入數據寄存器時數值爲0。io
小結:模擬輸入模式把圖中的紅色字體部分都禁止了。注意:GPIO在輸入模式下是不須要設置端口的最大輸出速度的。原理
一、一張圖記住開漏和推輓輸出模式:
配置
原理分析:
開漏輸出:圖中箭頭表示信號流動方向。若是往輸出數據寄存器寫入0,由於N-MOS是接地的,低電平信號會激活N-MOS,因此輸出的IO口引腳爲低電平。可是反過來是不成立的(另外一個模式才能夠),你確定會想,若是寫入1,P-MOS接電源,因此輸出1,不是這樣的。開漏輸出模式P-MOS從不被激活,因此開漏模式只能夠輸出強低電平,高電平得靠外部電阻拉高,要獲得高電平狀態須要上拉電阻才行。
推輓輸出:輸出數據寄存器上的0激活N-MOS,I/O口輸出低電平;而輸出數據寄存器上的1將激活P-MOS,I/O口輸出高電平。兩個管子輪流導通,一個負責灌電流,一個負責拉電流,使其負載能力和開關速度都比普通方式有很大提升。
小結:開漏就是推輓的二分之一。開漏模式只能夠輸出強低電平。
二、一張圖記住開漏複用和推輓複用輸出:
當I/O端口被配置爲複用功能時,其餘配置跟開漏和推輓同樣的,只不過開漏和推輓是由CPU來寫,而複用就是外設來寫0和1。至於選擇複用開漏輸出仍是複用推輓輸出,是根據 GPIO 複用功能來選擇的,如 GPIO 的引腳用做串口輸出,則使用複用推輓輸出模式;如用在I2C、SMBUS 等這些須要「線與」功能的複用場合,就使用複用開漏模式。
小結:複用是外設來寫0和1。
每一組IO口都有如下7個寄存器
- GPIOx_CRL:端口配置低寄存器(32位) - GPIOx_CRH:端口配置高寄存器(32位) - GPIOx_IDR:端口輸入寄存器(32位) - GPIOx_ODR:端口輸出寄存器(32位) - GPIOx_BSRR:端口位設置/清除寄存器(32位) - GPIOx_BRR:端口位清除寄存器(16位) - GPIOx_LCKR:端口配置鎖存寄存器(32位)不經常使用
一、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;
二、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)。
三、端口位 設置/清除寄存器(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);
四、端口位清除寄存器(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積分資料!