0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

为什么STM32的Flash地址要设置到0x08000000?

jf_pJlTbmA9 来源: 安富莱电子 作者: 安富莱电子 2023-10-26 15:50 次阅读

我们言简意赅的普及下这个知识点,争取让大家不伤脑细胞。

背景知识

M3,M4内核芯片上电复位后,要固定从0x0000 0000地址读取中断向量表,获取复位中断服务程序的入口地址后,进入复位中断服务程序,其中0x0000 0004存的是复位中断服务程序地址。

wKgaomUD9GOAZn2yAAB5V6dMy-4636.png
wKgZomUD9GSATkOrAADM0x2qgC4165.png

引出问题

既然ARM规定了M3,M4内核要从地址0x0000 0000读取中断向量表,而STM32设置Flash地址到0x0800 0000怎么办?

STM32支持了个内存重映射功能,将地址0x0800 0000开始的内容重映射到首地址0x0000 0000中,这样就解决了从0x0000 0000读取中断向量表的问题。
那么新的问题来:

(1) 你怎么保证0x08000 0000首地址存的就是中断向量表,我们不可以随意设置吗?

保证中断向量表存到0x0800 0000,这个涉及到分散加载的一个小知识,以MDK为例,如果大家看xxx.S启动文件,里面通过AREA定义了一个名叫RESET的段,这段存的就是中断向量表。

wKgZomUD9GaADtqfAAAzyOR8d1E465.png

这个名字很重要,MDK对应的xxx.sct分散加载里面通过下面这句将这个RESET段放在了0x0800 0000优先存储。

wKgaomUD9GiATueXAACo_e3Z5tc776.png

这样我们就解决了0x0800 0000首地址存储中断向量表,一旦程序开始运行后,我们就可以随意设置中断向量表的位置了。比如想将中断向量表存到内部SRAM,我们就可以操作寄存器SCB->VTOR 重新安排,然后将0x0800 0000的内容复制到设置的地址内即可。

(2) 既然设置到0x0800 0000这么麻烦,为什么不直接使用0x0000 0000?

这是因为STM32不仅可以从内部Flash启动,还可以从系统存储器(可以实现串口ISP,USB DFU等程序下载方式)和从内部SRAM启动,

我们将内部Flash安排到0x0000 0000显然是不行的。这样会导致系统存储器或者内部SRAM无法重映射到0x0000 0000了。

wKgZomUD9GmAcLSYAABsirUgcb4693.png

了解了M3和M4,使用M7是怎么个执行情况呢?

M7内核芯片比较灵活了,改变了固定从0x0000 0000地址读取中断向量表的问题,以STM32H7为例,可以从 0x0000 0000 到 0x3FFF 0000 所有地址进行启动。

专门安排了个选项字节来配置。

wKgZomUD9GuAHA9xAADlx7ZZEHo189.png

来源: 安富莱电子
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理

审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 芯片
    +关注

    关注

    450

    文章

    49614

    浏览量

    417076
  • FlaSh
    +关注

    关注

    10

    文章

    1598

    浏览量

    147329
  • STM32
    +关注

    关注

    2257

    文章

    10822

    浏览量

    352425
