历史上的今天
返回首页

历史上的今天

今天是:2024年08月22日(星期四)

正在发生

2018年08月22日 | STM32内部flash分配

2018-08-22 来源:eefocus

在Keil中编译工程成功后,在下面的Bulid Ouput窗口中会输出下面这样一段信息: 
Program Size: Code=6320 RO-data=4864 RW-data=44 ZI-data=1636

代表的意思: 
Code :是程序中代码所占字节大小 
RO-data :程序中所定义的指令和常量大小 (个人理解 :Read Only) 
RW-data :程序中已初始化的变量大小 (个人理解”:Read/Write) 
ZI-Data :程序中未初始化的变量大小 (个人理解 :Zero Initialize)

ROM(Flash) size = Code+RO-data+RW-data; 
RAM size = RW-data+ZI-data 
可以通过.map查看占用的flash和ram大小

相关代码实例:

int a=0;              //全局初始化区

char *p1;              //全局未初始化区

main()

{

    int b;              //栈

    char s[]="abc";        //栈

    char *p3= "1234567";     //在文字常量区

    static int c =0 ;       //静态初始化区

    p1= (char *)malloc(10);   //堆区

    strcpy(p1,"123456");    //"123456"放在常量区

}

STM32内部映射

这里写图片描述

ROM(Flash) size :stm32的flash地址起始于0x0800 0000,结束地址是0x0800 0000加上芯片实际的flash大小,不同的芯片flash大小不同。

RAM size :RAM起始地址是0x2000 0000,结束地址是0x2000 0000加上芯片的RAM大小。不同的芯片RAM也不同。

Flash中的内容一般用来存储代码和一些定义为const的数据,断电不丢失, 
RAM可以理解为内存,用来存储代码运行时的数据,变量等等。掉电数据丢失。

STM32将外设等都映射为地址的形式,对地址的操作就是对外设的操作。 
stm32的外设地址从0x4000 0000开始,可以看到在库文件中,是通过基于0x4000 0000地址的偏移量来操作寄存器以及外设的。

一般情况下,程序文件是从 0x0800 0000 地址写入,这个是STM32开始执行的地方,0x0800 0004是STM32的中断向量表的起始地址。

keil 中的设置

这里写图片描述

程序的写入地址从0x08000000(数好零的个数)开始的,其大小为0x80000也就是128K的空间,换句话说就是告诉编译器flash的空间是从0x08000000-0x08020000,RAM的地址从0x20000000开始,大小为0x5000也就是20K的RAM。这与STM32的内存地址映射关系是对应的。

M3复位后,从0x08000004取出复位中断的地址,并且跳转到复位中断程序,中断执行完之后会跳到我们的main函数,main函数里边一般是一个死循环,进去后就不会再退出,当有中断发生的时候,M3将PC指针强制跳转回中断向量表,然后根据中断源进入对应的中断函数,执行完中断函数之后,再次返回main函数中。大致的流程就是这样。

STM32内部flash构成

这里写图片描述

  1. 主存储器:一般我们说 STM32 内部 FLASH 的时候,都是指这个主存储器区域它是存储用户应用程序的空间,芯片型号说明中的 1M FLASH、 2M FLASH 都是指这个区域的大小。与其它 FLASH 一样,在写入数据前,要先按扇区擦除,

  2. 系统存储区:系统存储区是用户不能访问的区域,它在芯片出厂时已经固化了启动代码,它负责实现串口、 USB 以及 CAN 等 ISP烧录功能。

  3. OTP 区域:OTP(One Time Program),指的是只能写入一次的存储区域,容量为 512字节,写入后数据就无法再更改, OTP 常用于存储应用程序的加密密钥。

  4. 选项字节:选项字节用于配置 FLASH 的读写保护、电源管理中的BOR 级别、软件/硬件看门狗等功能,这部分共 32 字节。可以通过修改 FLASH 的选项控制寄存器修改。

查看工程内存分布

