1. 程式人生 > >STM32學習筆記(三)------GPIO口暫存器的操作與使用

STM32學習筆記(三)------GPIO口暫存器的操作與使用

1、STM32 的每個 IO 埠都有 7 個暫存器來控制
(1)配置模式的 2 個 32 位的埠 配置暫存器 CRL 和 CRH
(2)2 個 32 位的資料暫存器 IDR 和 ODR
(3)1 個 32 位的置位/復位暫存器 BSRR
(4)一個 16 位的復位暫存器 BRR
(5)1 個 32 位的鎖存暫存器 LCKR。

2、每個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。

3、另外,STM32的每個埠使用前都要將其時鐘使能,STM32的GPIO的時鐘統一掛接在APB2上,具體的使能暫存器為RCC_APB2ENR,該暫存器的第2位到第8位分別控制GPIOx(x=A,B,C,D,E,F,G)埠的時鐘使能,當外設時鐘沒有啟用時,程式不能讀出外設暫存器的數值,如開啟PORTA時鐘:

                  RCC->APB2ENR|=1<<2;    //使能PORTA時鐘 

使能外設時鐘後,GPIOA的十六位就可以按照設定的狀態工作了,之後就是具體設定哪一位了以第八位為例即高位的首位,在GPIOx_CRH暫存器中進行設定,GPIOA的每一位都有該暫存器的四位來設定相應的引數,這四位中的高兩位(CNF0,CNF1)設定GPIO的輸入輸出模式,低兩位(MODE0,MODE1)是設定GPIO的輸出頻率,具體可以參考STM32參考手冊。

  GPIOA->CRH&=0XFFFFFFF0; //清掉PA8原來的設定,同時遮蔽其它埠,不影響其它埠的設定

  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送資料就行了

首先介紹一下基本的GPIO相關的暫存器:
(一)GPIOX_CRL 低8位埠配置暫存器
這個暫存器主要是對配置管腳是輸入還是輸出:
其中1)MODEy[1:0]主要是配置是輸入埠還是輸出埠的。配置為輸出得時候還可以配置輸出的管腳速度等級。
2)CNFy[1:0] 主要是兩種形式,在埠配置輸入的時候,即MODEy[1:0]位00(輸入),用來配置輸入的模式,主要是模擬輸入,浮空輸入,上拉模式和下拉模式。
3)CNFy[1:0]在埠配置為輸出的時候,用來控制輸入的模式。具體看手冊吧。
總得來說,就是MODEy[1:0] 先配置管腳是輸入還是輸出,是輸入就繼續配置CNFy[1:0]來配置輸出管腳的連線模式。要是輸出的話,就繼續配置MODEy[1:0]的管腳速度速度等級,之後再配置管腳的連線模式。上拉,下拉,推免,開漏等等。具體運用的時候看看手冊就明白了。

(二)GPIOX_CRH 高8位埠配置暫存器
和GPIOX_CRH 完全一樣,只是埠換成高8位了。

(三)GPIOX_ODR 埠輸出資料暫存器
一個GPIOA埠就16位,自然的32位的GPIOX_ODR 就只有低16位有效了,想輸出什麼就給這個暫存器賦值就OK了。
或者用GPIOA->ODR |=(1<