GPIO相关的寄存器(重要)

目录

一、GPIO相关寄存器概述

二、整体介绍

三、详细介绍

1、端口配置低寄存器(GPIOx_CRL)(x=A...E)

2、端口配置高寄存器(GPIOx_CRH)(x=A...E)

3、端口输入数据寄存器(GPIOx_IDR)(x=A...E)

4、端口输出数据寄存器(GPIOx_ODR)(x=A...E)

5、端口位复位/置位寄存器(GPIOx_BSRR)(x=A...E)

6、端口位复位寄存器(GPIOx_BSR)(x=A...E)

7、端口配置锁定寄存器(GPIOx_LCKR)(x=A...E)

四、总结


前面,我们学习了GPIO的相关概念、特点和8种工作模式。在前面的点灯案例中,我们用到了GPIO相关的寄存器,但没有详细的去了解这些寄存器。因此,在这期我们就来学习一下GPIO相关的七个寄存器。

一、GPIO相关寄存器概述

每个GPIO端口相关的寄存器有7个:

  • 2个32位配置寄存器(GPIOx_CRL,GPIOx_CRH)。
  • 2个32位数据寄存器(GPIOx_IDR和GPIOx_ODR)。
  • 1个32位置位/复位寄存器(GPIOx_BSRR)。
  • 1个16位复位寄存器(GPIOx_BRR)。
  • 1个32位锁定寄存器(GPIOx_LCKR)。

关于GPIO寄存器的学习比较重要,但是实际上也不是全都很重要。相对而言,前四个寄存器会更加重要,因为我们平时使用的会更多;后面三个寄存器也不是就不学了,也需要做一下了解,可能会用到。 

我们看这些寄存器,这么多名称我们咋记得住,实际上,这些名称都是有规律的。他们都是几个英文的首字母或缩写组合

比如,这两个配置寄存器名字前部分GPIOx是都有的,表示这是对应是GPIO端口的;然后后半部分的CRL和CRH,代表的是配置 寄存器 低 / 高 的英文的缩写;也就是说,这两个寄存器一个是低位、一个是高位的端口配置寄存器的意思。

然后就是两个数据寄存器。关于数据,我们可能涉及到的主要就是输入输出了。IDR和ODR只有首字母的不同,I表示的就是input输入O表示的自然就是output输出了,后面的DR就是data和register 数据寄存器的意思了。

接着是置位/复位寄存器,BSRR,看着很奇怪,看中文名其实就是我们前面将工作模式的时候的那个设置/清除寄存器一样的,用来把我们想要输入/输出的电平状态给数据寄存器的寄存器。这里的B表示的就是bit位S表示set设置,R表示reset复位/清除,最后的R表示register寄存器,就是这个意思了。

再就是复位寄存器,BRR,我们看中文名叫复位,与上一个相差一个置位,然后上一个的置位用的set的首字母s,而现在复位寄存器没有置位,所以就是BSRR去掉一个S就是复位寄存器首字母组合BRR了,也就是这个意思。

最后是这个锁定寄存器,LCKR,LCK就是lock锁的缩写,然后R是register寄存器,LCKR组合,就是表示锁定寄存器了。因为对于工作模式的配置决定了这个gpio口实现的功能(输入/输出等),所以不能随便修改,因此有这个锁定寄存器的出现,即主要是用于锁定配置的工作模式位的寄存器。

介绍完这些寄存器名字以后,我们再去技术手册中看看这些寄存器,先整体的看看再详细看看单个的。

二、整体介绍

我们进入技术手册,进入GPIO的寄存器地址映像,就能看见GPIO相关的7个寄存器的排列的信息了。

从图中可以看见,每一个寄存器的数据都是32位存储,只不过有些只使用了低16位,其余位保留位 。

从图中我们可以看出每个寄存器的大致信息,如偏移地址、寄存器名称、复位值以及位。

前两个配置寄存器前面我们主要用于配置GPIO的工作模式,这是32位都用上了;

接着的两个输入输出数据寄存器只使用低16位的部分,高16位保留,这是由于每一组GPIO端口恰好有16个引脚,对应寄存器16位,所以就这样设定了;

紧接着就是置位/复位寄存器,这里使用了32位,其中可以看出低16为用于处理置位引脚,高16位用于处理复位引脚。

