一、三个 "地址"
1.总线地址
总线地址,也被称为地址总线或位址总线(Address Bus),是一种计算机总线。它由CPU或者具有DMA能力的单元使用,用于沟通这些单元想要访问(读取/写入)计算机内存组件/地方的物理地址。
通俗讲就是CPU能够访问内存的范围。
比如32位的系统,CPU最多能访问到2^32bit,也就是4Gb。
2^32 = 4294967296 bit = 4194304 Kb = 4096 Mb = 4 Gb
而64位系统则是能访问到8Gb。
树莓派装载32位操作系统,寻址自然是4G。
树莓派查看内存指令。
cat /proc/meninfo
内存大概为926Mb。
2.物理地址
在存储器里以字节为单位存储信息,为正确地存放或取得信息,每一个字节单元给以一个唯一的存储器地址,称为物理地址(Physical Address),又叫实际地址或绝对地址。
3.虚拟地址
如何解释虚拟地址呢?
以树莓派为例,树莓派是32位系统,内存可以访问到4G,但是物理地址只有1G,假如运行的程序是超过1G的,那么把程序全部加载到内存是不可行的。
解决方法就是利用虚拟地址。
首先要说明一点,我们在实际程序中操作的其实都是虚拟地址。
虚拟地址其实就是基于算法上的逻辑地址,是软件层面的,是假的。虚拟地址可以比1G大,树莓派本身是能够访问到4G的,当物理地址1G不能满足程序运行空间需要时,那就可以把1G的物理地址映射成4G的虚拟地址。
二、芯片手册导读
查看芯片手册的目的性很强:做哪一块的开发,就只看那一块,现在要开发的是GPIO,熟悉控制IO口的寄存器最为重要。
如果看完这部分的文档,你对于以下几个问题(后面有解析)有清晰的答案,说明你真正读懂了这一部分的开发。
①操作逻辑:简言之就是怎么进行配置相关寄存器,这些配置步骤和思想其实都很类似。
②需要重点掌握的寄存器有哪些?例如输入 / 输出控制寄存器
输出 0 / 1控制寄存器
清除状态寄存器
训练如何捕捉信息 。
在新的平台也要学会捕捉类似的关键信息:选择输入还是输出,0/1,怎么清除,上升沿下降沿等。
从这里可以看出,所有IO口被分成0~5,共6个分组。每组的访问都被设置为32位。
引脚功能选择
其中pin0~pin9是位于第0分组。目标pin4对应14-12位,FSEL9有配置示例,由此可知,将14-12位配置为001,即可让pin4成为输出引脚。
GPFSEL0是pin0 ~ pin9的配置j寄存器,GPFSEL1是pin10 ~ pin19的配置寄存器,以此类推,GPFSEL5就是pin50~pin53的配置寄存器。
配置引脚输出状态
输出集寄存器用于设置GPIO管脚。SET{n}字段定义,分别对GPIO引脚进行设置,将“0”写入字段没有作用。如果GPIO管脚为在输入(默认情况下)中使用,那么SET{n}字段中的值将被忽略。然而,如果引脚随后被定义为输出,那么位将被设置根据上次的设置/清除操作。分离集和明确功能取消对读-修改-写操作的需要。GPSETn寄存器为了使IO口设置为1,set4位设置第四个引脚,也就是寄存器的第四位。
第0~31位归寄存器0管理,若设置为0,则