STM32------分析GPIO寄存器
一、初始LED原理图

共阴极led
LED发光二极管,需要有电流通过才能点亮,当有电压差就会产生电流
二极管两端的电压差超过2.7v就会有电流通过
电阻的作用
由于公式I=V/R

不加电阻容易造成瞬间电流无穷大
发光二极管工作电流为10-20MA
3.3v / 1kΩ = 3.3mA
电阻作用限流电阻。
二、分析GPIO寄存器
2.1 前言
编程的目的是为了操作硬件,硬件分布在地址上,所以转变为编程操作地址,因为地址是唯一的。
编程的目的就操作地址间接操作硬件
地址分布比较广,硬件都会把地址用寄存器的方式来分布
某个地址到某个地址属于某个寄存器
这样的话我们操作硬件实际上就是在操作地址,操作地址实际上就是转化为操作寄存器。
2.2 本节目标

操控PA1-PA4输出高电平
经过前言分析可知,这几个问题编程找到一个或者某几个寄存器,这几个寄存器可以让我们的PA1-PA4进行高电平的输出。
另一个要注意的我们的gpio口,当前pa1-pa4要输出高低电平,那么当前这个pa1-pa4他所对应的功能是通用的输入输出。 这时候pa1-pa4是输出功能,还有其他功能,当前处理器有48个管脚,每一个管脚有多个功能,某一时刻只用一个功能,这就是管脚的复用。找寄存器,那几个可以管理我们的pa1-pa4,让这个四个管脚可以当做输入输出功能中的输出功能来用。
为了更好的实现分析,这时候需要去看stm32的中文参考手册
![]()

其中第八节是对gpio的描述
GPIO描述:每个gpio端口有两个32位配置寄存器,两个数据寄存器,一个32位置位/复位寄存器,一个16位复位寄存器,一个32位锁定寄存器,总共有七个寄存器,我们就是通过操作这些寄存器来控制我们的GPIO的。
注:1字节=8位(bit)
其中GPIO每个端口又可以配置成如下八种模式:

对于具体gpio配置成什么模式,8.1.11节外设的GPIO配置有详细解释
2.3 寄存器描述
首先看8.2.1端口配置低寄存器(GPIOx_CRL)x=A..E

4位一组
分别配置输入输出模式和速度。
从表中可以看到低寄存器对应的是GPIO0-7
正好对应32的八组。

端口配置高寄存器是8-15


因为我们要配置的是PA1-4,所以我们只关系低寄存器的1-4也就是4-19位

对于输出模式,大多数gpio采用推挽输出模式即可
2.4 寄存器地址确定
当我们确定好要操作的寄存器后,下一步就需要找到寄存器对应的地址,然后在相应的位写入数据即可
寄存器地址由基地址+偏移地址组成
gpio的基地址在![]()
的寄存器映像中可以找到

整个地址被分为0x0000 0000 到 0Xffff FFFF,
当前stm32是32位的处理器。就是2的32次方。
最多能管理从0开始一直到2的32次方减1.

由寄存器映像可知,gpioA的基地址是0x4001 0800
所以我们要操作的低寄存器地址就是基地址+偏移地址=0x4001 0800 + 0x00
一会就要向这个地址里面的4到19位写0011 0011 0011 0011
根据寄存器配置说明可知00是通用推挽输出,11是最大速度50MHz,这样gpioA1-4就都配置成了最大速度50Mhz ,推挽输出模式
2.5 输出寄存器配置
当知道gpio1-4的地址并配置好输出模式后,我们应该考虑输出数据了,应该会有一个寄存器会完成这部分操作。

找到了端口输出数据寄存器
首先确定其地址,地址=基地址+偏移地址=0x4001 0800 + 0xCH = 0x4001 08CH
这16位就占了我们寄存器中的低16位。
端口输出寄存器干什么用的呢,你往哪一个端口写1,哪一个就输出高电平 ,哪一个端口写0就输出低电平。
gpio我们只用到了pa1-pa4,所以这个寄存器我们只需要关心

