GPIO即通用輸入/輸出 (General Purpose Input Output)
包括:兩個32位的配置寄存器 GPIOx->CRL,GPIOx->CRH
兩個32位的數據寄存器 GPIOx->IDR,GPIOx->ODR
一個32位的 set/reset 寄存器 GPIOx->BSRR
一位16位的 reset 寄存器 GPIOx->BRR
一位32位的鎖定寄存器 GPIOx->LCKR
端口的模式包括:
浮空輸入(Input floating)—— 即沒有上拉電阻和下拉電阻,電壓呈不確定性,一般用來做ADC輸入用,這樣可以減少上下拉電阻對結果的影響
上拉輸入(Input pull-up)
下拉輸入(Input-pull-down) 
模擬輸入(Analog)
開漏輸出(Output open-drain)—— 輸出邏輯0,則N-MOS激活; 輸出邏輯1,端口處於高阻(電阻非常大,但不是斷路,此外,P-MOS從未激活)
推挽輸出(Output push-pull)—— 輸出邏輯0,則N-MOS激活;輸出邏輯1,P-MOS激活
復用功能推挽輸出(Alternate function push-pull)——片內外設功能(I2C的SCL,SDA)
復用功能開漏輸出(Alternate function open-drain)——片內外設功能(USART的TX1,SPI的MOSI,MISO,SCK,SS)
復用開漏輸出、復用推挽輸出:可以理解為GPIO口被用作第二功能時的配置情況(即並非作為通用IO口使用)
注意:I / O端口寄存器被訪問為32位字(半字或字節存取是不允許的)
其余具體的可以查看stm3210x 手冊
GPIOx->CRL 低位(0-7)端口配置寄存器(x = A~ G,該寄存器偏移地址為:0x00):
GPIOx->CRH 高位(8-15)端口配置寄存器(x = A~ G,該寄存器偏移地址為:0x04):
GPIOx->IDR 端口數據輸入寄存器(x = A~ G,該寄存器偏移地址為:0x08):只讀,可以讀取IO口輸入的值
GPIOx->ODR 端口數據輸出寄存器(x = A~ G,該寄存器偏移地址為:0x0C):可寫可讀,可以設置IO口輸出的值
GPIOx->BSRR 低位端口配置寄存器(x = A~ G,該寄存器偏移地址為:0x10):0-15位——為1時,可以使ODRx相應的位置1,為0時,無變化 。15-31位——為1時,可以使ODRx相應的位清零,為0時,無變化(注:當set和reset都設置了,則set優先級高)
GPIOx->BSR 低位端口配置寄存器(x = A~ G,該寄存器偏移地址為:0x14): 0-15位——為1時,可以使ODRx相應的位清零,為0時,無變化
注:用BSRR和BRR去改變管腳狀態的時候,沒有被中斷打斷的風險,也就不需要關閉中斷
GPIOx->LCKR 端口配置鎖定寄存器(x = A~ G,該寄存器偏移地址為:0x18):用來鎖定對應位的端口位配置,當端口被鎖定時,不再有可能修改它的值,直到系統復位。每一個鎖都凍結相應的4位控制寄存器(CRL,CRH)
例子:
1 /* 2 根據高8位的輸入電平來決定低8位的輸出電平 3 */ 4 5 GPIOA->CRL = 0x33333333; //GPIOA.0-GPIO0.7 output push-pull 50MHz 6 GPIOA->CRH = 0x44444444; //GPIOA.8-GPIOA.15 input floating 7 8 while(1) 9 { 10 if(GPIOA->IDR & 0xff00) 11 GPIOA->ODR = (GPIOA->IDR >> 8) & 0xff; 12 else 13 GPIOA->ODR = 0; 14 }
