我们看到的 STM32 芯片已经是已经封装好的成品,主要由内核和片上外设组成。若与
电脑类比,内核与外设就如同电脑上的 CPU 与主板、内存、显卡、硬盘的关系。
STM32F429 采用的是 Cortex-M4 内核,内核即 CPU,由 ARM 公司设计。 ARM 公司
并不生产芯片,而是出售其芯片技术授权。芯片生产厂商(SOC)如 ST、 TI、 Freescale,负
责在内核之外设计部件并生产整个芯片,这些内核之外的部件被称为核外外设或片上外设。
如 GPIO、 USART(串口)、 I2C、 SPI 等都叫做片上外设。
存储器本身不具有地址信息,它的地址是由芯片厂商或用户分配,给存储器分配地址
的过程就称为存储器映射。 如果给存储器再分配一个地址就叫存储器重映
射。
片上外设区分为四条总线,根据外设速度的不同,不同总线挂载着不同的外设, APB
挂载低速外设, AHB 挂载高速外设。相应总线的最低地址我们称为该总线的基地址,总线
基地址也是挂载在该总线上的首个外设的地址。其中 APB1 总线的地址最低,片上外设从
这里开始,也叫外设基地址。
我们知道,存储器本身没有地址,给存储器分配地址的过程叫存储器映射,那什么叫
寄存器映射?寄存器到底是什么?
在存储器 Block2 这块区域,设计的是片上外设,它们以四个字节为一个单元,共
32bit,每一个单元对应不同的功能,当我们控制这些单元时就可以驱动外设工作。我们可
以找到每个单元的起始地址,然后通过 C 语言指针的操作方式来访问这些单元,如果每次
都是通过这种地址的方式来访问,不仅不好记忆还容易出错,这时我们可以根据每个单元
功能的不同,以功能为名给这个内存单元取一个别名,这个别名就是我们经常说的寄存器,
这个给已经分配好地址的有特定功能的内存单元取别名的过程就叫寄存器映射。
《 STM32F4xx 参考手册》 很有参考价值,我们可以在上面找到对应寄存器的配置方式的偏移量。
用自己的话总结就是:芯片厂商在设计芯片的时候,硬件确定了一片内存区域,有地址编号,我们通过这个地址,配置不同的值可以得到不同的功能,但是记忆内存地址显然不现实,所以我们人为地为各个内存区域取了一个别名,这个别名叫寄存器,只要你愿意,你可以取和ST官方不同的名字,但是最好不要这样。通过别名,也就是寄存器,我们通常说的配置寄存器,其实就是在对应地址上写入不同的值达到不同的效果。在这个取别名的过程中,需要用到指针和结构体的知识,对地址进行访问需要指针操作,而地址偏移我们可以用结构体,因为结构体中的内存是连续分配的,这正好用在这种地址偏移中。
但是,要注意,偏移并不是随便来的,很多人没有注意这个问题,这在之后的C语言随笔中将会提出,现在需要记住的是,MDK5.20,默认偏移是4个字节,这个默认偏移是有很大讲究的!!!