GPIOx_CRL :端口配置低寄存器 (控制P0--P7端口)
一個IO位占4個位(4*8=32)P0--P7剛好32位,例如:P0端口:0-1控制輸入模式或者輸出模式及輸出速度,2-3控制輸入模式或者輸出模式的具體工作方式

GPIOx_CRH:端口配置高寄存器 (控制P8--P15端口)
一個IO位占4個位(4*8=32)P8--P15剛好32位,例如:P8端口:0-1控制輸入模式或者輸出模式及輸出速度,2-3控制輸入模式或者輸出模式的具體工作方式

GPIOx_IDR:端口輸入寄存器
一個位控制一個IO口,0--15對應P0--P15
(注意:IDR寄存器低16位,每個位控制該組IO的一個IO口。對應的是IO口的輸入電平)
GPIOx_ODR:端口輸出寄存器
一個位控制一個IO口,0--15對應P0--P15
(注意:ODR寄存器跟IDR寄存器相反,是控制IO口輸出。低16位每個位控制一個IO口的輸出電平的高低。)

輸入模式的上下拉輸入到底是上拉還是下拉由端口輸出寄存器ODR決定。在輸入模式時,可設置ODR寄存器的第一位來決定上拉還是下拉

GPIOx_BSRR:端口位設置/清除寄存器
低16位(0--15)是置位,當對應位為1時對應端口置1,對應位為0時對應端口置不受影響
高16位(16--31)是復位,當對應位為1時對應端口置0,對應位為0時對應端口置不受影響
高低位同時作用時,則只有低16位起作用!

GPIOx_BRR :端口位清除寄存器
低16位對應16個端口,作用和GPIOx_BSRR的高16位一樣,都是復位清除功能
低16位(0--15)是復位,當對應位為1時對應端口置0,對應位為0時對應端口置不受影響

GPIOx_LCKR:端口配置鎖存寄存器
4種輸入模式: 輸入浮空
輸入上拉
輸入下拉
模擬輸入
4種輸出模式: 開漏輸出
開漏復用功能
推挽式輸出
推挽式復用功能
浮空輸入狀態下,IO的電平狀態是不確定的,完全由外部輸入決定(輸入達到條件就觸發),如果在該引腳懸空的情況下,讀取該端口的電平是不確定的。
4.開漏復用功能GPIO_AF_OD——片內外設功能(TX1,MOSI,MISO.SCK.SS)
GPIO整理后可分為三類:
1. 輸入模式(模擬/浮空/上拉/下拉):在輸入模式時,施密特觸發器打開,輸出被禁止,可通過輸入數據寄存器 GPIOx_IDR讀取 I/O 狀態。其中輸入模式,可設置為上拉、下拉、浮空和模擬輸入四種。上拉和下拉輸入很好理解,默認的電平由上拉或者下拉決定。浮空輸入的電平是不確定的,完全由外部的輸入決定,一般接按鍵的時候用的是浮空輸入。模擬輸入則用於 ADC 采集。
2. 輸出模式(推挽/開漏):在輸出模式中,推挽模式時雙 MOS 管以輪流方式工作,輸出數據寄存器GPIOx_ODR可控制 I/O 輸出高低電平。開漏模式時,只有 N-MOS 管工作,輸出數據寄存器可控制I/O輸出高阻態或低電平。輸出速度可配置,有 2MHz\10MHz\50MHz 的選項。此處的輸出速度即 I/O 支持的高低電平狀態最高切換頻率,支持的頻率越高,功耗越大,如果功耗要求不嚴格,把速度設置成最大即可。
在輸出模式時施密特觸發器是打開的,即輸入可用,通過輸入數據寄存器 GPIOx_IDR可讀取 I/O 的實際狀態。
3.復用功能(推挽/開漏):復用功能模式中,輸出使能,輸出速度可配置,可工作在開漏及推挽模式,但是輸出信號源於其它外設,輸出數據寄存器 GPIOx_ODR 無效;輸入可用,通過輸入數據寄存器可獲取 I/O 實際狀態,但一般直接用外設的寄存器來獲取該數據信號。
應用場合
①上拉輸入、下拉輸入可以用來檢測外部信號,例如按鍵等。
②浮空輸入模式,由於輸入阻抗較大,一般把這種模式用於標准通信協議的I2C、USART的接收端。
③普通推挽輸出模式一般應用在輸出電平為0和3.3V的場合<。而普通開漏輸出模式一般應用在電平不匹配的場合,如需要輸出5V的高電平,就需要在外部一個上拉電阻。電源為5V,把GPIO設置為開漏模式,當輸出高阻態時,由上拉電阻和電源向外輸出5V電平。
④對於相應的復用模式,復用輸出來源片上外設,則是根據GPIO的復用功能來選擇,如GPIO的引腳用作串口的輸出(USART/SPI/CAN),則使用復用推挽輸出模式。如果用在I2C、SMBUS這些需要線與功能的復用場合,就使用復用開漏模式。
⑤在使用任何一種開漏模式時,都需要接上拉電阻。
1、作為普通GPIO輸入:根據需要配置該引腳為浮空輸入、帶弱上拉輸入或帶弱下拉輸入,同時不要使能該引腳對應的所有復用功能模塊。
2、作為普通GPIO輸出:根據需要配置該引腳為推挽輸出或開漏輸出,同時不要使能該引腳對應的所有復用功能模塊。
3、作為普通模擬輸入:配置該引腳為模擬輸入模式,同時不要使能該引腳對應的所有復用功能模塊。
4、作為內置外設的輸入:根據需要配置該引腳為浮空輸入、帶弱上拉輸入或帶弱下拉輸入,同時使能該引腳對應的某個復用功能模塊。
5、作為內置外設的輸出:根據需要配置該引腳為復用推挽輸出或復用開漏輸出,同時使能該引腳對應的所有復用功能模塊。
//初始化PB5為輸出口.並使能這個端口的時鍾 //LED IO初始化 void LED_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //使能PB端口時鍾 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //LED0-->PB.5 端口配置 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽輸出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度為50MHz GPIO_Init(GPIOB, &GPIO_InitStructure); //根據設定參數初始化GPIOB.5 GPIO_SetBits(GPIOB,GPIO_Pin_5); //PB.5 輸出高 }
GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_1); //讀取PA1的輸入電平
GPIO_ReadInputData(GPIOA); //讀取PA端口16位的輸入數據
GPIO_ReadOutputDataBit( GPIOA, GPIO_Pin_1); //讀取PA1的輸出電平
GPIO_ReadOutputData(GPIOA); //讀取PA端口16位的輸出數據