三、寄存器配置代码
控制低寄存器地址
![]()
我们现在是要往地址里面去写 值,那么我们现在要修改的不是地址指向的位置而是要修改我们地址里面的值,地址里面的内容,也就是说我们要取出这地址里面的内容把里面的内容做一个修改,要如何修改如何取出地址里面的值,我们就需要再加一个强制类型转换。
这个代表了地址了: ![]()
取出地址里面的内容:![]()
用到了两个*,第一个*是强制类型转换,将我们的0x40010800转成了一个用来表示地址的指针,如何取出地址里面的值呢,取值操作符。
取出地址里面的值了下一步要干什么,我是不是要修改这个地址里面的值。
如何修改呢,我们要修改的是这个地址里面的4-19位就可以了。
如何修改4-19位最好的 做法是先给他清零,然后再写入我们的新值,
这一部分属于C语言的内容
分别用到了
| & | 按位与 | 如果两个相应的二进制位都为1,则该位的结果值为1,否则为0 |
| I | 按位或 | 两个相应的二进制位中只要有一个为1,该位的结果值为1 |
| ^ | 按位异或 | 若参加运算的两个二进制位值相同则为0,否则为1 |
| ~ | 取反 | ~是一元运算符,用来对一个二进制数按位取反,即将0变1,将1变0 |
| << | 左移 | 用来将一个数的各二进制位全部左移N位,右补0 |
| >> | 右移 | 将一个数的各二进制位右移N位,移到右端的低位被舍弃,对于无符号数,高位补0 |
1.与运算(&)
参加运算的两个数据,按二进制位进行“与”运算。
运算规则:0&0=0; 0&1=0; 1&0=0; 1&1=1;
即:两位同时为“1”,结果才为“1”,否则为0
例如:3&5 即 0000 0011 & 0000 0101 = 0000 0001 因此,3&5的值得1。
两个数与的结果一定是比任意两个数都小,换句话说,越与数越小
2.或运算(|)
参加运算的两个对象,按二进制位进行“或”运算。
运算规则:0|0=0; 0|1=1; 1|0=1; 1|1=1;
即 :参加运算的两个对象只要有一个为1,其值为1。
例如:3|5 即 0000 0011 | 0000 0101 = 0000 0111 因此,3|5的值得7。
两个数或的结果一定是大于其中的任意一个数,换句话说,越或数越大
3.异或运算(^)
参加运算的两个数据,按二进制位进行“异或”运算。
运算规则:0^0=0; 0^1=1; 1^0=1; 1^1=0;
即:参加运算的两个对象,如果两个相应位为“异”(值不同),则该位结果为1,否则为0。
例如:9^5可写成算式如下: 00001001^00000101=00001100 可见9^5=12
4.取反运算(~)
参加运算的数据,按二进制位进行“取反”运算。
运算规则:~0=1; ~1=0;
即:参与运算的数据,对应的二进制取反后 0 变成 1 ,1 变成 0 。
例如: 3 :00000011 ; ~3 :11111100 = 252
5.左移运算(<<)
参与运算的数据,二进制全部向左移动 n 位,左边舍去,右边补 0
运算规则:00000101 << 1 = 00001010
即:参与运算的数据,对应的二进制位向左移动 n 位,左边舍去,右边补 0 。
例如:2 << 1 = 4 ; 00000010 << 1 = 00000100
左移一位相当于乘以 2
6.右移运算(>>)
参与运算的数据,二进制全部向右移动 n 位,右边舍去,左边补 0
运算规则:00000101 >> 1 = 00000010
即:参与运算的数据,对应的二进制位向右移动 n 位,右边舍去,左边补 0 。
例如 :2 >> 1 = 1 ; 00000010 >> 1 = 00000001
右移一位相当于除以 2
上述位预算符---------原文链接:https://blog.csdn.net/qq_52354698/article/details/119301131
与操作会清零,如何修改4-19位,4-19位清零,其他位不变,
![]()
0xff0000f = 111111111111000000000000000011111111
当进行位与操作时,因为4-19位都是0,按照其运算规则,得到值始终是0
清楚之后,这时候需要去修改我们的4-19位分别写成0011 0011 0011 0011,
这时候可以采用或操作。
0011等于十六进制的3
或操作置位,
=0x00033330;

