|
很多硬件架构已经对存储器映射进行了划分,比如今天作为典型介绍的Cortex-M3体系架构,即使允许半导体厂商进行特定功能存储区域的重新定义,总体的存储器映射大框架也是不变的。
Cortex-m3支持最大4GB的存储空间,其地址映射关系如下图所示:

1.代码区
512MB表示遵循M3架构的MCU最大可能的代码容量即inflash大小,0x0000 0000表示最低起始地址,该区主要存放code也可以写入数据,有指定的总线去读取指令,访问数据。掉电该区域不会丢失数据,相当于电脑的硬盘。
结合实例来STM32F104VET6来说明,它将代码区规划如下:

Boot MemorySpace(0x0-0x7FFFF),这块空间是预留的,不存数据,或者它压根不存在。在不同的启动方式(参见附1)下,这块区域会被映射到其他区域:
1).从主存储器启动:Boot Space 是主存储器的别名。以0x08000000 对应的内存为例,则该块内存既可以通过0x00000000 操作也可以通过0x08000000 操作,且都是操作的同一块内存。
2).从系统存储器启动:Boot Space 是System Memory的别名。以0x1FFFFFF0对应的内存为例,则该块内存既可以通过0x00000000 操作也可以通过0x1FFFFFF0操作,且都是操作的同一块内存。
3).从SRAM 启动:SRAM 只能通过0x20000000进行操作,与上述两者不同。从SRAM 启动时,需要在应用程序初始化代码中重新设置向量表的位置。
保留区。
主存储器(图中Flash区,主闪存)起始起止为0x0800 0000,终止地址依Flash大小而定,图中0x0807 FFFF为512k的终止地址,存储代码。
保留区。
系统存储器,从0x1FFFF000 – 0x1FFF F7FF,是不可擦除的ROM区,存储ISP程序。
option bytes这个区域是16个字节,是控制flash区域的寄存器。
附1:
STM32F1的三种启动模式(与前面介绍0x0地址有关)。
1).主闪存存储器启动:从STM32内置的Flash启动(0x0800 0000-0x0807 FFFF),一般我们使用JTAG或者SWD模式下载程序时,就是下载到这个里面,重启后也直接从这启动程序。
2).系统存储器启动:从系统存储器启动(0x1FFFF000 – 0x1FFF F7FF),这种模式启动的程序功能是由厂家设置的。一般来说,我们选用这种启动模式时,是为了从串口下载程序,因为在厂家提供的ISP程序中,提供了串口下载程序的固件,可以通过这个ISP程序将用户程序下载到系统的Flash中。
3).片上SRAM启动:从内置SRAM启动(0x2000 0000-0x3FFFFFFF),既然是SRAM,自然也就没有程序存储的能力了,这个模式一般用于程序调试。

2.片上SDRAM
片上SRAM起始地址为0x2000 0000大小为64KB,512M表示该架构MCU最大可能的内存容量为512M,片上SRAM起始地址最低0x2000_ 0000该位置主要存放数据也可以写入code,有指定的总线去读取指令,访问数据。掉电该区域会丢失代码和数据,但是执行代码比Flash要快很多,一般比inflash价格贵,容量做的小得多。
3.片上外设
GPIO、UART、ADC、TIM,RCC,SDIO、DMA等所有外设的控制、状态、数据寄存器都在这个区中。

3.扩展片外存储器
可以自己扩展外部内存(外部SDRAM)、NORFlash、NANDFlash、LCD,但必须在STM32的FSMC控制器下进行,这个控制器的作用就是将内部AHB总线和外部扩展内存的总线进行转化,利用这个控制器,我们可以很方便的控制LCD,这里就不展开了。这1G的抽屉可以放下图的东西。这片空间STM32并没有放东西,STM32指定我们可以在其中扩展内存NOR/PSRAM1、NOR/PSRAM2……并接受FSMC控制器的控制。

4.片外外设
在该区,放置了FSMC控制器的一些寄存器,就是在这些寄存器的配合下,FSMC控制器得以有效控制片外RAM进行读写操作。

5.总结

参考文献:
[1] https://blog.csdn.net/fantastikman/article/details/73481021
[2] 嵌入式网络那些事 |