完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
为什么STM32从Flash地址0x08000000的启动而不是0x00000000?
这是STM32F103ZE芯片存储空间的地址映射关系图。 在MDK编译程序设置ROM和RAM地址时候发现: 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的数据完全一致。 |
|
|
|
只有小组成员才能发言,加入小组>>
2562 浏览 0 评论
1159浏览 2评论
762浏览 1评论
515浏览 0评论
272浏览 0评论
453浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-27 12:37 , Processed in 1.311383 second(s), Total 78, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (威廉希尔官方网站 图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号