1. 程式人生 > >STM32 IO暫存器操作

STM32 IO暫存器操作

STM32的IO埠有八種模式:

1、輸入浮空         5、開漏輸出

2、輸入上拉         6、推輓輸出

3、輸入下拉         7、推輓複用

4、模擬輸入         8、開漏複用

每個IO口都有七個暫存器來控制:

CHL、CHR        :埠配置暫存器(32位)

IDR、ODR        :資料暫存器(32位)

BSRR                :置位/復位暫存器(32位)

BRR                  :復位暫存器(16位)

LCKR                :所存暫存器(32位)

其中,比較常用的IO埠暫存器為CRL,CRH,IDR,ODR

低配置暫存器CRL:


該暫存器復位值為0x4444 4444。即復位後IO口預設為浮空輸入模式。STM32的CRL暫存器控制著每組IO埠的低8位。每4個位(2位MODE,2位CNF)即控制對應IO埠的輸入輸出模式和埠速度的配置。常用的配置有:0X0(模擬輸入,ADC使用),0X3(推輓輸出,50M速率),0X8(上下拉輸入),0XB(複用輸出,50M速率)。

CRH與CRL功能相同,CRH控制高八位(8-15),CRL控制低八位(0-7)。

例:想要設定PTC11為上拉輸入,PTC12為推輓輸出:

    GPIOC->CRH &= 0XFFF0 0FFF;  //清除該兩位設定而不影響其他位

    GPIOC->CRH  |=  0X0003 8000; //C11輸入,C12輸出

    GPIOC->ODR  =   1<<11;//C11上拉

IDR是埠輸入資料暫存器,只用了低16位,該暫存器是隻讀暫存器,並且只能以16位形式讀出。


要想知道某個IO口的狀態時,只需讀該暫存器,看某位的狀態即可。

ODR為埠輸出資料暫存器,只用了低16位,可讀寫,讀出來的狀態可作為IO口輸出狀態的判斷,寫資料則改變對應IO埠的電平狀態。


完整IO口初始化示例:

void LED_Init(void){

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

    RCC->APB2ENR |= 1<<5;    //使能PTD時鐘

    GPIOA->CRH&=0XFFFF FFF0; //清空PA8設定

    GPIOA->CRH|=0X0000 0003; //設定PA8推輓輸出

    GPIOA->ODR|=1<<8;  //PA8輸出高

    GPIOD->CRL&=0XFFFF F0FF;//清空PD2設定

    GPIOD->CRL|=0X0000 0300;//設定PD2推輓輸出

    GPIOD->ODR|=1<<2;//PD2輸出高

}

需注意,任何外設在初始化之前,都需要配置其時鐘。在上例中,APB2ENR為APB2總線上的外設時鐘使能暫存器。


由上圖所示,GPIOA和GPIOD的埠時鐘分別在第二位和第五位,這兩位置一即可使能這兩個埠的時鐘