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…...
Python爬虫实战:研究MechanicalSoup库相关技术
一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...

多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度
一、引言:多云环境的技术复杂性本质 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时,基础设施的技术债呈现指数级积累。网络连接、身份认证、成本管理这三大核心挑战相互嵌套:跨云网络构建数据…...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)
文章目录 1.什么是Redis?2.为什么要使用redis作为mysql的缓存?3.什么是缓存雪崩、缓存穿透、缓存击穿?3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...

剑指offer20_链表中环的入口节点
链表中环的入口节点 给定一个链表,若其中包含环,则输出环的入口节点。 若其中不包含环,则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...
使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度
文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...
Java编程之桥接模式
定义 桥接模式(Bridge Pattern)属于结构型设计模式,它的核心意图是将抽象部分与实现部分分离,使它们可以独立地变化。这种模式通过组合关系来替代继承关系,从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...
Redis:现代应用开发的高效内存数据存储利器
一、Redis的起源与发展 Redis最初由意大利程序员Salvatore Sanfilippo在2009年开发,其初衷是为了满足他自己的一个项目需求,即需要一个高性能的键值存储系统来解决传统数据库在高并发场景下的性能瓶颈。随着项目的开源,Redis凭借其简单易用、…...
es6+和css3新增的特性有哪些
一:ECMAScript 新特性(ES6) ES6 (2015) - 革命性更新 1,记住的方法,从一个方法里面用到了哪些技术 1,let /const块级作用域声明2,**默认参数**:函数参数可以设置默认值。3&#x…...
flow_controllers
关键点: 流控制器类型: 同步(Sync):发布操作会阻塞,直到数据被确认发送。异步(Async):发布操作非阻塞,数据发送由后台线程处理。纯同步(PureSync…...

内窥镜检查中基于提示的息肉分割|文献速递-深度学习医疗AI最新文献
Title 题目 Prompt-based polyp segmentation during endoscopy 内窥镜检查中基于提示的息肉分割 01 文献速递介绍 以下是对这段英文内容的中文翻译: ### 胃肠道癌症的发病率呈上升趋势,且有年轻化倾向(Bray等人,2018&#x…...