STM32 GPIO的配置寄存器(CRL、CRH)快速学习
1、問題
在使用STM32的時候配置GPIO是最常見的操作,可以使用比較簡單明白的庫函數(shù)配置,但很繁雜。使用寄存器的方式可以快速配置,對于同一個IO口的輸入輸出都需要使用到的時候,比如IIC通訊的SDA接口就是要輸出和檢測輸入。
我們在很多工程都能看到比如下面的一些代碼:
//IO方向設(shè)置 #define SDA_IN() {GPIOA->CRL&=0XFFFFFFF0;GPIOA->CRL|=8;} #define SDA_OUT() {GPIOA->CRL&=0XFFFFFFF0;GPIOA->CRL|=3;}代碼:GPIOA->CRL&=0XFFFFFFF0;GPIOA->CRL|=8;是什么意思呢?意思很簡單就是配置IO的工作模式嘛!至于是怎么來寫,我以前一直沒弄懂,現(xiàn)在弄懂了記錄下來。
2、GPIO的配置寄存器CRL和CRH
STM32的一組GPIO有16個IO口,比如GPIOA這一組,有GPIOA0~GPIOA15一共16個IO口。每一個IO口需要寄存器的4位用來配置工作模式。
那么一組GPIO就需要16x4=64位的寄存器來存放這一組GPIO的工作模式的配置,但STM32的寄存器都是32位的,所以只能使用2個32位的寄存器來存放了。CRL用來存放低八位的IO口(GPIOx0—GPIOx7)的配置,CRH用來存放高八位的IO口(GPIOx8—GPIOx15)的配置。
這兩個寄存器的全稱是:端口配置低寄存器(GPIOx_CRL) (x=A…E) 和 端口配置高寄存器(GPIOx_CRH) (x=A…E)
也就是每一組GPIO都有兩個32位的寄存器是用來配置IO口的工作模式的。
我們都清楚STM32的GPIO有八種工作模式,4個二進制數(shù)可以組合出16種情況,而我們只需要8種就行了。至于4位數(shù)怎么組合是什么工作模式,我們看STM32的手冊。
3、工作模式的配置
我們直接看手冊的說明:
可以看出,4位中又分為了CNFy和MODEy(y表示這組GPIO的第幾個IO口),現(xiàn)在我們分析這兩個的作用。
MODEy:
可以看出MODEy是用來配置是輸出還是輸入模式的。一般是使用00和11這兩種情況。00是輸入模式,11是輸出模式。
CNFy:
在輸入模式(MODE[1:0]=00): 00:模擬輸入模式 01:浮空輸入模式(復(fù)位后的狀態(tài)) 10:上拉/下拉輸入模式 11:保留 在輸出模式(MODE[1:0]>00): 00:通用推挽輸出模式 01:通用開漏輸出模式 10:復(fù)用功能推挽輸出模式 11:復(fù)用功能開漏輸出模式這些就是CNFy的配置,配置具體的工作模式。配合MODEy就可以配置出所有的工作模式了。
比如我需要配置上拉輸入模式,那么4位寄存器的配置就是CNFy【10】MODEy【00】:1000換成十進制數(shù)就是8。
所以這段代碼的意思就是將GPIOA0配置成上拉(下拉)輸入模式。
4、配置代碼的解析
如果 需要將GPIOB9配置成上拉(下拉)輸入模式。
它的代碼是:
這里增加了一點代碼:<<4
如果想弄清楚,我們需要從前面開始:
(1):GPIOB->CRH的意思是GPIOB配置寄存器的高八位CRH,這個寄存器有32位,劃分成了八部分,每部分有4位。
第一部分是配置GPIOB8的,第二部分是配置GPIOB9,以此類推。那么就是說CRH的0-3位是用來配置GPIOB8的,CRH的4-7位是用來配置GPIOB9的,以此類推。
(2):GPIOB->CRH&=0XFFFFFF0F; 我們知道&是按位與操作,那么這個語句的意思就很清楚了,用0XFFFFFF0F(化成二進制是32位)和CRH進行與操作,這一句代碼的結(jié)果是CRH的4-7位變成0,其他位的數(shù)據(jù)不變,這個是&語句的特性。
(3):GPIOB->CRH|=8<<4; 這個語句的意思和上面的是差不多的,只是現(xiàn)在是進行按位或操作,如果我們將8換成0x00000008就很明白了:GPIOB->CRH|=0x00000008<<4
那么我們將0x00000008左移4位也就是:0x00000008<<4變成0x00000080,我們就可以將8(1000也就是上拉(下拉)輸入模式的配置)移動4-7位了。這樣就對應(yīng)了CRH的4-7位,按照**|**按位或運行的特性可以很清楚知道,我們將CRH的4-7位變成了8(1000)。也就是將GPIOB9配置成了上拉(下拉)輸入模式。
到此就是關(guān)于GPIO的配置寄存器的使用的全部內(nèi)容了。學(xué)會就可以十分方便配置每一個IO口了。
總結(jié)
以上是生活随笔為你收集整理的STM32 GPIO的配置寄存器(CRL、CRH)快速学习的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: kali Linux更新软件包
- 下一篇: 举个栗子!Tableau 技巧(121)