STM32的Flash地址是0x08000000,从0x00000000不可以?

为什么STM32从Flash地址0x08000000的启动而不是0x00000000?

这是STM32F103ZE芯片存储空间的地址映射关系图。
图1
在MDK编译程序设置ROM和RAM地址时候发现:
图2
图3
IROM1为片上程序存储器,即片上集成的Flash存储器,对该处理器Flash大小为512KB,即0x80000 地址区间为0x8000000~0x0807FFFF

IRAM1为片上数据存储器,即片上集成的SRAM存储器,对该处理器RAM大小为64KB,即0x10000 地址区间为0x20000000~0x20010000

这里问题为什么程序启动地址在MDK设置里为0x08000000?
分析根据图1(Cortex-M3 预定义的存储器映射)这个是Cortex-M3核地址的映射分布图,我们看到代码区是0x00000000-0x1FFFFFFF总共对应地址大小为512MB。而对于STM32F103ZE芯片使用到的ROM空间只有512KB。Cortex-M3定下的规矩是从0地址启动,SMT32当然不能破坏ARM定下的“规矩”,所以它做了一个地址重映射的过程。
什么是重映射?
ARM芯片的地址重映射 映射就是一一对应的意思。重映射就是重新分配这种一一对应的关系
普通的单片机把可执行代码和数据存放到存储器中。单片机中的CPU从储器中取指令代码和数据。其中存储器中每个物理存储单元与其地址是一一对应而且是不可变的。如下图,CPU读取0x00000000地址上存储单元的过程
在这里插入图片描述
ARM芯片中有些物理存储单元的地址可以根据设置变换。就是说一个物理存储单元现在对应一个地址,经过设置以后,这个存储单元就对应了另外一个地址了(重映射就是重新分配这种一一对应的关系)
如下图
在这里插入图片描述
上图表示把0x00000000地址上的存储单元映射到新的地址0x08000000上。CPU存取0x08000000就是存取0x00000000上的物理存储单元。网上说这种重映射设计主要是为了提高应用程序异常响应得速度。因为RAM的存取速度远高于对FLASH的存取速度,当程序发生异常后,这时代码区存在两个异常向量区,提高异常响应速度(待考证)
那么我们看芯片上的BOOT0和BOOT1配置启动方式如下图:
在这里插入图片描述
当BOOT1=X,BOOT0=0时(这种情况是嵌入式开发过程中产品最常用的启动方式),则CPU可以访问0x0000000或0x08000000(这两个地址是共同的物理空间)。
验证设置ROM起始地址为0x00000000是否和0x08000000这样:
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
通过配置编译环境,仿真时看到memory,0x00000000和0x08000000的数据完全一致。

如果设置ROM地址为0x0000000进行编译
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述
通过配置编译环境,仿真时看到memory,0x00000500和0x08000500的数据完全一致。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章