STM32 GPIO的配置寄存器(CRL、CRH)输入输出模式配置
STM32 GPIO的配置寄存器(CRL、CRH)輸入輸出模式配置
1.學(xué)會使用寄存器設(shè)定所需IO的方向,學(xué)會配置CRL、CRH
2.理解如下代碼的含義
1.學(xué)會使用寄存器設(shè)定所需IO的方向,學(xué)會配置CRL、CRH
大部分都是CTRL+C,CTRL+V的單片機發(fā)燒者,所以先解決大家的編程問題。用幾個例子來讓大家理解,耐心看完差異一定會照貓畫虎的學(xué)會配置
最基礎(chǔ)的大家還是要了解一下:
CRL用來存放低八位的IO口(GPIOx0—GPIOx7)的配置,
CRH用來存放高八位的IO口(GPIOx8—GPIOx15)的配置。
例1:配置GPIOA0,代碼如下:使用GPIOA和CRL,
大家要注意“0”的位置,和代碼中左移的為數(shù)(0*4=4,所以左移0)CRL&=0XFFFFFFF0
例2:配置GPIOA6,代碼如下:使用GPIOA和CRL,
大家要注意“0”的位置,和代碼中左移的為數(shù)(64=24,所以左移24)CRL&=0XFF0FFFFF
例3:配置GPIOA9,代碼如下:使用GPIOA和CRH,
大家要注意“0”的位置,和代碼中左移的為數(shù)((9-8)*4=4,所以左移4)CRL&=0XFFFFFF0F
例4:配置GPIOA12,代碼如下:使用GPIOA和CRH,
大家要注意“0”的位置,和代碼中左移的為數(shù)((12-8)*4=16,所以左移16)CRL&=0XFFF0FFFF
2.理解代碼的含義
//IO方向設(shè)置 #define DS18B20_IO_IN() {GPIOB->CRH&=0XFFFF0FFF;GPIOB->CRH|=8<<12;} #define DS18B20_IO_OUT() {GPIOB->CRH&=0XFFFF0FFF;GPIOB->CRH|=3<<12;}代碼:GPIOB->CRH&=0XFFFF0FFF;GPIOB->CRH|=8<<12;是什么意思呢?
1、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的手冊。
2.工作模式的配置
我們直接看手冊的說明:
可以看出,4位中又分為了CNFy和MODEy(y表示這組GPIO的第幾個IO口),現(xiàn)在我們分析這兩個的作用。
CNFy:
MODEy:
00:輸入模式(復(fù)位后的狀態(tài)) 01:輸出模式,最大速度10MHz 10:輸出模式,最大速度2MHz 11:輸出模式,最大速度50MHz可以看出MODEy是用來配置是輸出還是輸入模式的。一般是使用00和11這兩種情況。
00是輸入模式,
11是輸出模式。
比如我需要配置上拉輸入模式,那么4位寄存器的配置就是CNFy【10】MODEy【00】:
1000換成十進制數(shù)就是8。
所以這段代碼的意思就是將GPIOB11配置成上拉(下拉)輸入模式。
比如我需要配置浮空輸出模式,那么4位寄存器的配置就是CNFy【01】MODEy【10】:
0110換成十進制數(shù)就是3。
所以這段代碼的意思就是將GPIOB11配置成浮空輸出模式。
3、配置代碼的解析
#define DS18B20_IO_IN() {GPIOB->CRH&=0XFFFF0FFF;GPIOB->CRH|=8<<12;}GPIOB->CRH 這兩個代碼的意思是GPIOB配置寄存器的高八位CRH,這個寄存器有32位,劃分成了八部分,每部分有4位。
第一部分是配置GPIOB8的,第二部分是配置GPIOB9,以此類推。那么就是說CRH的0-3位是用來配置GPIOB8的,CRH的4-7位是用來配置GPIOB8的,以此類推。
CRH|=8 這兩個代碼是配置引腳的模式的,常用的:
輸入模式是CRH|=8
輸出模式是CRH|=3
GPIOB->CRH|=8<<12;這個語句的意思和上面的是差不多的,只是現(xiàn)在是進行按位或操作,如果我們將8換成0x00000008就很明白了:GPIOB->CRH|=0x00000008<<12
那么我們將0x00000008左移12位也就是:0x00000008<<12變成0x00008000,我們就可以將8(1000也就是上拉(下拉)輸入模式的配置)移動12-16位了。這樣就對應(yīng)了CRH的12-16位,按照**|**按位或運行的特性可以很清楚知道,我們將CRH的12-16位變成了8(1000)。也就是將GPIOB11配置成了上拉(下拉)輸入模式。
GPIOB->CRH&=0XFFFF0FFF這個語句的意思是先清除CRH Pin11位置上的引腳配置。從有到左的F分表代表GPIO8,GPIO9,GPIO10…以此類推到GPIO15。0的位置代表想要清除哪個GPIO 的位置
GPIOB->CRL&=0XFFFF0FFF從有到左的F分表代表GPIO0,GPIO1,GPIO2…以此類推到GPIO7。0的位置代表想要清除哪個GPIO 的位置
以上就是STM32寄存器配置IO輸入輸出的全部內(nèi)容了。
本文筆記參考如下連接,如有侵權(quán)請聯(lián)系刪除
https://blog.csdn.net/weixin_45915259/article/details/123878323
總結(jié)
以上是生活随笔為你收集整理的STM32 GPIO的配置寄存器(CRL、CRH)输入输出模式配置的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于关于接口测试自动化的总结与思考接口测
- 下一篇: 无序列表ul