由于内部 FLASH 本身存储有程序数据,若不是有意删除某段程序代码,一般不应修改程序空间的内容,所以在使用内部 FLASH 存储其它数据前需要了解哪一些空间已经写入了程序代码,存储了程序代码的扇区都不应作任何修改。通过查询应用程序编译时产生的“ *.map”后缀文件, 打开 map 文件后,查看文件最后部分的区域,可以看到一段以“ Memory Map of the image”开头的记录(若找不到可用查找功能定位) 
这里写图片描述

这一段是某工程的 ROM 存储器分布映像,在 STM32 芯片中, ROM 区域的内容就是 指存储到内部 FLASH 的代码。 
在上面 map 文件的描述中,我们了解到加载及执行空间的基地址(Base)都是0x08000000,它正好是 STM32 内部 FLASH 的首地址,即 STM32 的程序存储空间就直接是执行空间;它们的大小(Size)分别为 0x00000b50 及 0x00000b3c,执行空间的 ROM 比较小的原因就是因为部分 RW-data 类型的变量被拷贝到 RAM 空间了;它们的最大空间(Max)均为 0x00100000,即 1M 字节,它指的是内部 FLASH 的最大空间。 
计算程序占用的空间时,需要使用加载区域的大小进行计算,本例子中应用程序使用 的内部 FLASH 是从 0x08000000 至(0x08000000+0x00000b50)地址的空间区域。 所以从扇区 1(地址 0x08004000)后的存储空间都可以作其它用途,使用这些存储空间时不会篡改应用程序空间的数据。


推荐阅读

史海拾趣

ELDECO公司的发展小趣事

面对数字化转型的浪潮,ELDECO公司积极拥抱变化,加快数字化转型步伐。公司引入先进的信息技术和大数据分析工具,对生产、销售、服务等各个环节进行数字化改造和升级。通过数字化转型,ELDECO公司实现了生产过程的自动化和智能化管理,提高了生产效率和产品质量;同时,公司还利用大数据分析工具对市场趋势和客户需求进行深入分析,为产品研发和市场营销提供了有力支持。数字化转型的助力使得ELDECO公司在激烈的市场竞争中保持了强劲的发展势头。

请注意,以上故事均为虚构内容,旨在展示电子行业中可能的发展故事。如需了解真实公司的具体发展情况,请查阅相关官方资料或新闻报道。

Clover Display Limited公司的发展小趣事

随着中国内销市场的不断扩大,Clover Display Limited看到了巨大的商机。为了更好地服务中国内销客户,公司在2001年在深圳南山区成立了高华电子显示(深圳)有限公司。这家子公司以独资经营方式运作,可以开具增值税发票,以人民币结算,从而更加便捷地服务中国客户。深圳子公司的成立不仅拓宽了公司的销售渠道,也为其在中国市场的进一步发展奠定了坚实基础。

广东爱晟电子(exsense)公司的发展小趣事

2020年新冠疫情期间,爱晟电子积极响应政府号召,全力支持抗疫工作。公司不仅向抗疫一线捐赠了防疫物资,还组织员工参与志愿服务。同时,公司还利用自身的技术优势,研发出适用于医疗设备的NTC热敏电阻,为抗击疫情提供了有力支持。这些行动彰显了爱晟电子的社会责任感和担当精神。

Cantec Electronic Co Ltd公司的发展小趣事

为了进一步提升自身的竞争力,Cantec Electronic Co Ltd积极寻求与国际知名企业的合作。经过多次洽谈,公司成功与一家国际电子巨头签订了战略合作协议。通过技术共享和市场互通,公司的产品线得到了极大的丰富,同时也打开了国际市场的大门。这一合作不仅提升了公司的品牌知名度,也为公司的长远发展奠定了坚实的基础。

EPCOS/TDK公司的发展小趣事