收藏 人收藏

    评论

    相关推荐

    STM32F103的Flash擦除问题

    _FLAG_WRPRTERR);/* 擦除FLASH 页*/FLASHStatus = FLASH_ErasePage((uint32_t)0x08000000);while(FLASHStatus
    发表于 08-30 18:19

    STM32升级程序里的0x08000000不是加载地址,而是中断向量入口地址,这是为什么?如何解决?

    ;0xFF000000这里的与操作是怎么执行的,最后怎么就出来0x08000000了,还有地址这个东西怎么理解比较好,他是不是代表的是一片内存的名字呢?问题有点多。。。请大神解释一下下。。。 串口接收过来的数据,是从
    发表于 07-02 00:19

    stm32f030如果我将起始地址0x08000000更改为0x08003000,则Usart不工作

    stm32f030如果我将起始地址0x08000000更改为0x08003000,则Usart不工作。我的意思是Usart Interrupt没有发生。 Usart处于半双工模式。
    发表于 06-21 16:08

    资料下载:STM32Flash地址0x08000000,从0x00000000不可以?

    这里写自定义目录标题为什么STM32Flash地址0x08000000的启动而不是0x00000000?这是
    发表于 07-01 08:47

    为什么STM32Flash地址0x08000000的启动而不是0x00000000

    STM32F103ZE芯片存储空间的地址映射关系是怎样的?为什么STM32Flash地址0x08000
    发表于 10-22 09:35

    嵌入式软件如何利用内部flash存储参数?

    ,参数存储在内部flash中,毕竟就算每片减少一块钱,量大后还是非常可观的。02选择参数存储位置stm32flash地址起始于0x08000000
    发表于 11-25 08:52

    STM32Flash地址设置0x08000000的原因

    08000 0000首地址存的就是中断向量表,我们不可以随意设置吗?(2) 既然设置0x0800 0000这么麻烦,为什么不直接使用
    发表于 02-07 08:00

    如何在STM32F769中将程序起始地址0x08000000更改为0x08020000?

    STM32F769中将程序起始地址0x08000000更改为0x08020000
    发表于 12-13 08:43

    有没有办法在不擦除不在起始地址0x08000000处的其余闪存的情况下调试某些代码?

    使用 STM32 ST-LINK Utility 对微控制器进行编程。我能够在第一个项目(从 0x08000000 开始)中进入调试模式,而无需通过在调试配置 -> 启动中禁用“下载”来擦除闪存
    发表于 01-11 07:12

    基于STM32F407的flash内存结构分析

    ,这里你可能看到了,该片存储区地址是从0x08000000开始的,这也就是为什么我们在使用ST-Link2烧写程序的时候,规定起始地址0x080
    发表于 06-14 10:11 9801次阅读
    基于<b class='flag-5'>STM32</b>F407的<b class='flag-5'>flash</b>内存结构分析

    微处理器IAP技术中是如何融合rfid技术的

    STM32位处理器IAP功能与51单片机系统大体相似,需要设置程序起始位置,引导程序必须设置Flash地址
    发表于 01-16 17:50 1062次阅读
    微处理器IAP技术中是如何融合rfid技术的

    嵌入式软件中利用内部flash存储参数的方法

    ,参数存储在内部flash中,毕竟就算每片减少一块钱,量大后还是非常可观的。02选择参数存储位置stm32flash地址起始于0x08000000
    发表于 11-16 18:21 18次下载
    嵌入式软件中利用内部<b class='flag-5'>flash</b>存储参数的方法

    STM32CUBEIDE中修改FLASH起始地址的方法

    ,使用USB-DFU约需要32KB的FLASH(从0x08000000-0x08007FFF),则用户的应用程序应当从0x08008000-0x08010000,故将程序偏移量应当设置
    发表于 12-01 20:51 11次下载
    <b class='flag-5'>STM32</b>CUBEIDE中修改<b class='flag-5'>FLASH</b>起始<b class='flag-5'>地址</b>的方法

    STM32Flash地址0x08000000,从0x00000000不可以?

    这里写自定义目录标题为什么STM32Flash地址0x08000000的启动而不是0x00000000?这是
    发表于 12-02 11:51 3次下载
    <b class='flag-5'>STM32</b>的<b class='flag-5'>Flash</b><b class='flag-5'>地址</b>是<b class='flag-5'>0x08000000</b>,从<b class='flag-5'>0x</b>00000000不可以?

    【不是问题的问题】为什么STM32Flash地址设置0x08000000

    【不是问题的问题】为什么STM32Flash地址设置0
    发表于 12-04 14:21 11次下载
    【不是问题的问题】为什么<b class='flag-5'>STM32</b>的<b class='flag-5'>Flash</b><b class='flag-5'>地址</b><b class='flag-5'>要</b><b class='flag-5'>设置</b><b class='flag-5'>到</b><b class='flag-5'>0x08000000</b>