GPIO寄存器的地址怎么寻找

最新更新时间:2022-09-30来源: csdn关键字:GPIO  寄存器  地址 手机看文章 扫描二维码
随时随地手机看文章

由上图知,GPIOC的地址就是在这个PERIPH_BASE地址的基础上偏移得到得。


我们可以一步一步的计算一下GPIOC的地址是多少。


0x40000000 + 0x10000 + 0x1000 == 0x4001 1000

我们的计算结果和参考手册上的一样。注意:这些都是芯片上面真实的物理地址。如果需要运行操作系统,由于在操作系统中,程序的地址对应的是虚拟内存,在操作系统中对GPIO进行操作时,需要将这个真实的物理地址映射到虚拟地址上面去,这样操作系统才能对GPIO进行操作。

这个是GPIO上的各个寄存器,它被装在一个结构体里面。

由这张图可知,这也就是为什么GPIO的寄存器仅通过偏移地址就可以能找到它。


如:GPIOC->CRL

CRL寄存器是结构体的第一个变量,所以它的偏移量就为0x00,所以CRL寄存器的地址为:0x4001 1000 + 0x00 == 0x4001 1000


如:GPIOC->CRH

CRH寄存器是结构体的第二个变量,所以它的偏移量就为0x04,所以CRH寄存器的地址为:0x4001 1000 + 0x04 == 0x4001 1004


这个0x40000000基地址到底是什么?

我们看到PERIPH_BASE地址被宏定义为0x40000000


实际上0x40000000如下图:



它实际上是TIM2定时器外设的首地址,也是stm32中整个存储器映像的首地址。所以,外设的地址都是基于这个0x40000000来偏移得到的。从0x40000000开始,往后512KB都为寄存器的地址映射。


是怎样通过GPIO来找到它相应的寄存器的?

我们可以看到GPIOC的基地址是多少,我们在此基地址的基础上定义一个结构体GPIO_Typedef ,那么就可以根据结构体的成员偏移来找到某个GPIO相应的寄存器。


GPIO_Typedef  *GPIOC  =====》  GPIO_Typedef  *0x4001 1000


GPIO_Typedef  *0x4001 1000的解读就是,有一个指针,它保存了一个地址,该地址为0x4001 1000,并且该地址指向了一块空间,该空间的大小为sizeof( GPIO_Typedef  ),也就是结构体的大小,该结构体的基地址就是0x4001 1000,该结构体的内部成员相对于基地址的偏移量恰好对应的CPIO的各个寄存器。


比如下面:

   


恰好结构体中的CRH成员相对于结构体的基地址的偏移量,就是规格书中写的CRH寄存器的偏移量0x04。所以,此时我们对结构体中的成员进行操作,就是对GPIO中寄存器的操作。


关键字:GPIO  寄存器  地址 编辑:什么鱼 引用地址:GPIO寄存器的地址怎么寻找

上一篇:stm32f103 GPIO—— 一灯大师之库函数版
下一篇:stm32f103 GPIO——一灯大师之I/O口输出模式的寄存器配置

推荐阅读