然后复位寄存器同理,只使用了低16位,用于处理复位的引脚

最后是锁定寄存器,同样也是低16位用于16个引脚对应的锁定位,然后还有多的一位可能用处更全局,然后高15位被保留。

三、详细介绍

然后我们进入单个寄存器描述部分去详细说明每个寄存器:

1、端口配置低寄存器(GPIOx_CRL)(x=A...E)

首先是CRL,即GPIO端口配置低寄存器

首先我们关注到的是这个名字,GPIOx,这里有个x,后面跟着(x=A...E),为什么这样写呢 ?

因为我们STM32芯片上GPIO端口有7组,A到E,每组都是16个引脚。实际上,每一组引脚要做的配置、数据的输入输出以及置位复位锁定等等功能都需要,而且都是类似的,所以这里除了GPIO组的不同,实际上寄存器的实现都是类似的。因此,这里用x就是表示每一组GPIO端口都是使用这个寄存器。

其次,我们说说为什么这里每四位一循环MODE和CNF,只是最后的数字不同,然后每个MODE和CNF各包含两位,为什么会这样设计?

这里寄存器叫做配置寄存器,也就是之前用来配置GPIO工作模式的,而GPIO工作模式前面讲了,一共有8种。那么我们想,既然八种,那恰好使用3位就可以产生8种状态嘛,而每一个端口(引脚)都可能出现这8种情况,一组GPIO端口又含16个引脚,也就是需要16x3=48位,这时候问题来了,我们寄存器都是32位的,这48位总有点不太合适。

因此咱就利用了两个寄存器,一共64位,64/16=4,也就是每一个引脚使用4位来配置工作模式。这个时候由于一个寄存器只有32位,也就是说一个寄存器就只能配置32/4=8个引脚,于是出现两个配置寄存器:配置低寄存器(低8位端口)和配置高寄存器(高8位端口)。

再来说说这4位是如何分配的:

MODE:我们继续对4位半分,低2位使用MODE表示,即模式,用于配置引脚是输入还是输出模式。但是两位可以表示四种状态,此时只有两种模式,因此MODE表示的两位是控制三种不同翻转速度的输出模式和一种输入模式。

输入模式、最大速度为10MHz的输出模式、最大速度为2MHz的输出模式、最大速度为50MHz的输出模式。这样这两位就充分利用了。若没有被利用,就变成保留位了。

CNF:高2位则使用的CNF表示,即对应8种工作模式。它是根据MODE的情况而表示四种不同的模式。

  当MODE为00时,CNF下的四种状态则代表所有情况的输入模式,即模拟输入浮空输入上拉/下拉输入这四种。由于上拉和下拉输入模式除了开关一个向上、一个向下外,其控制的电路基本类似,因此只要设置一个默认的开关上下拉情况,就可以只通过一个对应值来同时控制是上拉还是下拉了。因此实际上当MODE处于00输入模式时,CNF的两位只利用了产生的3个值(00、01、10),还存在一个保留位。

  当MODE>00时,CNF下的四种状态则代表所有情况的输出模式,即通用推挽输出模式、通用开漏输出模式、复用功能推挽输出模式、复用功能开漏输出模式这四种。

然后我们说说这个复位,这里也有个复位值,“0x4444 4444”,这里的4换成二进制就是0100,恰好对应一个引脚的4个控制位。我们看下图,0100也就是表示 MODE是00输入模式,此时CNF是01表示的浮空输入,浮空表示内部不产生电流,全靠外部向内产生,因此此时是最不耗电的时候。

由图中也可以发现,浮空输入模式就是复位后的状态,将不耗电的模式作为复位状态确实是一个较好的选择。 

2、端口配置高寄存器(GPIOx_CRH)(x=A...E)

因为端口配置高寄存器GPIOx_CRH与GPIOx_CRL寄存器结构内容几乎一样,完全可以类比理解。因此这里我不再赘述。

3、端口输入数据寄存器(GPIOx_IDR)(x=A...E)

 关于输入数据寄存器相对前面配置的就简单多了,即给GPIO端口一个高/低电平状态的寄存器怎么使用呢?很简单,比如我给IDR0位为1,则P0端口就会输入一个高电平状态;若给IDR0位置0,则P0口就会输入一个低电平的状态。

