GPIO即通用輸入/輸出 (General Purpose Input Output)
包括:
兩個32位的配置寄存器 GPIOx->CRL,GPIOx->CRH
兩個32位的數(shù)據(jù)寄存器 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)
開漏輸出(Output open-drain)—— 輸出邏輯0,則N-MOS激活; 輸出邏輯1,端口處于高阻(電阻非常大,但不是斷路,此外,P-MOS從未激活)
推挽輸出(Output push-pull)—— 輸出邏輯0,則N-MOS激活;輸出邏輯1,P-MOS激活
復用功能推挽輸出(Alternate function push-pull)——片內(nèi)外設功能(I2C的SCL,SDA)
復用功能開漏輸出(Alternate function open-drain)——片內(nèi)外設功能(USART的TX1,SPI的MOSI,MISO,SCK,SS)
復用開漏輸出、復用推挽輸出:可以理解為GPIO口被用作第二功能時的配置情況(即并非作為通用IO口使用)
注意:I / O端口寄存器被訪問為32位字(半字或字節(jié)存取是不允許的)
其余具體的可以查看stm3210x 手冊
GPIOx->CRL 低位(0-7)端口配置寄存器(x = A~ G,該寄存器偏移地址為:0x00):
GPIOx->CRH 高位(8-15)端口配置寄存器(x = A~ G,該寄存器偏移地址為:0x04):
GPIOx->IDR 端口數(shù)據(jù)輸入寄存器(x = A~ G,該寄存器偏移地址為:0x08):只讀,可以讀取IO口輸入的值
GPIOx->ODR 端口數(shù)據(jù)輸出寄存器(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優(yōu)先級高)
GPIOx->BSR 低位端口配置寄存器(x = A~ G,該寄存器偏移地址為:0x14): 0-15位——為1時,可以使ODRx相應的位清零,為0時,無變化
注:用BSRR和BRR去改變管腳狀態(tài)的時候,沒有被中斷打斷的風險,也就不需要關閉中斷
GPIOx->LCKR 端口配置鎖定寄存器(x = A~ G,該寄存器偏移地址為:0x18):用來鎖定對應位的端口位配置,當端口被鎖定時,不再有可能修改它的值,直到系統(tǒng)復位。每一個鎖都凍結相應的4位控制寄存器(CRL,CRH)
例子:
/*根據(jù)高8位的輸入電平來決定低8位的輸出電平*/
GPIOA->CRL = 0x33333333; //GPIOA.0-GPIO0.7 output push-pull 50MHzGPIOA->CRH = 0x44444444; //GPIOA.8-GPIOA.15 input floating
while(1){if(GPIOA->IDR & 0xff00)GPIOA->ODR = (GPIOA->IDR >> 8) & 0xff;elseGPIOA->ODR = 0;}
-
寄存器
+關注
關注
31文章
5294瀏覽量
119814 -
STM32
+關注
關注
2264文章
10854瀏覽量
354288 -
GPIO
+關注
關注
16文章
1188瀏覽量
51832
原文標題:stm32之GPIO寄存器學習
文章出處:【微信號:mcugeek,微信公眾號:MCU開發(fā)加油站】歡迎添加關注!文章轉載請注明出處。
發(fā)布評論請先 登錄
相關推薦
評論