为什么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的数据完全一致。

STM32的Flash地址是0x08000000,从0x00000000不可以?相关推荐

  1. 为什么STM32设置Flash地址0x08000000而不是0x00000000?STM32的启动过程

    STM32F103ZE芯片存储空间的地址映射关系图. 在MDK编译程序设置ROM和RAM地址时候发现: IROM1为片上程序存储器,即片上集成的Flash存储器,对该处理器Flash大小为512KB, ...

  2. STM32从Flash地址0x08000000的启动重映射

    在初写STM32程序时,遇到一个困惑,STM32的Flash在MDK里被设置为起始地址0x0800 0000,而CM3手册规定芯片复位时要从0x0000 0000地址开始取出中断向量 ,那STM32怎 ...

  3. map文件分析 stm32_使用STM32内部Flash额外的空间来存储数据

    本次分享关于STM32内部FLASH的笔记. STM32 芯片内部的 FLASH 存储器,主要用于存储我们代码.如果内部FLASH存储完我们的代码还有剩余的空间,那么这些剩余的空间我们就可以利用起来, ...

  4. stm32将flash虚拟成U盘来下载程序

    序言 基础工程准备 修改进入U盘的条件 添加IAP跳转代码 准备一个生成bin文件的例程 将bin文件放入指定位置运行 工程连接 经过将stm32的内部flash做成U盘以后,我一直在思考可不可以使我 ...

  5. stm32内部Flash读写

    文章目录 1.stm32内部flash介绍 2.读写驱动编写 3.源码 上篇文章讲到了STM32来驱动外部flah的操作,flash真是好东西啊,内存大,能存的东西多,这样我们就可以用它来做一些大点的 ...

  6. 基于STM32的Flash擦除方式

    基于STM32的Flash擦除方式 前言 介绍 STM32 FLASH 闪存的编程和擦除 Flash擦除的标准库函数 软件设计 直接使用固件库函数擦除当前地址所在的内容 擦除对应地址和大小的Flash ...

  7. STM32外挂FLASH模拟U盘(基于HAL库)

    STM32外挂FLASH模拟U盘(基于HAL库) 1.背景 1.1这篇文章能给你带来什么 1.2根据你要解决的问题,精确快速跳转到相应位置 1.3我在做完这个后还有不明白的地方,希望能有大触解答困惑 ...

  8. STM32内部Flash读写问题

    STM32Flash读写之Flash调试技巧 文章目录 1.先熟悉所用MCU的Flash存储大小以及扇区地址 2.Flsah写之前为什么要先擦除 3.Flash擦除长时间占用CPU 4.实测Flash ...

  9. STM32利用flash读取音频数据读取与DAC播放

    目录 一.博客内容 二.Flash地址空间的读取 2.1 Flash原理 2.2 软.硬件准备 2.3 利用CubeMX建立工程 2.4 工程代码 2.5 ST-Link的使用 ​2.6 仿真调试 三 ...

  10. 基于STM32的Flash读写详解

    基于STM32的Flash读取 前言 介绍 STM32 FLASH 闪存的编程和擦除 Flash读写的标准库函数 软件设计 FLASH的读取 直接读取某一地址的内容 读取选定位置的选定大小的内容 FL ...

最新文章

  1. jQuery easyui刷新当前tabs
  2. 【JPA】注解@PostConstruct、@PreDestroy
  3. redis安装 linux步骤,【linux安装redis完整步骤】
  4. 动态规划 BZOJ1584 [Usaco2009 Mar] Cleaning Up 打扫卫生
  5. Windows CE授权费用
  6. C++的#include_next
  7. 双系统win7+ubuntu18.10在win7中读取linux下面的内容
  8. Android之发送短信后按钮(60秒)变灰色每隔一秒递减显示
  9. 1111---9999的变换
  10. Atitit 财政赤字解决方案
  11. GB18030字符编码格式和点阵字库
  12. jquery 实现四级联动
  13. java nginx报502,Nginx 502错误排查及解决办法
  14. 日行一善的100种方式
  15. MiniMap(小地图)插件
  16. C语言图形颜色编程|颜色
  17. ESP32基于arduino开发的心跳体温检测系统(一)项目介绍及准备
  18. RHCA回忆录---RH236介绍
  19. 工厂如何实现无线wifi短信验证登录?工厂上网实名认证系统
  20. ava虚拟机详解--GC算法和种类【重要】

热门文章

  1. Oracle中存储过程中变量的声明与赋值
  2. tof摄像头手势识别_全面解析深度摄像头(TOF Camera)的原理
  3. 2019零售业9大新知洞察发布,零售服务在线采购节启动
  4. python-恩尼格码密码机实现
  5. JAVA将多个PDF文件合并成一个PDF
  6. ​2021年度学习清单
  7. 电脑参数,台式电脑怎么查看配置参数|如何查询台式机硬件配置
  8. Java程序员的8个级别,你在哪?
  9. 非常全面的UI设计面试技巧,简单实用值得收藏
  10. cad一直正在加载_CAD总是打开要加载好久,卡到不行。