由于一个寄存器控制一组GPIO端口(16个位),因此只需要使用低16位。故对于输入输出数据寄存器来说,低16位用于给电平状态,高16位作保留位。

4、端口输出数据寄存器(GPIOx_ODR)(x=A...E)

 关于端口输出数据寄存器的介绍,该寄存器作用即用于向端口输出一个高低电平状态的寄存器。与上面的输入数据寄存器使用极其类似,如不清楚可看上面关于端口输入数据寄存器的介绍。

5、端口位复位/置位寄存器(GPIOx_BSRR)(x=A...E)

 接下来,我们来介绍一下端口位设置/清除寄存器的功能与使用,上图是STM32F10x中文参考手册中截的关于该寄存器介绍的图片以便查看。该寄存器的功能顾名思义,即对端口位进行设置或复位(清除)的寄存器

通过上图我们注意到,低16位是BRxx,即用来对16个端口位进行设置位,其中置1即可进行设置;高16位是BRxx,即用来对16个端口进行清除(复位)的位,其中置1即可进行复位(清除)此时我们就会注意到一个问题:如果我们同时给同一个端口位进行清除位和设置位,此时该端口会是什么状态呢?诶,由上图绿框中可以看见一个注意,“如果同时设置了设置位和复位的位,则设置位会起作用”,即 同时设置时会对该端口设置位。

这里可能还会有一个问题:为什么还要专门弄一个寄存器出来对GPIO端口进行复位或设置位?明明可以直接使用数据寄存器进行设置的

实际上,这和个人的变成习惯相关的,我们确实完全可以不使用这个寄存器以及下一个介绍的寄存器去进行设置或复位。至于原因,就是我们观察这个寄存器会发现,如果单独去开一个寄存器去对某端口进行设置或复位的话,我们只要设置高电平1即可,如果我们直接使用数据寄存器去复位或设置的话,可能是0可能是1,此时由于我们对某一位给0/1时为保证不影响其他位的数据,还会进行按位与/按位或的操作或者取反的操作,如下图我们之前点灯实验的代码操作一样

在同一个寄存器中进行,就会出现按位与按位或交叉的使用情况,这时候我们就容易混乱,稍不注意就容易出现编写错误,相反,我们另用一个寄存器,就能保证代码整齐,都是用按位或(置1)去进行设置/清除的操作,这样可能不容易出问题一些。主要就是这个原因,希望这里我讲清楚了,没讲清楚可在评论区评论~

6、端口位复位寄存器(GPIOx_BSR)(x=A...E)

接下来是端口位复位(清除)寄存器,看到这里大家又会有疑问了,前面刚讲到一个设置/清除寄存器,这里又来个单独的清除寄存器,这不是重复了吗?原因其实和前面那个问题一样,我们完全也可以不使用这个寄存器,根据个人编程习惯来。

关于该寄存器的内容和使用,和上一个端口位设置/清除寄存器使用是一样的,主要区别就是这里复位使用的是低16位对端口位进行操作,与前面设置/清除寄存器进行清除的操作位不同,但这里恰好与前面寄存器设置端口有了对应。然后我就不再赘述了。 

7、端口配置锁定寄存器(GPIOx_LCKR)(x=A...E)

最后,在讲解一下这个端口配置锁定寄存器,顾名思义,即用来锁定端口配置的寄存器,既然有锁定配置的操作,可想而知关于端口的配置有多么重要,每一个端口的锁将控制配置寄存器的四位。这里我们可以理解成每一个端口位都有一个小箱子,箱子里面装有四位,然后各个小箱子都有一把钥匙,而这个钥匙呢就是这里配置所寄存器的低16位的各个位,当我们给1时就会锁住相应的小箱子(端口位),给0就不会锁住

同时我们也注意到,在高16位的第一位还有一个LCKK位,那么这个是用来干啥的呢?实际上,他叫锁键,可以看做是一个全局锁,即用来锁住锁端口位的“大锁”,可以这样理解,此时还有一个大箱子,这个大箱子装着所有小箱子(端口位)的锁,此时LCKK就相当于是大箱子的锁,可想而知锁住端口位的锁也是很重要的,那么同理这个大箱子(全局锁)的大锁岂不是更重要?以此类推难不成要像套娃一样去加锁了?

