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引脚作为中断线路。

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

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

相关文章

C#中什么是非托管代码?托管代码和非托管代码有什么区别

在C#中&#xff0c;托管代码和非托管代码是两种不同类型的代码&#xff0c;它们在内存管理和执行环境上有所不同。 托管代码&#xff08;Managed Code&#xff09;&#xff1a; 托管代码是由.NET运行时&#xff08;CLR&#xff0c;Common Language Runtime&#xff09;管理和执…

新能源汽车产业架构设计与实现:引领未来出行新风向

随着环保意识的增强和能源结构的转型&#xff0c;新能源汽车产业正迅速崛起成为汽车行业的新宠。构建一个完善的新能源汽车产业架构对于推动产业发展、提升竞争力至关重要。本文将从设计原则、关键技术、产业生态等方面&#xff0c;探讨如何设计与实现新能源汽车产业架构。 ##…

那些壁纸,不只是背景

1、方小童在线工具集 网址&#xff1a; 方小童 该网站是一款在线工具集合的网站&#xff0c;目前包含PDF文件在线转换、随机生成美女图片、精美壁纸、电子书搜索等功能&#xff0c;喜欢的可以赶紧去试试&#xff01;

【快速选择】解决TopK问题

目录 一、什么是TopK问题 二、优先级队列 优先级队列介绍 代码实现 三、使用优先级队列解决TopK问题 四、快速选择算法解决TopK问题 快速选择 图解快速选择 代码解决前k小个元素 五、优先级队列与快速选则算法比较 优先级队列 快速选择 一、什么是TopK问题 TopK问题…

Linux Seccomp 简介

文章目录 一、简介二、架构三、Original/Strict Mode四、Seccomp-bpf五、seccomp系统调用六、Linux Capabilities and Seccomp6.1 Linux Capabilities6.2 Linux Seccomp 参考资料 一、简介 Seccomp&#xff08;secure computing&#xff09;是Linux内核中的一项计算机安全功能…

软考 系统分析师系列知识点之需求获取(7)

所属章节&#xff1a; 第11章. 软件需求工程 第2节. 需求获取 需求获取是一个确定和理解不同的项目干系人的需求和约束的过程。需求获取是一件看上去很简单、做起来却很难的事情。需求获取是否科学、准备是否充分&#xff0c;对获取出来的结果影响很大&#xff0c;这是因为大部…

Leetcode刷题(十八)

一、203. 移除链表元素 代码&#xff1a; class Solution:def removeElements(self, head: Optional[ListNode], val: int) -> Optional[ListNode]:while head and head.val val:head head.nextpre, cur head, headwhile cur:if cur.val val:pre.next cur.nextelse:p…

全闪存加速信创数据库数仓一体机解决方案

立足行业&#xff0c;深度解读 在新的大数据生态中&#xff0c;传统数据库/数据仓库技术和产品成为大数据生态中的组成部分&#xff0c;对结构化数据的存储和计算进行支撑。 数据库&数据仓库一体机是高端、核心数据管理产品&#xff0c;在我国党政、银行、交通等领域广泛…

nginx出现 “414 request-uri too large”

nginx出现 “414 request-uri too large” 1.修改传参方式 POST 2.字段能变成后端获取就自己获取&#xff0c;不用前端传 3.修改nginx配置&#xff0c;添加client_header_buffer_size 512k;large_client_header_buffers 4 512k;配置

2022年CSP-J认证 CCF信息学奥赛C++ 中小学初级组 第一轮真题-完善程序题解析

2022CCF认证第一轮&#xff08;CSP-J&#xff09;真题 三、完善程序题 第一题 枚举因数 从小到大打印正整数n的所有正因数。试补全枚举程序 #include <iostream> using namespace std;int main(){int n;cin >> n;vector<int> fac;fac.reserve((int)ceil(…

C++的引用

目录 引用 常引用 指针与引用的关系 小拓展 引用的价值 做形参 传值、传引用的效率比较 做返回值 函数传值返回 函数传引用返回&#xff08;错误示范&#xff09; 野引用&#xff08;错误示范&#xff09; 引用的正常应用 值和引用作为返回值类型的性能比较 引用和…

spring-boot-starter-parent和spring-boot-dependencies介绍

springboot项目的pom文件中&#xff0c;我们经常看见这样(下图)两种springboot的版本依赖管理方式&#xff1b;图片中的这两种依赖声明方式任意用其中一种都可以。文章后面会简单阐述一下区别和使用场景。 事例中完整的pom文件 <?xml version"1.0" encoding&quo…

阿尔卡特Adixen ADP/ADS 系列 2 干泵使用说明

阿尔卡特Adixen ADP/ADS 系列 2 干泵使用说明

HTML教程(3)——常用标签(1)

一、图片标签 1.场景&#xff1a;在网页中显示图片 2.基本写法&#xff1a; <img src""> 3.特点&#xff1a;单标签&#xff0c;img标签需要展示对应的效果&#xff0c;需要借助其属性进行设置 4常用属性&#xff1a; src&#xff1a;其属性值为目标图片…

【框架】Spring 框架重点解析

Spring 框架重点解析 1. Spring 框架中的单例 bean 是线程安全的吗&#xff1f; 不是线程安全的 Spring 框架中有一个 Scope 注解&#xff0c;默认的值是 singleton&#xff0c;即单例的&#xff1b;因为一般在 Spring 的 bean 对象都是无状态的&#xff08;在生命周期中不被…

解决Mybatis报Type interface *.*Mapper is not known to the MapperRegis

解决Mybatis报Type interface *.*Mapper is not known to the MapperRegis 问题发现问题解决方法一&#xff1a;检查Mapper文件的namespace路径是否正确方法二&#xff1a;使用其他方法是否正确 问题发现 在学习MyBatis框架的时候&#xff0c;不使用 XML 构建 SqlSessionFacto…

Project_Euler-44 题解

Project_Euler-44 题解 题目 思路 题目给出了一个性质&#xff0c;让我在对应性质的数据中找出目标值&#xff0c;这种问题首先想到的就是枚举。 我们可以枚举 P k P_k Pk​ &#xff0c;对于每一个 P k P_k Pk​ &#xff0c;我们再枚举 P j P_j Pj​&#xff0c; P j P_…

【ue5】滑铲系统蓝图笔记

大致逻辑如下&#xff1a; 一、导入动画 滑铲蹲待机蹲行走 导入到文件夹中 可以右键设置颜色&#xff0c;便于区分。 二、调整动画 1.启动根运动 启动根运动后&#xff0c;人物才可以位移&#xff0c;不然只能在原地。 打开动画序列&#xff0c;勾选启用根运动Enabled…

用node或者vscode开启一个简单的本地server服务器,加载html网页

使用Live Server 想要加载本地html页面可以快速能让它在你本地浏览器中打开&#xff0c;可以有好多种方式&#xff0c;如果你有使用vscode&#xff0c;可以安装一个插件&#xff1a;Live Server&#xff0c;然后直接在vscode中直接右键就可以开启这个服务&#xff1a; 安装好之…

C++基于多设计模式下的同步异步日志系统day2

&#x1f4df;作者主页&#xff1a;慢热的陕西人 &#x1f334;专栏链接&#xff1a;C基于多设计模式下的同步&异步日志系统 &#x1f4e3;欢迎各位大佬&#x1f44d;点赞&#x1f525;关注&#x1f693;收藏&#xff0c;&#x1f349;留言 主要内容实现了日志代码设计的实…