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寄存器的地址怎么寻找?相关推荐
- R40 gpio 寄存器地址操作【原创】
首先要学会看手册,下面拿PC来做说明. 3.18.3. Register List Module Name Base Address PIO 0x01C20800 Register Name ...
- OpenBMC开发笔记系列——(六)如何通过ast2600的datasheet查看GPIO寄存器地址
打开ast2600的datasheet文档,找到GPIO相关章节 41 GPIO Controller (GPIO) 可以看到有关GPIO寄存器的介绍 Base Address of GPIO = 0 ...
- 4412 GPIO读 和 ioremap控制GPIO寄存器
一.配置GPIO读 在视频14的基础上做 1.利用拨码开关来实现GPIO输入 所以AP_SLEEP对应GPC0_3,然后在drivers/gpio/gpio-exynos4.c中对应EXYNOS4_G ...
- 【i.MX6ULL】驱动开发3——GPIO寄存器配置原理
前面的两篇Linux驱动文章,介绍了字符设备驱动的两种新旧开发方式,并使用一个虚拟的字符驱动来学习字符设备的开发的流程. 本篇起,就要来操作Linux开发板的硬件,首先当然是通过经典的点亮LED灯程序 ...
- 【STM32存储器映射-寄存器基地址-偏移】
前言 在学习STM32的时候,我们看到很多的寄存器编程, 比方说LED灯: //GPIOB.5端口输出高电平GPIOB->ODR|=1<<5; //PB.5 输出高GPIOE-> ...
- 树莓派4B 寄存器基地址查询
树莓派4B 寄存器基地址查询 树莓派4B的datasheet在我看来非常混乱复杂,尤其是地址映射方面.单datasheet就有两个版本而且还自相矛盾.为了查找到确定的物理地址,使用官方提供的函数进行读 ...
- STM32学习--GPIO(寄存器)
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一.GPIO是什么? 二.引脚 GPIO的输入 输入框图 输入模式 作用 GPIO的输入 输入框图 输入模式 作用 GPIO ...
- stm32地址偏移:为什么相邻寄存器的地址偏移量是0x04?
前段时间第一次接触stm32地址偏移的概念时,非常的困惑,以GPIO寄存器为例,为什么相邻寄存器的偏移地址是0x04? 答:首先大家要弄明白两个概念 1. 寄存器地址 != 内存空间,寄存器地址只是内 ...
- arm64的ioremap_4412 GPIO读 和 ioremap控制GPIO寄存器
一.配置GPIO读 在视频14的基础上做 1.利用拨码开关来实现GPIO输入 所以AP_SLEEP对应GPC0_3,然后在drivers/gpio/gpio-exynos4.c中对应EXYNOS4_G ...
最新文章
- DKHadoop人力资源大数据解决方案架构
- 7 Java NIO Selector-翻译
- 深入浅出讲解语言模型
- asp.net core 系列 6 MVC框架路由(下)
- python database ioerror_python – IOError:[Errno 2]没有这样的文件或...
- 【HDU - 5988】Coding Contest(网络流费用流,改模板)
- 机器学习笔记(了解)
- 漂亮的jQuery tab选项卡插件
- 为什么ConcurrentHashMap不允许插入null值?
- 第四章、epub文件处理 -- epub文件内部组成
- Mysql排序添加名词_记面试中问到的MySQL的SQL调优问题
- Pentium Pro架构/流水线及其优化 (1) - 架构概述
- sed 、awk用法
- 1.100个房产测量常见问题 2. 现有的商用房产测绘软件 3.问题_拔剑-浆糊的传说_新浪博客...
- 关闭mongodb数据库 (netstat -lanp | grep “27017“)
- matlab 牛顿冷却定律,传热学MATLAB度分布大作业完整版.doc
- NTFS(文件恢复)最简单情况
- wangeditor富文本编辑器集成配置
- core网络课程整理(core概述及启动讲解)
- android gps locationCb 数据
热门文章
- 使用 Java 对图像进行各种处理
- LaTeX如何正确输入引号:双引号“”单引号‘’
- win10环境下下载安装openpose(only cpu)并在pycharm中运行代码(超详细)
- Git 初次使用,公司局域网clone项目(Windows)
- python倒序输出数组_python如何逆序输出数组
- SAP 采购降本分析报表
- DDoS攻防战(二):CC攻击工具实现与防御理论--删除
- UR机器人:位姿表示以及相关移动
- C++制作FC最强人物格斗游戏,超爽连击的战斗体验!
- 从项目中学习Django 天天生鲜---------订单