显然那样是不可取的,因此这个大锁是有点特殊的,通过上图描述我们可以知道,此时的LCKK相当于一把“密码锁”,它并不是只需要给个1就能将全部的锁给锁住不能使用,而是需要锁键(LCKK)一个写入序列,写1->写0->写1->读0->读1:先写入101,然后读一个0看是否激活锁,然后最后这个读1其实可写可不写了,不过我们可以用来作为一个标志来确认锁键是否被激活。

总而言之,就是这个端口配置所寄存器是用来锁住端口位的配置的,其中低16位是对各个端口进行“上锁”,给高电平1即为锁定;高16位的第一位是对全局进行“上锁”,且全局锁需要一个写入序列(可理解成密码锁的形式)才能真正上锁

四、总结

以上就是关于七个GPIO寄存器的全部内容,总共讲述了7个GPIO寄存器的命名介绍、功能详解以及使用方法。

作为我今后复习笔记的同时,也希望每一次博客对大家能有所帮助,由于笔者也是小白,编写的过程中难免出现一些错误和不足,还请大家在评论区批评指正,谢谢!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/917665.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

华为Mate 70临近上市:代理IP与抢购攻略

随着科技的飞速发展,智能手机已经成为我们日常生活中不可或缺的一部分。而在众多智能手机品牌中,华为一直以其卓越的技术和创新力引领着行业的发展。近日,华为Mate 70系列手机的发布会正式定档在11月26日,这一消息引发了众多科技爱…

NVR录像机汇聚管理EasyNVR多品牌NVR管理工具视频汇聚技术在智慧安防监控中的应用与优势

随着信息技术的快速发展和数字化时代的到来,安防监控领域也在不断进行技术创新和突破。NVR管理平台EasyNVR作为视频汇聚技术的领先者,凭借其强大的视频处理、汇聚与融合能力,展现出了在安防监控领域巨大的应用潜力和价值。本文将详细介绍Easy…

MySQL:表设计

表的设计 从需求中获得类,类对应到数据库中的实体,实体在数据库中表现为一张一张的表,类中的属性就对应着表中的字段(也就是表中的列) 表设计的三大范式: 在数据库设计中,三大范式&#xff0…

单元测试时报错找不到@SpringBootConfiguration

