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…...
业务系统对接大模型的基础方案:架构设计与关键步骤
业务系统对接大模型:架构设计与关键步骤 在当今数字化转型的浪潮中,大语言模型(LLM)已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中,不仅可以优化用户体验,还能为业务决策提供…...
ssc377d修改flash分区大小
1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...
《Playwright:微软的自动化测试工具详解》
Playwright 简介:声明内容来自网络,将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具,支持 Chrome、Firefox、Safari 等主流浏览器,提供多语言 API(Python、JavaScript、Java、.NET)。它的特点包括&a…...
理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端
🌟 什么是 MCP? 模型控制协议 (MCP) 是一种创新的协议,旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议,它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...
工程地质软件市场:发展现状、趋势与策略建议
一、引言 在工程建设领域,准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具,正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...
基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解
JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用,结合SQLite数据库实现联系人管理功能,并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能,同时可以最小化到系统…...
莫兰迪高级灰总结计划简约商务通用PPT模版
莫兰迪高级灰总结计划简约商务通用PPT模版,莫兰迪调色板清新简约工作汇报PPT模版,莫兰迪时尚风极简设计PPT模版,大学生毕业论文答辩PPT模版,莫兰迪配色总结计划简约商务通用PPT模版,莫兰迪商务汇报PPT模版,…...
2025年渗透测试面试题总结-腾讯[实习]科恩实验室-安全工程师(题目+回答)
安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 腾讯[实习]科恩实验室-安全工程师 一、网络与协议 1. TCP三次握手 2. SYN扫描原理 3. HTTPS证书机制 二…...
为什么要创建 Vue 实例
核心原因:Vue 需要一个「控制中心」来驱动整个应用 你可以把 Vue 实例想象成你应用的**「大脑」或「引擎」。它负责协调模板、数据、逻辑和行为,将它们变成一个活的、可交互的应用**。没有这个实例,你的代码只是一堆静态的 HTML、JavaScript 变量和函数,无法「活」起来。 …...
【前端异常】JavaScript错误处理:分析 Uncaught (in promise) error
在前端开发中,JavaScript 异常是不可避免的。随着现代前端应用越来越多地使用异步操作(如 Promise、async/await 等),开发者常常会遇到 Uncaught (in promise) error 错误。这个错误是由于未正确处理 Promise 的拒绝(r…...
