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寄存器的命名介绍、功能详解以及使用方法。

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

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Hadoop实训】Hive 数据操作②

延续上一篇文章,不懂的宝子们请看以下链接: 【Hadoop实训】Hive 数据操作①-CSDN博客 目录 一、Group by 语句 (1)、计算emp表每个部门的平均工资 (2)、计算emp表每个部门中每个岗位的最高工资 二、Having 语句 (1)、求每个部门的平均工资 (2)、求每个…

Vulhub漏洞复现---solr---CVE-2019-17558

漏洞描述 Apache Solr 5.0.0到Apache Solr 8.3.1容易受到通过VelocityResponseWriter执行的远程代码的攻击。Velocity模板可以通过configset ’ Velocity / 目录中的Velocity模板或作为参数提供。用户定义的configset可以包含可呈现的、潜在的恶意模板。参数提供的模板在默认情…

ADS学习笔记 5. 微带天线设计

基于ADS2023 update2 参考书籍:卢益锋老师《ADS射频电路设计与仿真学习笔记》 更多笔记:ADS学习笔记 1. 功率放大器设计ADS学习笔记 2. 低噪声放大器设计ADS学习笔记 3. 功分器设计ADS学习笔记 4. 微带分支定向耦合器设计 目录 0、设计指标 1、微带…

【JAVA】使用IDEA创建maven聚合项目

【JAVA】使用IDEA创建maven聚合项目 1.效果图 2.创建父模块项目 2.1删除父模块下面的src目录以及不需要的maven依赖 3创建子模块项目 3.1右击父模块项目选择Module… 3.2创建子模块 3.3删除子模块下不需要的maven依赖 4.子模块创建完成后引入SpringBoot依赖启动项目

一文详细深入总结服务器选型

1. 题记: 服务器选型工作是项目规划检讨的一项非常重要的工作,本文详细深入总结服务器选型。 2. 服务器基础知识概览 2.1 服务器的定义与功能 2.1 .1 定义 服务器是一种高性能计算机,其设计目的是在网络中提供服务。它可以处理来自多个客…

如何编译 Cesium 源码

如何编译 Cesium 源码 Cesium 是一个开源的 JavaScript 库,用于构建 3D 地球和地图应用程序。它提供了一套强大的 API 和工具,使开发者能够创建丰富的地理空间应用。本文将指导您如何从 GitHub 下载 Cesium 源码,并在本地进行编译。 TilesB…

车载诊断架构 --- 关于DTC的开始检测条件

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 所有人的看法和评价都是暂时的,只有自己的经历是伴随一生的,几乎所有的担忧和畏惧,都是来源于自己的想象,只有你真的去做了,才会发现有多快乐。…

AI大模型(一):Prompt AI编程

一、Prompt Engineering,提示工程 提示工程也叫指令工程: Prompt是发给大模型的指令,比如【讲个睡前故事】、【用Python写个消消乐游戏】等;本质上大模型相关的工程工作,都是围绕prompt展开的;提示工程门…

如何在 Ubuntu 上安装 Jellyfin 媒体服务器

Jellyfin 是一个开源的媒体服务器软件,让你可以整理、管理和流式传输你的个人媒体收藏,比如电影、音乐、电视节目和照片,而且完全免费,没有订阅费用或数据收集的担忧。 简介 媒体管理:Jellyfin 整理媒体库&#xff0…

数据结构(初阶4)---循环队列详解

循环队列 1.循环队列的结构  1).逻辑模式 2.实现接口  1).初始化  2).判断空和满  3).增加  4).删除  5).找头  6).找尾 3.循环队列的特点 1.循环队列的结构 1).逻辑模式 与队列是大同小异的, 其中还是有一个指向队列头的head指针, 也有一个指向尾…

Qwen2.5-Coder-32B-Instruct Docker 部署openai接口

Qwen2.5-Coder-32B-Instruct 模型下载,国内快捷方式: conda create -n modelscope python=3.10 conda activate modelscopepip install modelscopemodelscope download --model Qwen/Qwen2.5-Coder-32B-Instruct --local_dir /ssd/xiedong/Qwen/Qwen2.5-Coder-32B-I

图形几何之美系列:二维凸包艺术赏析

“凸包是计算几何中的概念,凸包在多个领域中有广泛的应用,主要包括几何计算、图形处理、优化问题、路径规划等。” 1.前言 凸包话题包括二维凸包、三维凸包以及高维凸包。对于平面点集,探究如何构造可以覆盖给定点集最小的凸多边形&#xff1…

速通前端篇 —— HTML

找往期文章包括但不限于本期文章中不懂的知识点: 个人主页:我要学编程程(ಥ_ಥ)-CSDN博客 所属专栏:速通前端 目录 HTML的介绍 如何创建HTML文件 HTML 文件基本结构 HTML常用标签 title标签 标题标签 h1-h6 段落标签 p 换行标签 b…

shell编程--永久环境变量和字符串显位

环境变量 echo $HOME 在终端输出后会显示家目录有个root变量 我们会提出个疑问为什么平时我们在终端输入sl 或者which等等命令会输出一些内容呢,这是因为这些命令都有对应的环境变量。 我们查看一下环境变量 在终端输入: echo $PATH 我们看一下输出…

Python毕业设计选题:基于django+vue的二手物品交易系统

开发语言:Python框架:djangoPython版本:python3.7.7数据库:mysql 5.7数据库工具:Navicat11开发软件:PyCharm 系统展示 管理员登录 管理员功能界面 用户管理 店铺管理 二手物品管理 广告管理 留言反馈 订单…

Spring:bean的配置

对于bean的配置中,主要会讲解bean基础配置,bean的别名配置,bean的作用范围配置(重点),这三部分内容: bean基础配置 id与class配置 bean的name属性 bean的别名配置 bean作用范围scope配置 scope使用后续思考 介绍完scope属性以后,我们…

前端无感刷新token

摘要: Axios 无感知刷新令牌是一种在前端应用中实现自动刷新访问令牌(access token)的技术,确保用户在进行 API 请求时不会因为令牌过期而中断操作 目录概览 XMLHttpRequestAxiosFetch APIJQuni.request注意事项: 访问…

图形 2.6 伽马校正

伽马校正 B站视频:图形 2.6 伽马校正 文章目录 伽马校正颜色空间传递函数 Gamma校正校正过程为什么需要校正?CRT与转换函数 为什么sRGB在Gamma 0.45空间? 人对亮度的敏感韦伯定律中灰值 线性工作流不在线性空间下进行渲染的问题统一到线性空…

【redis】—— 环境搭建教程

上一节,我们大致了解了Redis的几个重要版本,在本教程中,我们选择了5.0版本,因为5.0已经具备了大部分的功能特性,并且与7.0版本相比,其安装使用过程更为简便。 Redis的官方并不直接支持微软的Windows操作系统…

Springboot采用jasypt加密配置

目录 前言 一、Jasypt简介 二、运用场景 三、整合Jasypt 2.1.环境配置 2.2.添加依赖 2.3.添加Jasypt配置 2.4.编写加/解密工具类 2.5.自定义加密属性前缀和后缀 2.6.防止密码泄露措施 2.61.自定义加密器 2.6.2通过环境变量指定加密盐值 总结 前言 在以往的多数项目中&#xff0…