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

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

3天内不再提示

FLASH编程与改变程序(代码) 存储地址的问题

黄工的嵌入式技术圈 来源:黄工的嵌入式技术圈 2020-03-20 14:07 次阅读

写在前面 Ⅰ

对于在STM32F2或F4开发的朋友而言,有部分数据需要在内部FLASH编程,程序(代码)又比较大,资源空间又有限的情况下,代码默认的存储地址就可能需要搬移。

为什么是F2或F4系列的芯片呢?因为Main memory扇区(或块)分布不均匀,看下面FLASH模块构成:

当然,像STM32F0、F1它们的FLASH数据块分布均匀,这类芯片就没必要改变程序存储地址。

为什么要改变代码存储地址 Ⅱ

假如芯片的FALSH大小为512KB,RAM大小为128KB。而代码大小为400KB(甚至更大),又需要在内部FLASH编程,那么代码的存储地址就不能从默认的起始地址(Sector 0)开始存储。

原因很简单:最后一扇区有代码,不能被用户编程。

还有一种原因:用户RAM大小有限(假如只剩15K未用,RAM用于缓存FLASH数据),而用户编程FLASH的数据有20K,这样就需要分多块(扇区)来操作,这样就需要将小的扇区拿出来给用户编程(即前面16K大小的扇区)。

上面举例的总结就是:需要将代码的存储起始地址从Sector 0搬移至Sector 3或者Sector 4,把前面小扇区(Sector 1 --- 3)用于数据编程。(注意:Sector 0扇区存储启动的部分代码,不能用于编程)。

改变代码存储地址的方法 Ⅲ

代码存储的地址是由编译器决定的,因此这里简单讲述一下Keil和IAR如何配置改变代码存储起始地址。下面以起始地址从0x08010000 (Sector 4)举例说明。

1.Keil配置方法

打开工程目标选项:Project -> Options for Target -> Target。修改目标ROM起始地址。如下图:

2.IAR配置方法

配置步骤分如下几步:

A.进入配置界面:Pooject -> Options -> Linker -> Config;

B.勾选上“Override default”;

C.点击“Edit”,修改ROM起始地址为;

D.点击“Save”保存(第一次修改后,xxx.icf文件名和路径都选择默认)。

具体如下图:

验证代码存储地址 Ⅳ

对于STM32芯片来说,可以直接使用STM32 ST-LINK Utility工具读取FLASH数据验证代码是否存储在相应地址位置,其他芯片也可以使用对应可以读取FLASH数据的工具来验证。如下图:

从上图可以看见,代码是从0x08010000 (Sector 4)起始存储的。查看Sector 1-3扇区,可以发现数据全是0xFFFF,也就是说没有被代码占用这些扇区。

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

    关注

    10

    文章

    1551

    浏览量

    146660
  • 编译器
    +关注

    关注

    1

    文章

    1577

    浏览量

    48621
  • STM32F0
    +关注

    关注

    0

    文章

    61

    浏览量

    16997
