存储器与寄存器
1.存储器映射
存储器本身是不具备地址信息的,他的地址都是我们厂商或者用户分配的,给存储器分配地址的过程就教存储器映射,如果再给他分配一个地址那么就是重映射
RAM把这个内存分为了8个区域,每个区域的大小是512-MByte字节,这个存储量是非常大的,因此每个芯片厂商都在每块容量范围里设置了对应的外设,但是要记住一点,如果你每个芯片的容量越大,那么成本也是会更高的
每块容量都有他们自己的划分
这个是吧block0和flash的地址,他的容量是512-Mbyte字节
block2存放了我们主要的功能外设
比如我们的Gpio和外部中断
block6有预留的区域
flash有1mhz的内存
2.什么是寄存器
我们把每个单元的功能作为名,给这个内存取个别名,这个别名就是我们·所说的寄存器,然后我们通过C语言指针操作这些寄存器即可,什么是寄存器映射呢,就是给已经分配好地址的特定的内存单元再去一个名字的过程就叫寄存器映射
我们的内存单元大小固定是4个字节
我们想要对内存区单元进行操作,其实就是对这个地址进行操作,你每次都要操作的话那么就要写一个很长的地址,所以我们要对这个内存取一个别名,这个别名就是寄存器,有了这个寄存器,那我们就可以用C语言的指针进行操作,寄存器映射就是对这个寄存器取别名的过程就是寄存器映射
3.如何访问寄存器的内容
我们操作这些寄存器其实就是在操作内存单元,我们可以用指针来操作stm32的内存单元
如果我们想要第9个管脚输出低电平那么我们怎么处理呢
首先要了解stm32的外设映射
外设分为4条总线
不同的总线挂载着不同的外设资源
APB总线主要挂载一些低速的外设
AHB总线主要挂载一些高速的外设
相应总线的基地址,我们称为该总线的基地址
APB包括APB1和APB2
APB1在底下这意味着,意味着这是我们总线的基地址
基地址也是挂载在这个总线上首个外设地址
每个总线都挂载着很多外设的地址
这些外设也会有着自己的地址范围
外设的首个地址,也就是外设的基地址
其他外设的地址,要在这个基地址的基础上进行偏移
APB1总线上挂载着我们定时器1的外设
定时器2是APB1的总线基地址,0x4000000是定时器的地址,也是AHB1的地址
Gpio端口在AHB1的总线上
AHB1的第一个地址,GPIOA
GPIO有哪些寄存器
端口中的寄存器都是一样的
前面的外设和基地址都是为了下面的寄存器封装
使用寄存器封装寄存器
如果我们想对GPIOF的PF9,首先要知道他是要挂载在哪个总线上的视频
确定了总线我们才知道这个总线的基地址
然后我们找到这个端口的偏移地址
根据总线的基地址和本身的偏移地址
得到GPIOF的地址
最后通过这个外设基地址得到各个寄存器的基地址
APB1的外设基地址,最低层
找到Gpiof挂载的总线,是AHB1,然后我们找到他的地址
然后接下来就是我们的Gpiof了我们要找到他的地址
首先要知道他们是哪个总线上的地址,是AHB1上的
找到GPIOF总线的基地址
接下来我们就要从GPIOF的基地址找很多寄存器
第一个是最低地址
第二个是AHB1总线的地址
第三个是AHB1上GPIOF的地址
第四,五,六个是GPIOF端口里面的寄存器地址
把这些地址配置了才能访问stm32寄存器里面的内容了
unsigned int *代表这是1个地址前面加个*代表你是要对这个寄存器的值进行设置
r代表不读,w代表写
寄存器的封装
我们这里封装的结构体,里面的变量名都是按照输出寄存器的地址来设置的