四、通过寄存器地址进行点灯操作
注:
清零是与操作
置1是或操作
管脚高电平点亮
低电平熄灭
点亮led灯和我们的端口输出数据寄存器有关:

寄存器地址等于基地址+偏移地址
现在我们要让他输出一个高电平
就要往这个寄存器里面的1-4位写高电平
要让灯熄灭的话对应写0就可以了
在进入循环语句之前应该让我们的led灯都熄灭,在循环中点亮熄灭
DOR寄存器地址:![]()
=0x4001080c
首先对寄存器清零,清零就是与操作

1<<1 = 10
1<<2 = 100
1<<3 = 1000
1<<4 = 10000
|或完是11110
取反后是00001
通过循环做一个延时


五、GPIO库函数

在stm32固件库函数手册的第10节对GPIO的库函数进行了描述
GPIO寄存器结构,GPIO_TypeDef和AFIO_TypeDef在文件stm32f10x_map.h中
其中AFIO有两个功能:
1、引脚复用重映射
2、中断引脚选择
GPIO函数库

其中标黄的是常用的几个库函数
函数GPIO_DeInit和函数GPIO_DeInit
配置GPIO端口为默认值。
函数GPIO_Init对GPIO进行初始化,主要包括配置GPIOx的那个引脚,配置成什么模式,速度是多少,这些都是通过一个结构体进行配置的。
GPIO_ReadInputDataBit:读取PA15的输入值(GPIOA_PIN_15)
函数GPIO_ReadInputData:读取GPIOA的输入值,多位
函数GPIO_ReadOutputDataBit:读取PA15的输出值
函数GPIO_ReadOutputData:读取GPIOA的输出值,多位
一个字节=8位(bit)所以末尾bit就是读一位的值
函数 GPIO_SetBits:设置PA15的值,就是置1
函数 GPIO_ResetBits:清除PA15的输入值,就是置0
函数 GPIO_WriteBit:设置PA15的值,可以是0也可以是1
函数GPIO_Write:设置PA的值,可以是一个十六进制的值,一下设置多位
函数GPIO_EXTILineConfig:中断时使用,选择一个GPIO引脚作为中断线路。
相关文章:
STM32------分析GPIO寄存器
一、初始LED原理图 共阴极led LED发光二极管,需要有电流通过才能点亮,当有电压差就会产生电流 二极管两端的电压差超过2.7v就会有电流通过 电阻的作用 由于公式IV/R 不加电阻容易造成瞬间电流无穷大 发光二极管工作电流为10-20MA 3.3v / 1kΩ 3.…...
数学实验-Matlab使用(1)
使用方法以及笔记均在文件中 class1_func1.m function f class1_func1(x) % f为输出,输出有多个时需要用中括号以矩阵的方式包起来 % x为输入f sin(x)class1_func2.m function [a,b,u,v] class1_func2(x,y)[a,b] eig(x)[u,v] eig(y)class1.m % 当语句后有…...
kafka文件存储机制和消费者
1.broker文件存储机制 去查看真正的存储文件: 在/opt/module/kafka/datas/ 路径下 kafka-run-class.sh kafka.tools.DumpLogSegments --files ./00000000000000000000.index 如果是6415那么这个会存储在563的log文件之中,因为介于6410和10090之间。 2.…...
《汇编语言》- 读书笔记 - 第15章-外中断
《汇编语言》- 读书笔记 - 第15章-外中断 15.1 接口芯片和端口15.2 外中断信息1. 可屏蔽中断(Maskable Interrupt)2. 不可屏蔽中断(Non-Maskable Interrupt)设计思想 15.3 PC 机键盘的处理过程1. 键盘输入2. 引发 9 号中断3. 执行…...
【Vue3】CSS 新特性
:slotted <template> <!-- App.vue--><Son ><div class"a">我要插入了</div></Son> </template><script setup lang"ts"> import Son from ./components/Son.vue </script><style></sty…...
四信水电站泄洪预警方案,精准提升防汛应急水平
2022年5月水利部办公厅发布《关于开展水库泄洪设施专项排查整改的紧急通知》,为坚决贯彻落实关于水库大坝安全的重要指示批示精神、关于保障水库泄洪通道通畅的批示要求,全力防范水库可能出现的重大险情,确保水库安全度汛。 2023年3月国家能源…...
k8s中容器的调度与创建:CRI,cgroup
container调度与创建 选自:K8s、CRI与container - packy的文章 - 知乎 https://zhuanlan.zhihu.com/p/102897620 Cgroup创建: cgexec -g cpu,memory:$UUID \ > unshare -uinpUrf --mount-proc \ > sh -c "/bin/hostname $UUID &…...
Unity安装与简单设置
安装网址:https://unity.cn 设置语言: 设置安装位置:否则C盘就会爆了 获取一个个人的资格证: 开始安装: 安装完毕。 添加模块:例如简体中文 新建项目: 布局2*3、单栏布局、 设置…...
数据库的介绍、分类、作用和特点
数据库是用来存储、管理和检索数据的集合系统。根据数据处理模型的不同,数据库可以分为多种类型,主要包括: 1、关系型数据库(RDBMS): 介绍:关系型数据库使用表格形式来存储数据,并通…...
【Unity】机器人末端执行器仿真
机械手臂的末端执行器使用多项式来计算转动角度可能有几个原因: 精确控制:机械臂的运动通常需要高度的精确性,特别是在精密工作或复杂运动轨迹的情况下。多项式,特别是高阶的,可以很好地近似复杂的非线性关系和运动轨迹…...
更换个人开发环境后,pycharm连接服务器报错Authentication failed
原因:服务器中更换个人开发环境后,密码变了。 解决:在pycharm中修改服务器开发环境密码即可。 1 找到Tools-Depolyment-Configuration 2 点击SSH Configuration后的省略号 3 修改这里面的Password即可...
E - Bad Juice
解题思路 由于最后返回一个01字符串表示所选人的状态要求人数最少,即字符串长度最少而要用最少的字符,找出则返回的字符为二进制下的编号这样利用了所有的01字符号人表示二进制下位的情况注意对于2的次方项,只需要有位,可以用位均…...
用HTML5的<canvas>元素实现刮刮乐游戏
用HTML5的<canvas>元素实现刮刮乐游戏 用HTML5的<canvas>元素实现刮刮乐,要求:将上面的“图层”的图像可用鼠标刮去,露出下面的“图层”的图像。 示例从简单到复杂。 简单示例 准备两张图像,我这…...
TypeScript + react 中 TypeScript 的加入后 , 有哪些优化项目
在使用 TypeScript 结合 React 进行开发时,TypeScript 提供了许多优化和增强代码质量的方式。以下是一些关键的优化操作和最佳实践: 强类型组件属性(Props)和状态(State): 使用接口或类型别名定义组件的 pr…...
Redis学习路径(构建体系)
学习路径 掌握数据类型(分析底层数据结构)和缓存的基本使用 (理论使用) 掌握 redis 实现高性能,高可靠、高可用技术 (理论)学习redis源代码底层实现 (底层实现) 先来一个引言,比较宏观的角度…...
【README 小技巧】 展示gitee中开源项目start
【README 小技巧】 展示gitee中开源项目start <a target"_blank" hrefhttps://gitee.com/wujiawei1207537021/wu-framework-parent><img srchttps://gitee.com/wujiawei1207537021/wu-framework-parent/badge/star.svg altGitee star/></a>...
tcping实用小工具
Tcping实用小工具命令详解 一、tcping介绍 tcping:tcping命令基于tcp协议监控,可以从较低级别的协议获得简单的,可能不可靠的数据报服务。 原则上,TCP应该能够在从容硬线连接到分组交换或电路交换网络的各种通信系统之上操作。 …...
【Web】Java反序列化之CC2——commons-collections4的新链之一
目录 关于commons-collections4 一个重要的思维模型 触发Transform的关键类:TransformingComparator 反序列化的入口:PriorityQueue Exp 关于commons-collections4 commons-collections4 是 Apache Commons 组件库中的一个项目,它是对旧…...
golang使用gorm操作mysql1
1.mysql连接配置 package daoimport ("fmt""gorm.io/driver/mysql""gorm.io/gorm""gorm.io/gorm/logger" )var DB *gorm.DB// 连接数据库,启动服务的时候,init方法就会执行 func init() {username : "roo…...
Flutter异常上报及性能监控实现
1. 页面异常监测 在Flutter中,通常用FlutterError监测Flutter框架抛出的异常,用runZonedGuarded监测应用中用户代码异常。 class AppGuarded {run(Widget app) {//1. 用FlutterError监测flutter框架抛出的异常FlutterError.onError (FlutterErrorDetail…...
为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?
在建筑行业,项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升,传统的管理模式已经难以满足现代工程的需求。过去,许多企业依赖手工记录、口头沟通和分散的信息管理,导致效率低下、成本失控、风险频发。例如&#…...
对WWDC 2025 Keynote 内容的预测
借助我们以往对苹果公司发展路径的深入研究经验,以及大语言模型的分析能力,我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际,我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测,聊作存档。等到明…...
学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1
每日一言 生活的美好,总是藏在那些你咬牙坚持的日子里。 硬件:OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写,"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...
Java面试专项一-准备篇
一、企业简历筛选规则 一般企业的简历筛选流程:首先由HR先筛选一部分简历后,在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如:Boss直聘(招聘方平台) 直接按照条件进行筛选 例如:…...
Redis数据倾斜问题解决
Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中,部分节点存储的数据量或访问量远高于其他节点,导致这些节点负载过高,影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...
React---day11
14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store: 我们在使用异步的时候理应是要使用中间件的,但是configureStore 已经自动集成了 redux-thunk,注意action里面要返回函数 import { configureS…...
JS设计模式(4):观察者模式
JS设计模式(4):观察者模式 一、引入 在开发中,我们经常会遇到这样的场景:一个对象的状态变化需要自动通知其他对象,比如: 电商平台中,商品库存变化时需要通知所有订阅该商品的用户;新闻网站中࿰…...
Python基于历史模拟方法实现投资组合风险管理的VaR与ES模型项目实战
说明:这是一个机器学习实战项目(附带数据代码文档),如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在金融市场日益复杂和波动加剧的背景下,风险管理成为金融机构和个人投资者关注的核心议题之一。VaR&…...
代码规范和架构【立芯理论一】(2025.06.08)
1、代码规范的目标 代码简洁精炼、美观,可持续性好高效率高复用,可移植性好高内聚,低耦合没有冗余规范性,代码有规可循,可以看出自己当时的思考过程特殊排版,特殊语法,特殊指令,必须…...
libfmt: 现代C++的格式化工具库介绍与酷炫功能
libfmt: 现代C的格式化工具库介绍与酷炫功能 libfmt 是一个开源的C格式化库,提供了高效、安全的文本格式化功能,是C20中引入的std::format的基础实现。它比传统的printf和iostream更安全、更灵活、性能更好。 基本介绍 主要特点 类型安全:…...
