stm32之GPIO寄存器學習


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 }

 


免責聲明!

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



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