找到问题出现原因: 错误表示 Spring Boot 在运行测试时无法找到 SpringBootConfiguration 注解。 通常,SpringBootTest注解用于加载 Spring Boot 应用上下文,但它需要找到一个带有SpringBootConfiguration(或者Configuration&am…

Python爬虫下载新闻,Flask展现新闻(2)

上篇讲了用Python从新闻网站上下载新闻,本篇讲用Flask展现新闻。关于Flask安装网上好多教程,不赘述。下面主要讲 HTML-Flask-数据 的关系。 简洁版 如图,页面简单,主要显示新闻标题。 分页,使用最简单的分页技术&…

信捷PLC转以太网连接电脑方法

信捷XC/XD/XL等系列PLC如何上下载程序?可以选择用捷米特JM-ETH-XJ模块轻松搞定,并不需要编程,即插即用,具体看见以下介绍: 产品介绍 捷米特JM-ETH-XJ是专门为信捷PLC转以太网通讯面设计,可实现工厂设备信息化需求,对…

【头歌实训:拆分单链表】

头歌实训:拆分单链表 文章目录 任务描述相关知识单链表的基本概念单链表的头结点单链表的特点单链表插入一个结点单链表删除一个结点删除操作的语句如下: 创建单链表头插法建立单链表尾插法建立单链表 输出单链表 编程要求测试说明输入格式输出格式样例…

渑池县中药材产业党委莅临河南广宇企业管理集团有限公司参观交流

11月14日,渑池县人大副主任、工商联主席杨航率县中药材产业党委代表团一行13人,莅临河南广宇集团参观交流。河南广宇集团总经理王峰、副总经理王培等领导热情接待并陪同参观、座谈。 代表团一行首先参观了集团旗下郑州美信中医院(庚贤堂中医药…

零基础Java第十九期:认识String(一)

目录 一、String的重要性 二、String的常用方法 2.1. 字符串构造 2.2. String对象的比较 2.3. 字符串查找 2.4. 转化 2.4. 字符串替换 2.5. 字符串拆分 2.6. 字符串截取 一、String的重要性 在C语言中已经涉及到字符串了,但是在C语言中要表示字符串只能…

基于Lora通讯加STM32空气质量检测WIFI通讯

目录 目录 前言 一、本设计主要实现哪些很“开门”功能? 二、电路设计原理图 1.电路图采用Altium Designer进行设计: 2.实物展示图片 三、程序源代码设计 四、获取资料内容 前言 随着环境污染问题的日益严重,空气质量的监测与管理已经…

JMeter中添加请求头

在JMeter中添加请求头的步骤如下: 1.打开HTTP信息头管理器 : 首先,你需要进入JMeter的HTTP请求组件。这可以通过在HTTP请求测试元素上右键点击,然后选择“添加 > 配置元件 > HTTP信息头管理器”来完成。 2.添加新的请求头…

面试_ABtest原理简介

01 什么是ABtest ABtest来源于假设检验,现有两个随机均匀的有样本组A、B,对其中一个组A做出某种改动,实验结束后分析两组用户行为数据,通过显著性检验,判断这个改动对于我们所关注的核心指标是否有显著的影响&#xf…

PCB+SMT线上报价系统+PCB生产ERP系统自动化拼板模块升级

PCB生产ERP系统的智能拼版技术,是基于PCB前端报价系统获取到的用户或市场人员已录入系统的板子尺寸及set参数等,按照最优原则或利用率最大化原则自动进行计算并输出拼版样式图和板材利用率,提高工程人员效率,减少板材的浪费。覆铜…

Kubernetes 10 问,测测你对 k8s 的理解程度

Kubernetes 10 问 假设集群有 2 个 node 节点,其中一个有 pod,另一个则没有,那么新的 pod 会被调度到哪个节点上? 应用程序通过容器的形式运行,如果 OOM(Out-of-Memory)了,是容器重…

《操作系统 - 清华大学》3 -3:连续内存分配:内存碎片与分区的动态分配

文章目录 0. 概述1. 内存碎片问题2. 动态分配3. 首次适配算法4. 最优适配算法5. 最差适配算法 0. 概述 内存分配是操作系统管理过程中很重要的环节,首先需要考虑的是一块连续区域分配的过程,这个过程中会有很多问题,首先比较关注的一个问题是…

CICD持续集成与持续交付

一 CICD是什么 CI/CD 是指持续集成(Continuous Integration)和持续部署(Continuous Deployment)或持续交付(Continuous Delivery) 1.1 持续集成(Continuous Integration) 持续集成…

[前端面试]javascript

js数据类型 简单数据类型 null undefined string number boolean bigint 任意精度的大整数 symbol 创建唯一且不变的值,常用来表示对象属性的唯一标识 复杂数据类型 object,数组,函数,正则,日期等 区别 存储区别 简单数据类型因为其大小固定…

多线程-阻塞队列

目录 阻塞队列 消息队列 阻塞队列用于生产者消费者模型 概念 实现原理 生产者消费者主要优势 缺陷 阻塞队列的实现 1.写一个普通队列 2.加上线程安全和阻塞等待 3.解决代码中的问题 阻塞队列 阻塞队列,是带有线程安全功能的队列,拥有队列先进…

Uniapp 引入 Android aar 包 和 Android 离线打包

需求: 原生安卓 apk 要求嵌入到 uniapp 中,并通过 uniapp 前端调起 app 的相关组件。 下面手把手教你,从 apk 到 aar,以及打包冲突到如何运行,期间我所遇到的问题都会 一 一 进行说明,相关版本以我文章内为…

软间隔支持向量机

软间隔支持向量机 ​ 我们先直接给出软间隔支持向量机的形式: P min ⁡ ω , b , ζ 1 2 ∥ ω ∥ 2 2 − C ∑ i 1 m ζ i s . t . y i ( ω x i b ) ≥ 1 − ζ i , i 1 , 2 , 3.. m ζ i ≥ 0 , i 1 , 2 , 3.. m P \min_{\omega,b,\zeta} \frac{1}{2}\Ve…