每個GPIO埠有兩個32位配置寄存器(GPIOx_CRL,GPIOx_CRH)分別控制每個埠的高八位和低八位,如果IO口是0-7號的話,則寫CRL寄存器,如果IO口是8-15號的話,則寫CRH寄存器,兩個32位數據寄存器(GPIOx_IDR,GPIOx_ODR)一個是只讀作輸入數據寄存器,一個是只寫作輸出寄存器,一個32位置位/復位寄存器(GPIOx_BSRR),一個16位復位寄存器(GPIOx_BRR)和一個32位鎖定寄存器(GPIOx_LCKR)。常用的IO埠寄存器只有四個:CRH,CRL,IDR,ODR。
本文引用地址:
http://www.eepw.com.cn/article/201611/323042.htm數據手冊中列出的每個I/O埠的特定硬體特徵, GPIO埠的每個位可以由軟體分別配置成多種模式。每個I/O埠位可以自由編程,然而I/0埠寄存器必須按32位字被訪問(不允許半字或字節訪問)。
另外,STM32的每個埠使用前都要將其時鐘使能,STM32的GPIO的時鐘統一掛接在APB2上,具體的使能寄存器為RCC_APB2ENR,該寄存器的第2位到第8位分別控制GPIOx(x=A,B,C,D,E,F,G)埠的時鐘使能,當外設時鐘沒有啟用時,程序不能讀出外設寄存器的數值,如打開PORTA時鐘:
RCC->APB2ENR|=1<<2;
使能外設時鐘後,GPIOA的十六位就可以按照設定的狀態工作了,之後就是具體設置哪一位了以第八位為例即高位的首位,在GPIOx_CRH寄存器中進行設置,GPIOA的每一位都有該寄存器的四位來設定相應的參數,這四位中的高兩位(CNF0,CNF1)設置GPIO的輸入輸出模式,低兩位(MODE0,MODE1)是設置GPIO的輸出頻率,具體可以參考STM32參考手冊。
GPIOA->CRH&=0XFFFFFFF0;
GPIOA->CRH|=0X00000003;//PA8 推輓輸出
十六進位中的3 換成二進位 00 11 前兩位00表示推輓輸出,11代表輸出頻率50Mhz,若CRH|=0x4,表示模擬輸入模式(ADC用),0x3表示推輓輸出模式(作輸出口用,50M速率),0x8表示上/下拉輸入模式(做輸入口用),0xB表示復用輸出(使用IO口的第二功能,50M速率)。
這是對一位的操作,當然也可以多位操作,因為STM32對GPIO操作必須是32位全字操作,設置完成後GPIOA的第8位就可以使用了之後給GPIOA->ODR=0x xxxx xxxx送數據就行了
STM32單片機,有了埠才能和外界聯繫,學會了埠控制,才能更好地利用外設。建立和外界的聯繫,發揮自身的優點。
>1,
這個寄存器主要是對配置管腳是輸入還是輸出:
其中1)MODEy[1:0]主要是配置是輸入埠還是輸出埠的。配置為輸出得時候還可以配置輸出的管腳速度等級。
總得來說,就是MODEy[1:0] 先配置管腳是輸入還是輸出,是輸入就繼續配置CNFy[1:0]來配置輸出管腳的連接模式。要是輸出的話,就繼續配置MODEy[1:0]的管腳速度速度等級,之後再配置管腳的連接模式。上拉,下拉,推免,開漏等等。具體運用的時候看看手冊就明白了。
>2,
和GPIOX_CRH 完全一樣,只是埠換成高8位了。不說了,看看就明白了!
>3,
學過AVR的都知道,輸出的時候有輸出數據寄存器,STM32也一樣。思想COPY過來,就自然知道了GPIOX_ODR是做什麼的了。不過要注意的是,這個玩意不能一個位一個位的去操作,還是51的簡單啊,不過原子大哥已經把那個埠映射可操作位段,不明白,還是看自己的吧。一個GPIOA埠就16位,自然的32位的GPIOX_ODR 就只有低16位有效了,想輸出什麼就給這個寄存器賦值就OK了。
或者用GPIOA->ODR |=(1<
完成了這一步,我們就可以軟體延時,控制輸出流水燈了。前提是開啟設備時鐘哦。
>4,
這個寄存器用到的前提是埠配置為輸入模式時候。什麼時候想讀取值,就什麼時候讀取吧。大家都明白。
>5,
這個寄存器我用了一些,別的也不會。就感覺超級好用。用起來很方便。比如你埠配置好了。想PA5輸出「1」。就GPIOA->BSRR |=(1<<5);5是對應的哦。輸出「0」,一樣的
GPIO->BSRR |=(1<
>6,
晚上百度了一下,有了GPIOX_BSRR 為什麼還要有GPIOX_BRR ,沒看明白。有了拿來就用就對了。一樣的和GPIOx_BSRR一樣的用法。專門清除的。GPIOA->BRR |= (1<
>7,