GPIO--Part2

GPIO–Part2

在昨天的Part1部分,我们介绍了GPIO的一些相关概念,末尾处我们介绍了两个常用的位运算操作,分别是 x |= (1<<n) (x的n位置1)以及x &= ~(1<<n)(x的n位置0)。这两个操作本质上就是寄存器操作的缩影,会贯穿我们未来学习寄存器操作的始终。

关于GPIO常用寄存器的介绍和使用

如果我们想要了解寄存器到底是什么,其具体内部空间是怎么分配的,我们就要学会看寄存器的参考手册,了解具体在一个寄存器中,每一位或每几位对应的功能。我们在Part1中提到每个端口最多可用16个引脚,记住16这个数字会让你在对寄存器结构理解时记忆更深。我们想要使用GPIO,那就必须先将对应的GPIO进行初始化,下面是我们在初始化GPIO时需要配置的不可或缺的寄存器。

1.GPIOx_MODER

在这里插入图片描述
GPIOx_MODER(x=A…I)寄存器配置的是GPIOx中的引脚的所对应的模式。因为有四种可用模式可以配置:
00:输入模式
01:输出模式
10:复用模式
11:模拟模式

所以我们需要两位才能表示这四种不同的模式,我们可以看到图中是每两位决定一个GPIOx下的一个引脚的配置模式。

如果我们想要将PC4设置为输出模式:
GPIOC->MODER &= ~(3<<8);//清空
GPIOC->MODER |= (1<<8);//设置为输出模式

将PA2设置为模拟模式:
GPIOA->MODER &= ~(3<<4);//清空
GPIOA->MODER |= (3<<4);//设置为模拟模式

2.GPIOx_OTYPER

在这里插入图片描述

在这里插入图片描述
GPIOx_OTYPER(x=A…I)寄存器配置的是GPIOx中引脚所对应的输出模式。因为只有两种可用模式可以配置:
0:推挽输出
1:开漏输出

所以我们只需要1位就能表示这两种不同的模式,我们可以看到图中是低位0-15每位决定一个GPIOx下的一个引脚的输出模式配置。

如果我们想要将PC4设置为推挽输出:
GPIOC->OTYPER &= ~(1<<4);//设置为推挽输出

将PA2设置为开漏输出:
GPIOA->OTYPER |= (1<<2);//设置为开漏输出

3.GPIOx_OSPEEDR

在这里插入图片描述
GPIOx_OSPEEDR(x=A…I)寄存器配置的是GPIOx中的引脚所对应的输出速度。因为有四种可用模式可以配置:
00:低速(2MHZ)
01:中速(25MHZ)
10:快速(50MHZ)
11:高速(80MHZ/100MHZ)

所以我们需要两位才能表示这四种不同的模式,我们可以看到图中是每两位决定一个GPIOx下的一个引脚的输出速度。如果接收方对速度没有要求,我们选择中速或快速即可。

如果我们想要将PC4设置为中速输出:
GPIOC->OSPEEDR &= ~(3<<8);//清空
GPIOC->OSPEEDR |= (1<<8);//设置为中速输出

将PA2设置为快速输出:
GPIOA->OSPEEDR &= ~(3<<4);//清空
GPIOA->OSPEEDR |= (2<<4);//设置为快速输出

4.GPIOx_PUPDR

在这里插入图片描述
在这里插入图片描述

GPIOx_PUPDR(x=A…I)寄存器配置的是GPIOx中的引脚默认状态。因为有四种可用模式可以配置:
00:无上下拉
01:上拉
10:下拉
11:保留

所以我们需要两位才能表示这四种不同的模式,我们可以看到图中是每两位决定一个GPIOx下的一个引脚的上下拉模式。上拉指的是将端口上接一个上拉电阻使其默认状态为高电平。下拉恰好相反,将端口接一个下拉电阻使其默认状态为低电平。一般来说我们不配置11,若配置为11可能会导致一些未知的错误。从本质上来说,11目前不具有具体的作用。

如果我们想要将PC4设置为无上下拉:
GPIOC->PUPDR &= ~(3<<8);//设置为无上下拉

将PA2设置为上拉:
GPIOA->PUPDR &= ~(3<<4);//清空
GPIOA->PUPDR |= (1<<4);//设置为上拉

5.GPIOx_IDR

在这里插入图片描述
GPIOx_IDR(x=A…I)寄存器存储的是从相对应GPIOx中的引脚输入的高低电平状态。该寄存器只有低16位(即0-15)存储对应引脚的输入电平,其中r表示该位为只读,也就是说我们只能读出寄存器GPIOx_IDR对应位的值并不拥有写权限。

如果我们想要知道PC4接收电平的高低状态:
if(GPIOC->IDR & (1<<4));//若if为真,则PC4接收到高电平,反之为低

PA2接收电平的高低状态:
if(GPIOA->IDR & (1<<2));//若if为真,则PA2接收到高电平,反之为低

6.GPIOx_ODR

在这里插入图片描述
GPIOx_ODR(x=A…I)寄存器配置的是GPIOx中引脚所对应的输出电平。因为只有两种状态可以配置:
0:低电平
1:高电平

所以我们只需要1位就能表示这两种状态,我们可以看到图中是低位0-15每位决定一个GPIOx下的一个引脚的输出电平。

如果我们想要将PC4输出设置为0:
GPIOC->ODR &= ~(1<<4);//输出设置为低电平

将PA2输出设置为1:
GPIOA->ODR |= (1<<2);//输出设置为高电平

7.GPIOx_BSRR

在这里插入图片描述
刚刚我们在上面讲到的GPIOx_ODR寄存器可以对应端口引脚配置输出电平,而GPIOx_BSRR也可以对相对应的端口引脚就行输出配置,只不过其原理比较特殊,是通过间接配置GPIOx_ODR寄存器的方式。其中低16位是对相应的引脚输出置高电平,高16位是对相应的引脚输出置低电平。
需要注意的是,如果你同时对同一个引脚写了置高电平和低电平的操作,因为该寄存器的低位权限高于高位权限,所以最终引脚表现为输出高电平。
在GPIOx_BSRR寄存器中我们只有写权限并没有读权限,我们对对应引脚位配置有两种可写值:
0:不对其做任何操作
1:使对应的引脚输出置高/低电平

如果我们想要将PC4输出设置为0:
GPIOC->BSRR |= (1<<(4+16));//输出设置为低电平

将PA2输出设置为1:
GPIOA->BSRR |= (1<<2);//输出设置为高电平

8.GPIOx_AFRL

在这里插入图片描述

9.GPIOx_AFRH

在这里插入图片描述
GPIOx_AFRH寄存器用于IO口的复用,到后面用到的时候我们再详细讲解。

10.RCC_AHB1ENR

在这里插入图片描述
同上。

补充

在图中我们经常看到偏移地址和复位值这两个描述,因为寄存器的地址是固定的并且按一定空间顺序排列的,所以在空间地址上表现为成片连续的。

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
偏移地址:就是相对于基地址的偏移量
举个例子:GPIOA的基地址(即分配地址段的起始地址)为0x4002 0000,那么GPIOA_OTYPED的首地址就是基地址+偏移地址=0x4002 0004。
复位值:当该寄存器复位后的默认值

  • 22
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值