STM32 GPIO的配置寄存器(CRL、CRH)输入输出模式配置
1.学会使用寄存器设定所需IO的方向,学会配置CRL、CRH
2.理解如下代码的含义
//IO方向设置
#define DS18B20_IO_IN() {GPIOB->CRH&=0XFFFF0FFF;GPIOB->CRH|=8<<12;}
#define DS18B20_IO_OUT() {GPIOB->CRH&=0XFFFF0FFF;GPIOB->CRH|=3<<12;}
1.学会使用寄存器设定所需IO的方向,学会配置CRL、CRH
大部分都是CTRL+C,CTRL+V的单片机发烧者,所以先解决大家的编程问题。用几个例子来让大家理解,耐心看完差异一定会照猫画虎的学会配置
最基础的大家还是要了解一下:
CRL用来存放低八位的IO口(GPIOx0—GPIOx7)的配置,
CRH用来存放高八位的IO口(GPIOx8—GPIOx15)的配置。
例1:配置GPIOA0,代码如下:使用GPIOA和CRL,
大家要注意“0”的位置,和代码中左移的为数(0*4=4,所以左移0)CRL&=0XFFFFFFF0
//IO方向设置
#define DS18B20_IO_IN() {GPIOA->CRL&=0XFFFFFFF0;GPIOA->CRL|=8<<0;}
#define DS18B20_IO_OUT() {GPIOA->CRL&=0XFFFFFFF0;GPIOA->CRL|=3<<0;}
例2:配置GPIOA6,代码如下:使用GPIOA和CRL,
大家要注意“0”的位置,和代码中左移的为数(6x4=24,所以左移24)CRL&=0XFF*0FFFFF
//IO方向设置
#define DS18B20_IO_IN() {GPIOA->CRL&=0XF0FFFFFF;GPIOA->CRL|=8<<24;}
#define DS18B20_IO_OUT() {GPIOA->CRL&=0XF0FFFFFF;GPIOA->CRL|=3<<24;}
例3:配置GPIOA9,代码如下:使用GPIOA和CRH,
大家要注意“0”的位置,和代码中左移的为数((9-8)x4=4,所以左移4)CRL&=0XFFFFFF0F
//IO方向设置
#define DS18B20_IO_IN() {GPIOA->CRH&=0XFFFFFF0F;GPIOA->CRH|=8<<4;}
#define DS18B20_IO_OUT() {GPIOA->CRH&=0XFFFFFF0F;GPIOA->CRH|=3<<4;}
例4:配置GPIOA12,代码如下:使用GPIOA和CRH,
大家要注意“0”的位置,和代码中左移的为数((12-8)x4=16,所以左移16)CRL&=0XFFF0FFFF
//IO方向设置
#define DS18B20_IO_IN() {GPIOA->CRH&=0XFFF0FFFF;GPIOA->CRH|=8<<16;}
#define DS18B20_IO_OUT() {GPIOA->CRH&=0XFFF0FFFF;GPIOA->CRH|=3<<16;}
2.理解代码的含义
//IO方向设置
#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;是什么意思呢?
- 意思很简单就是配置IO的工作模式。
- 是使用寄存器的方式快速配置,对于同一个IO口的输入输出都需要使用到的时候。
- 运用场景:IIC通讯的SDA接口就是要输出和检测输入。常见的是DS18B20的使用。
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个二进制数可以组合出16种情况,而我们只需要8种就行了。至于4位数怎么组合是什么工作模式,我们看STM32的手册。
2.工作模式的配置
我们直接看手册的说明:
可以看出,4位中又分为了CNFy和MODEy(y表示这组GPIO的第几个IO口),现在我们分析这两个的作用。
CNFy:
在输入模式(MODE[1:0]=00):
00:模拟输入模式
01:浮空输入模式(复位后的状态)
10:上拉/下拉输入模式
11:保留
在输出模式(MODE[1:0]>00):
00:通用推挽输出模式
01:通用开漏输出模式
10:复用功能推挽输出模式
11:复用功能开漏输出模式
MODEy:
00:输入模式(复位后的状态)
01:输出模式,最大速度10MHz
10:输出模式,最大速度2MHz
11:输出模式,最大速度50MHz
可以看出MODEy是用来配置是输出还是输入模式的。一般是使用00和11这两种情况。
00是输入模式,
11是输出模式。
比如我需要配置上拉输入模式,那么4位寄存器的配置就是CNFy【10】MODEy【00】:
1000换成十进制数就是8。
#define DS18B20_IO_IN() {GPIOB->CRH&=0XFFFF0FFF;GPIOB->CRH|=8<<12;}
所以这段代码的意思就是将GPIOB11配置成上拉(下拉)输入模式。
比如我需要配置浮空输出模式,那么4位寄存器的配置就是CNFy【01】MODEy【10】:
0110换成十进制数就是3。
#define DS18B20_IO_OUT() {GPIOB->CRH&=0XFFFF0FFF;GPIOB->CRH|=3<<12;}
所以这段代码的意思就是将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;
这个语句的意思和上面的是差不多的,只是现在是进行按位或操作,如果我们将8换成0x00000008就很明白了:GPIOB->CRH|=0x00000008<<12
那么我们将0x00000008左移12位也就是:0x00000008<<12变成0x00008000,我们就可以将8(1000也就是上拉(下拉)输入模式的配置)移动12-16位了。这样就对应了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输入输出的全部内容了。
本文笔记参考如下连接,如有侵权请联系删除
https://blog.csdn.net/weixin_45915259/article/details/123878323