由上图知,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寄存器的地址怎么寻找?相关推荐

  1. R40 gpio 寄存器地址操作【原创】

    首先要学会看手册,下面拿PC来做说明. 3.18.3.  Register List Module Name  Base Address PIO  0x01C20800 Register Name   ...

  2. OpenBMC开发笔记系列——(六)如何通过ast2600的datasheet查看GPIO寄存器地址

    打开ast2600的datasheet文档,找到GPIO相关章节 41 GPIO Controller (GPIO) 可以看到有关GPIO寄存器的介绍 Base Address of GPIO = 0 ...

  3. 4412 GPIO读 和 ioremap控制GPIO寄存器

    一.配置GPIO读 在视频14的基础上做 1.利用拨码开关来实现GPIO输入 所以AP_SLEEP对应GPC0_3,然后在drivers/gpio/gpio-exynos4.c中对应EXYNOS4_G ...

  4. 【i.MX6ULL】驱动开发3——GPIO寄存器配置原理

    前面的两篇Linux驱动文章,介绍了字符设备驱动的两种新旧开发方式,并使用一个虚拟的字符驱动来学习字符设备的开发的流程. 本篇起,就要来操作Linux开发板的硬件,首先当然是通过经典的点亮LED灯程序 ...

  5. 【STM32存储器映射-寄存器基地址-偏移】

    前言 在学习STM32的时候,我们看到很多的寄存器编程, 比方说LED灯: //GPIOB.5端口输出高电平GPIOB->ODR|=1<<5; //PB.5 输出高GPIOE-> ...

  6. 树莓派4B 寄存器基地址查询

    树莓派4B 寄存器基地址查询 树莓派4B的datasheet在我看来非常混乱复杂,尤其是地址映射方面.单datasheet就有两个版本而且还自相矛盾.为了查找到确定的物理地址,使用官方提供的函数进行读 ...

  7. STM32学习--GPIO(寄存器)

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一.GPIO是什么? 二.引脚 GPIO的输入 输入框图 输入模式 作用 GPIO的输入 输入框图 输入模式 作用 GPIO ...

  8. stm32地址偏移:为什么相邻寄存器的地址偏移量是0x04?

    前段时间第一次接触stm32地址偏移的概念时,非常的困惑,以GPIO寄存器为例,为什么相邻寄存器的偏移地址是0x04? 答:首先大家要弄明白两个概念 1. 寄存器地址 != 内存空间,寄存器地址只是内 ...

  9. arm64的ioremap_4412 GPIO读 和 ioremap控制GPIO寄存器

    一.配置GPIO读 在视频14的基础上做 1.利用拨码开关来实现GPIO输入 所以AP_SLEEP对应GPC0_3,然后在drivers/gpio/gpio-exynos4.c中对应EXYNOS4_G ...

最新文章

  1. DKHadoop人力资源大数据解决方案架构
  2. 7 Java NIO Selector-翻译
  3. 深入浅出讲解语言模型
  4. asp.net core 系列 6 MVC框架路由(下)
  5. python database ioerror_python – IOError:[Errno 2]没有这样的文件或...
  6. 【HDU - 5988】Coding Contest(网络流费用流,改模板)
  7. 机器学习笔记(了解)
  8. 漂亮的jQuery tab选项卡插件
  9. 为什么ConcurrentHashMap不允许插入null值?
  10. 第四章、epub文件处理 -- epub文件内部组成
  11. Mysql排序添加名词_记面试中问到的MySQL的SQL调优问题
  12. Pentium Pro架构/流水线及其优化 (1) - 架构概述
  13. sed 、awk用法
  14. 1.100个房产测量常见问题  2. 现有的商用房产测绘软件 3.问题_拔剑-浆糊的传说_新浪博客...
  15. 关闭mongodb数据库 (netstat -lanp | grep “27017“)
  16. matlab 牛顿冷却定律,传热学MATLAB度分布大作业完整版.doc
  17. NTFS(文件恢复)最简单情况
  18. wangeditor富文本编辑器集成配置
  19. core网络课程整理(core概述及启动讲解)
  20. android gps locationCb 数据

热门文章

  1. 使用 Java 对图像进行各种处理
  2. LaTeX如何正确输入引号:双引号“”单引号‘’
  3. win10环境下下载安装openpose(only cpu)并在pycharm中运行代码(超详细)
  4. Git 初次使用,公司局域网clone项目(Windows)
  5. python倒序输出数组_python如何逆序输出数组
  6. SAP 采购降本分析报表
  7. DDoS攻防战(二):CC攻击工具实现与防御理论--删除
  8. UR机器人:位姿表示以及相关移动
  9. C++制作FC最强人物格斗游戏,超爽连击的战斗体验!
  10. 从项目中学习Django 天天生鲜---------订单