3 . 存储器映射 和 寄存器映射
Posted 技术世界低调点儿
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了3 . 存储器映射 和 寄存器映射相关的知识,希望对你有一定的参考价值。
存储器映射
程序存储器、数据存储器、寄存器和 I/O 端口排列在同一个顺序的 4 GB 地址空间内。也就是被总线连接的部分。我们在编程的时候,也是对这些功能部件进行操作。存储器本身不具有地址信息,它的地址是由芯片厂商或用户分配,给存储器分配地址的过程称为存储器映射,如果再分配一个地址就叫重映射。
从图 中我们可以看出 ARM 将这 4GB 的存储器空间,平均分成了 8 块区域,每块区域的大小是 512MB,这个容量是非常大的,因此芯片厂商就在每块容量范围内设计各自特色的外设,要注意一点每块区域容量占用越大,芯片成本就越高,所以说我们使用的 STM32 芯片都是只用了其中一部分。ARM 在对这 4GB 容量分块的时候是按照其功能划分,每块都有它特殊的用途。
在这 8 个 Block 里面,Block0、Block1 和 Block2 这 3 个块是我们最为关心的。因为它包含了 STM32 芯片的内部 Flash、RAM 和片上外设。
-
Block0 内部功能介绍:
Block0 主要用于设计片内的 FLASH,STM32F103 系列芯片内部 FLASH 最大是 512KB。要在芯片内部集成更大的 FLASH 或者 SRAM 都意味着芯片成本的增加,所以往往片内集成的FLASH 都不会太大。512KB 的 FLASH 已经足够我们一般的应用开发。从图中可以看到 Block0 内部又划分了好多个功能块,我们按地址从低到高顺序依次介绍:
0x0000 0000-0x0007 FFFF:取决于 BOOT 引脚,为 FLASH、系统存储器、SRAM 的别名。
0x0008 0000-0x07FF FFFF:预留。
0x0800 0000-0x0807 FFFF:片内 FLASH,我们编写的程序就放在这一区域。
0x0808 0000-0x1FFF EFFF:预留。
0x1FFF F000-0x1FFF F7FF:系统存储器,里面存放的是 ST 出厂时烧写好的isp 自举程序,用户无法改动。使用串口下载的时候需要用到这部分程序。
0x1FFF F800-0x1FFF F80F:选 项 字 节 ,用 于 配 置 读 写 保 护 、BOR 级别、软件/硬件看门狗以及器件处于待机或停止模式下的复位。当芯片不小心被锁住之后,我们可以从 RAM 里面启动来修改这部分相应的寄存器位。
0x1FFF F810-0x1FFF FFFF:预留。
** -
Block1 内部区域功能划分
Block1用于设计片内的SRAM,从图 中可以看到 Block1 内部又划分了几个功能块,我们按地址从低到高顺序依次介绍:
0x2000 0000-0x2000 FFFF:SRAM,容量为 64KB。
0x2001 0000-0x3FFF FFFF:预留。 -
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 这片区域是用来设计片上外设的,由于Cortex-M3 内核是32 位的,所以存储器内部是以四个字节为一个单元,每一个单元对应不同的功能,当我们控制这些单元时也就可以控制外设。每一个单元还对应一个地址,我们要操作这些单元,也就是通过对应的地址来访问。由于STM32 外设非常多而且复杂,如果每操作一个外设就要写一大串对应的存储单元地址,显然是非常麻烦的而且还极容易出错。因此我们就把每个单元的功能作为名,给这个内存取一个别名,这个别名是我们经常说的寄存器。然后通过C语言指针来操作这些寄存器即可。那什么是寄存器映射呢?给已经分配好地址的有特定功能的内存单元取别名的过程就叫寄存器映射。
比方说我们找到0x4001 1010 这个单元地址,那么可以通过查阅相关资料了解到此单元具有GPIOC 端口置位/复位功能。因此为了更好区分此单元的功能和方便后续的程序开发,可以给这个单元取一个别名GPIOC_BSRR,那么这个GPIOC_BSRR 就是寄存器,并且这个寄存器地址就是0x4001 1010。这个过程就是寄存器映射。
举例子如下图:
以上是关于3 . 存储器映射 和 寄存器映射的主要内容,如果未能解决你的问题,请参考以下文章