收藏 人收藏

    评论

    相关推荐

    求助,关于SPC560D单片机flash代码分段存储问题求解

    flash区域,把程序内一些模块放在不能跳转的flash区域,但这样做导致了用户程序不能运行,请问这样做为什么不可行?代码必须连续
    发表于 04-07 08:13

    Flash存储芯片:NOR Flash、NAND Flash、UFS和eMMC的比较与解析

    地位。本博客将详细介绍Flash存储芯片中的NOR Flash、NAND Flash、UFS和eMMC,分析它们的用途、优缺点,并对其进行比较。 1.Nor
    的头像 发表于 04-03 12:02 261次阅读
    <b class='flag-5'>Flash</b><b class='flag-5'>存储</b>芯片:NOR <b class='flag-5'>Flash</b>、NAND <b class='flag-5'>Flash</b>、UFS和eMMC的比较与解析

    CW32L052 FLASH存储

    CW32L052内部集成了64KB嵌入式FLASH供用户使用,可用来存储应用程序和用户数据。芯片支持对 FLASH 存储器的读、擦除和写操作
    的头像 发表于 02-28 17:43 435次阅读
    CW32L052 <b class='flag-5'>FLASH</b><b class='flag-5'>存储</b>器

    瑞萨Flash示例程序01型SC版本(代码Flash)应用说明

    电子发烧友网站提供《瑞萨Flash示例程序01型SC版本(代码Flash)应用说明.pdf》资料免费下载
    发表于 02-19 13:48 0次下载
    瑞萨<b class='flag-5'>Flash</b>示例<b class='flag-5'>程序</b>01型SC版本(<b class='flag-5'>代码</b><b class='flag-5'>Flash</b>)应用说明

    stm32 flash写数据怎么存储

    stm32 flash写数据怎么存储的  STM32是一款广泛应用于嵌入式系统开发的微控制器,它的Flash存储器是其中一个重要的组成部分。在本文中,我将详细介绍STM32
    的头像 发表于 01-31 15:46 811次阅读

    Nor Flash编程和擦除操作实践与指南

    闪存编程也不涉及将数据写入存储单元,为确保准确编程,Nor Flash 支持字节级编程,允许写入或修改单个字节,而无需擦除整个块。
    的头像 发表于 12-05 14:03 524次阅读

    嵌入式开发中,如何将Flash中的程序转移到RAM中运行?

    嵌入式开发中,如何将Flash中的程序转移到RAM中运行? Flash存储器是嵌入式设备中常用的一种非易失性存储器,它通常用来
    的头像 发表于 10-29 16:23 1513次阅读

    RA Flash地址绝对定位

    RA Flash地址绝对定位
    的头像 发表于 10-26 18:24 376次阅读
    RA <b class='flag-5'>Flash</b><b class='flag-5'>地址</b>绝对定位

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

    为什么STM32的Flash地址要设置到0x08000000?
    的头像 发表于 10-26 15:50 990次阅读
    为什么STM32的<b class='flag-5'>Flash</b><b class='flag-5'>地址</b>要设置到0x08000000?

    如何使用Flash模拟EEPROM存储参数

    概述在MCU的使用中,经常遇到需要存储参数或掉电保持数据等功能。其中,Flash和EEPROM是常见的非易失性存储器,都可以做到设备掉电重启后,数据还会保留。但二者有明显的区别:EEPROM可以
    的头像 发表于 09-22 08:19 734次阅读
    如何使用<b class='flag-5'>Flash</b>模拟EEPROM<b class='flag-5'>存储</b>参数

    nor flash和nand flash的区别 单片机是Nor还是Nand Flash

    NOR Flash的读取和我们常见的SDRAM的读取是一样,即可以根据地址随机读写,用户可以直接运行装载在NOR FLASH里面的代码,这样可以减少SRAM的容量从而节约了成本。因为其
    发表于 08-07 09:47 905次阅读
    nor <b class='flag-5'>flash</b>和nand <b class='flag-5'>flash</b>的区别 单片机是Nor还是Nand <b class='flag-5'>Flash</b>?

    如何让程序存储在指定的偏移地址呢?

    有时候,我们不想让程序存储在起始的位置,比如现在有一段bootloader,对应的app(应用程序存储的位置就会有一个偏移地址。那么,如何
    发表于 07-10 10:38 606次阅读
    如何让<b class='flag-5'>程序</b><b class='flag-5'>存储</b>在指定的偏移<b class='flag-5'>地址</b>呢?

    ARMv8-A架构处理器的Reset vector入口地址

    Reset vector入口地址很重要,因为只有以这个地址作为起始地址程序固化到非易失存储器(比如ROM、NOR
    发表于 06-09 14:24 1025次阅读
    ARMv8-A架构处理器的Reset vector入口<b class='flag-5'>地址</b>

    单板硬件设计:存储器( NAND FLASH)

    flash中运行。嵌入式系统多用一个小容量的nor flash存储引导代码,用一个大容量的nand flash存放文件系统和内核。 1.2
    发表于 05-19 15:59

    MPC5674F Flash代码是如何跳转到想要的地址并加载到那个地址

    目前,我打算通过串口通信做一个bootloader。 我想将应用数据保存在内部Flash 0x40008000中,跳转到保存的数据地址去bootloader。 你有功能或代码吗? 我最需要的
    发表于 05-19 07:17