STM32 GPIO的输入输出模式配置:CRL及CRH寄存器深度剖析

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,代码如下:使用GPIOACRL
大家要注意“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,代码如下:使用GPIOACRL
大家要注意“0”的位置,和代码中左移的为数(64=24,所以左移24)CRL&=0XFF0FFFFF

//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,代码如下:使用GPIOACRH
大家要注意“0”的位置,和代码中左移的为数((9-8)*4=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,代码如下:使用GPIOACRH
大家要注意“0”的位置,和代码中左移的为数((12-8)*4=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;是什么意思呢?

  1. 意思很简单就是配置IO的工作模式。
  2. 是使用寄存器的方式快速配置,对于同一个IO口的输入输出都需要使用到的时候
  3. 运用场景:IIC通讯的SDA接口就是要输出和检测输入。常见的是DS18B20的使用。

1、GPIO的配置寄存器CRL和CRH

STM32的一组GPIO有16个IO口,比如GPIOA这一组,有GPIOA0~GPIOA15一共16个IO口。每一个IO口需要寄存器的4位用来配置工作模式。

那么一组GPIO就需要16×4=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是用来配置是输出还是输入模式的。一般是使用0011这两种情况。
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;}
  1. GPIOB->CRH 这两个代码的意思是GPIOB配置寄存器的高八位CRH,这个寄存器有32位,划分成了八部分,每部分有4位。
    第一部分是配置GPIOB8的,第二部分是配置GPIOB9,以此类推。那么就是说CRH的0-3位是用来配置GPIOB8的,CRH的4-7位是用来配置GPIOB8的,以此类推。

  2. CRH|=8 这两个代码是配置引脚的模式的,常用的:
    输入模式是CRH|=8
    输出模式是CRH|=3

  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配置成了上拉(下拉)输入模式。

  4. 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

物联沃分享整理
物联沃-IOTWORD物联网 » STM32 GPIO的输入输出模式配置:CRL及CRH寄存器深度剖析

发表评论