程序存储器,数据存储器,寄存器和I\O端排列在同一顺序的4GB地址空间内,被控总线连接的部分。存储器本身不具有地址信息,它的地址是芯片厂商或用户分配的,给存储器分配地址的过程称为存储器映射。存储器区域划分,是ARM将这4GB的存储空间,平均分成了8块区域,每块区域大小是512MB,这个容量是非常大的。ARM在对这4GB容量分块的时候是安装其功能划分,每块都有它特殊的用途。
在这 8 个 Block 里面,Block0、Block1 和 Block2 这 3 个块是我们最为关心的。因为它包含了 STM32 芯片的内部 Flash、RAM 和片上外设。
(1)0 Block0 内部区域功能划分
Block0 主要用于设计片内的 FLASH,STM32F103 系列芯片内部 FLASH 最大是 512KB,我们使用的 STM32F103ZET6 的 FLASH 是 512KB。要在芯片内部集成更大的 FLASH 或者 SRAM 都意味着芯片成本的增加,所以往往片内集成的FLASH 都不会太大。512KB 的 FLASH 已经足够我们一般的应用开发。Block0 内部又划分了好多个功能块,我们按地址从低到高顺序依次介绍。
0x0000 0000-0x0007 FFFF:取决于 BOOT 引脚,为 FLASH、系统存储器、SRAM 的别名。
0x0008 0000-0x07FF FFFF:预留。
0x0800 0000-0x0807 FFFF:片内 FLASH,我们编写的程序就放在这一区域(512KB)
0x0808 0000-0x1FFF EFFF:预留。
0x1FFF F000-0x1FFF F7FF:系统存储器,里面存放的是 ST 出厂时烧写好的isp 自举程序,用户无法改动。使用串口下载的时候需要用到这部分程序。
0x1FFF F800-0x1FFF F80F:选 项 字 节 ,用 于 配 置 读 写 保 护 、BOR 级别、软件/硬件看门狗以及器件处于待机或停止模式下的复位。当芯片不小心被锁住之后,我们可以从 RAM 里面启动来修改这部分相应的寄存器位。
0x1FFF F810-0x1FFF FFFF:预留。
(2)1 Block1 内部区域功能划分
Block1用于设计片内的SRAM,我们使用的 STM32F103ZET6 的 SRAM是64KB。 Block1 内部又划分了几个功能块,我们按地址从低到高
顺序依次介绍。
0x2000 0000-0x2000 FFFF:SRAM,容量为 64KB。
0x2001 0000-0x3FFF FFFF:预留。
(3)2 Block2 内部区域功能划分
Block2 用于设计片内外设,根据外设总线速度的不同,Block2 被划分为 AHB和 APB 两部分,APB 又被分成 APB1 和 APB2 总线。
我们按地址从低到高顺序依次介绍。
0x4000 0000-0x4000 77FF:APB1 总线外设。
0x4000 7800-0x4000 FFFF:预留。
0x4001 0000-0x4001 3FFF:APB2 总线外设。
0x4001 4000-0x4001 7FFF:预留。
0x4001 8000-0x4002 33FF:AHB 总线外设。
0x4002 4400-0x5FFF FFFF:预留。
在Block3/4/5中还包含了FSMC扩展区域,这3个块可用于扩展外部存储器,
比如 SRAM,NORFLASH 和 NANDFLASH 等
Block2 这片区域是用来设计片上外设的
片上外设区分为四条总线,根据外设速度的不同,不同总线挂载着不同的外设, APB1 挂载低速外设,APB2 和 AHB 挂载高速外设。相应总线的最低地址我们称为该总线的基地址,总线基地址也是挂载在该总线上的首个外设的地址。APB1 总线的地址最低,因此片上外设就从这这个地址开始,也称外设基地址。
(1) 总线基地址
从存储器映射那张图的 Block2 可以看到,分为 4 大块,每块都有一个起始地址,这个起始地址就是基地址,然后到下一块起始地址的时候就会和前一块地址出现偏差,这个差值就是偏移量,即相对基地址的偏移量。如图5.3.1 所示。
图 5.3.1 总线基地址
从上图可以看到 APB1 总线基地址是 0x4000 0000,相对外设基地址的偏移量是 0,所以此总线也是外设 Block2 的基地址。
(2) 外设基地址
每条总线上都会挂接着很多的外设,这些外设也会有自己的地址范围,XXX 外设的首个地址即最低地址就是 XXX 外设的基地址,也称作 XXX 边界地址。这里我们就以 GPIO 外设来讲解外设基地址。其他的外设也是同样分析。GPIO 外设基地址如图 5.3.2 所示
图 5.3.2 GPIO 外设基地址
从图 5.3.2 可以知道,外设 GPIOx 都是挂接在 APB2 总线上,属于高速的外设,而 APB2 总线的基地址是 0x4001 0000,故 GPIOA 的相对 APB2 总线的地址偏移是 800。
(3) 外设寄存器地址
XXX 外设的寄存器就分布在其对应的外设地址范围内。这里我们以 GPIO 外设为例,GPIO 是通用输入输出端口的简称,可以通过软件来控制其输入和输出。GPIO 有很多个寄存器,每一个都有特定的功能。每个寄存器为 32bit,占四个字节,这些寄存器都是按顺序依次排列在外设的基地址上。寄存器的位置都以相对该外设基地址的偏移地址来描述。这里我们以 GPIOC 端口为例,来说明 GPIO
都有哪些寄存器,如图 5.3.3 所示。
图 5.3.3 GPIOC 寄存器地址