STM32入门系列-存储器与寄存器介绍
介绍两部分内容:什么是存储器映射什么是寄存器及寄存器映射为了让大家对存储器与寄存器有一个更清楚的认识,并且为之后使用 C 语言来访问 STM32 寄存器内容打下基础。等明白了如何使用 C 语言封装底层寄存器,也就为后面学习库函数的开发做好了铺垫。什么是存储器映射程序存储器、数据存储器、寄存器和I/O端口排列在同一顺序的4GB地址空间内。这就是我们曾提到过的被控总线的连接部分,而编程时就是操作这一块地方。存储器本身不具有地址信息,它的地址是由芯片厂商或用户分配,给存储器分配地址的过程称为存储器映射,如果再分配一个地址就叫重映射。 STM32F103ZET6 数据手册中存储器映射图如下所示。从上图中可以看到 ARM 把这 4GB 的存储
发表于 2022-11-18
STM32入门系列-GPIO概念介绍
GPIO(general purpose intput output)是通用输入输出端口的简称,可以通过软件来控制其输入和输出。STM32 芯片的 GPIO 引脚与外部设备连接起来,从而实现与外部通讯、控制以及数据采集的功能。不过 GPIO 最简单的应用还属点亮 LED 灯了,只需通过软件控制 GPIO 输出高低电平即可。当然 GPIO 还可以作为输入控制,比如在引脚上接入一个按键,通过电平的高低判断按键是否按下。其中STM32F103xC、STM32F103xD和STM32F103xE有144个引脚的芯片如下图所示。那么是不是所有引脚都是 GPIO 呢?当然不是,STM32 引脚可以分为这么几大类:电源引脚:引脚图中的 VDD、V
发表于 2022-11-18
STM32入门系列-GPIO结构
已经了解了STM32 GPIO的基本概念及引脚分类。现在来看下STM32 GPIO内部的结构是怎样的。IO端口位的基本结构如下图所示。从图中可以看出GPIO内部结构还是比较复杂的,只要将这张GPIO结构图理解好,那么关于GPIO的各种应用模式将非常清楚。图中最右端I/O端口就是STM32芯片的引脚,其它部分都在STM32芯片内部。上图中我们将每部分都用红色数字标号了,按照顺序我们逐一讲解。保护二极管引脚内部加上这两个保护二级管可以防止引脚外部过高或过低的电压输入,当引脚电压高于VDD_FT或VDD时,上方的二极管导通吸收这个高电压,当引脚电压低于VSS时,下方的二极管导通,防止不正常电压引入芯片导致芯片烧毁。尽管STM32芯片内部有
发表于 2022-11-18
STM32入门系列-<font color='red'>GPIO</font>结构
STM32入门系列-创建寄存器模板
介绍如何使用 KEIL5 软件创建寄存器模板, 方便之后使用寄存器方式来操作STM32开发板上的LED,让大家创建属于自己的寄存器工程模板。获取工程模板的基础文件首先我们在电脑任意位置创建一个文件夹,命名为“寄存器模板创建”,然后在其下面新建 2 个文件夹,如下:Obj 文件夹: 用于存放编译产生的 c/汇编/链接的列表清单、 调试信息、hex文件、预览信息、封装库等文件。User 文件夹: 用于存放用户编写的 main.c、 STM32F1 启动文件、stm32f10x.h头文件。我们需要将寄存器工程模板所需的基础文件 main.c、STM32F1 启动文件及stm32f10x.h 头文件放入到 User 文件夹内。在工程实例的U
发表于 2022-11-18
STM32入门系列-创建<font color='red'>寄存器</font>模板
STM32入门系列-使用C语言封装寄存器
前面介绍了存储器映射、寄存器和寄存器映射,这些都是为了介绍使用 C语言封装寄存器做铺垫。这里我们通过一个实例来对 C 语言封装寄存器进行介绍。具体实例:控制 GPIOC 端口的第 0 管脚输出一个低电平。首先我们需要知道GPIOC 端口外设是挂接在哪个总线上的,然后根据总线基地址和本身的偏移地址得到 GPIOC 外设基地址,最后通过这个外设基地址得到里面各种寄存器基地址。总线和外设基地址封装根据寄存器的概念,我们可以使用 C 语言中的宏定义对寄存器进行定义。具体代码如下://定义外设基地址#define PERIPH_BASE ((unsigned int)0x40000000) 1)//定义 APB2 总线基地址#define A
发表于 2022-11-18
STM32入门系列-STM32外设地址映射
片上外设区分为四条总线,根据外设速度的不同,不同总线挂载着不同的外设,APB1挂载低速外设,APB2和AHB挂载高速外设。相应总线的最低地址我们称为该总线的基地址,总线基地址也是挂载在该总线上的首个外设的地址。APB1总线的地址最低,因此片上外设就从这这个地址开始,也称外设基地址。总线基地址从存储器映射那张图的Block2可以看到,分为4大块,每块都有一个起始地址,这个起始地址就是基地址,然后到下一块起始地址的时候就会和前一块地址出现偏差,这个差值就是偏移量,即相对基地址的偏移量。如下图所示。从上图可以看到APB1总线基地址是0x4000 0000,相对外设基地址的偏移量是0,所以此总线也是外设Block2的基地址。外设基地址每条总
发表于 2022-11-18
STM32入门系列-STM32外设<font color='red'>地址</font>映射
小广播
设计资源 培训 开发板 精华推荐

何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2022 EEWORLD.com.cn, Inc. All rights reserved