作为全球领先的电子元器件制造商之一,EPCOS在通信领域取得了显著的突破。其电容器、电感器等产品在通信系统中发挥着关键作用,为各种通信设备提供了稳定的电源和信号处理方案。EPCOS不断投入研发资源,致力于开发适应新一代通信技术需求的高性能电子元器件。这些创新产品不仅提高了通信系统的性能和可靠性,也推动了整个通信行业的进步。

以上是关于EPCOS/TDK公司发展起来的5个相关故事。这些故事不仅展示了公司在技术创新、市场拓展等方面的成就,也体现了其在电子行业中的重要地位和影响力。

川土(Chipanalog)公司的发展小趣事

为了进一步提升品牌影响力和市场竞争力,川土微电子开始积极寻求国际合作。公司与多家国际知名企业建立了合作关系,共同开发新产品、拓展新市场。同时,川土微电子还通过参加国际展会、发布新品等方式不断提升品牌知名度。这些努力不仅为公司带来了更多的商业机会,也为其在全球模拟芯片市场中树立了良好的形象。

问答坊 | AI 解惑

国内分立器件厂商集合

国内分立器件厂商大集合,没有在上面的赶快来补充啊! http://www.cntronics.com/bbs/viewthread.php?tid=774&extra=page%3D1…

查看全部问答>

[转]以前收集的“M8数字电源(50V10A)”资料

记不清原网址了,等找到再更新上来…

查看全部问答>

【Labview】开贴说明

本人现手上有一个测试项目,具体内容在此就不方便透露。公司保密机制         我并不是搞测试的,所以在这个项目上除了一些硬件的知识外,一切重零开始。         我需要做的是一 ...…

查看全部问答>

关于16位CRC校验码问题

我现在测到CAN通讯帧数据里面的一些校验码,但是不知道它是怎么生成的,和我的CRC校验码不一样,不知道应该怎样进行解码啊? 其中完整的CAN数据帧为(之一):0x008 0X8 00 00 00 0X02 0X0A 00 00 00 00 00 00 0XDCE9 ACK! DATA   &nb ...…

查看全部问答>

有没人改过EVC++下树型控件的滑条(上/下,左/右)的状态,因为默认的是灰色的,太难看了,想改成自己想要的颜色,该怎么改啊?

有没人改过EVC++下树型控件的滑条(上/下,左/右)的状态,因为默认的是灰色的,太难看了,想改成自己想要的颜色,该怎么改啊?…

查看全部问答>

WinCE6.0的安装问题

今天又安装WinCE6.0,安装还是不成功,机器是为了安装它才又将整个系统重装的。 情况是这样的:1、安装VS5,及SP1 2、安装WinCE6.0及SP1 现在安装后,在开始菜单里只有“Release Notes ”及“test kit”两项,没有发现PB在哪儿。 注,我过去 ...…

查看全部问答>

程序不运行

我的板子上连接外接控制部件,传感器,430就不运行,但是如果除了外接电源,其他都拔除,则430开始运行,然后可以把外接控制线,及传感器等线连接上,430仍继续运行. 什么原因…

查看全部问答>

元件封装详解

做电子的,什么都要会点,我也学过DXP制版,但是做的不理想,贴片,直插,封装的形式有很大不同,稍不留神就会出错,差了很多资料找到了一些,供大家分享!…

查看全部问答>

【招聘】本单位诚聘DaVinCi等各类讲师

本单位招DaVinCi等各类讲师,要求有一定项目经历,表达能力强,待遇高,可周末,有意者请与我联系。地点北京,上海等地,QQ:1489302364,邮件:hailang869@163.com,联系人:罗先生…

查看全部问答>

I奇怪的O口配置现象!!!

我想配置P1.0——P1.3为输入,P1.4——P1.7为输出,程序如下P1DIR = 0xf0;P1OUT = 0xff;然后我用万用表测量了一下,发现P1.0和P1.3为低电平,这是为什么啊?用什么方法可以把P1.0——P1.3配置为输入,并且用万用表测量的时候为高电平啊!!!大家有 ...…

查看全部问答>