STM32内部flash分配

发布者:老王古玩店最新更新时间:2018-08-22 来源: eefocus关键字:STM32  内部flash  分配 手机看文章 扫描二维码
随时随地手机看文章

在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)后的存储空间都可以作其它用途,使用这些存储空间时不会篡改应用程序空间的数据。


关键字:STM32  内部flash  分配 引用地址:STM32内部flash分配

上一篇:STM32使用16M外部晶振时串口乱码
下一篇:STM32 Flash读写;Flash地址对应的存储内容及方式

推荐阅读最新更新时间:2024-03-16 16:11

ST更新TouchGFX软件包,功能丰富并减少对STM32内存和CPU需求
意法半导体更新了STM32 *微控制器TouchGFX用户界面软件框架,新增功能能够让图形用户界面变得更流畅,动态效果更好,并降低对存储器和CPU的需求。 TouchGFX是STM32生态系统中的一套免费软件工具,包括TouchGFX Designer PC(PC端工具)和TouchGFX Engine(设备端软件)。TouchGFX Designer PC用于设计和配置丰富多彩的用户界面,而TouchGFX Engine则运行在终端设备上,使用户界面实现高性能。最新的4.12版TouchGFX对这两个软件都进行了更新。用户现在可以在单片显示解决方案上构建先进的用户界面,无需外部RAM存储器或闪存,节能特性可以延长电池续航时间
[嵌入式]
STM32学习002_固件库介绍
STM32利用库函数编程 库函数是STM32生产厂家封装好的函数库,方便用户编程。 USART 库函数 USART库函数包括三种初始化函数,1—缺省值初始化,2—普通初始化,3—结构体类初始化,一般情况下,我们选择第三种初始化方式 第一步:配置使能位(包括波特率,数据位,停止位,校验位) 先定义一个结构体变量:USART_InitTypeDef USART_InitStructure , 然后根据该结构体的相关配置参数,配置实际需要的参数。 USART_InitStructure.USART_BaudRate = 9600; //波特率设置为9600 USART_InitStructure.USART_WordLeng
[单片机]
stm32的按键扫描[操作寄存器+库函数]
本例将实现stm32的按键扫描功能。 操作寄存器 stm32的I/O口作为输入使用时,是通过读取GPIOx - IDR 寄存器的内容来读取I/O口状态的。 IDR寄存器各位描述如下: 由于systick不能像库函数那样方便的产生中断,通过查询systick状态位后,再查询各管脚状态反而更为不方便,所以和库函数方法不一样,直接查询了管脚状态来检测按键。 代码中调用 PAout(x) 、 PAin(x)等函数 在sys.h文件中,参见:(sys.h 代码参照 stm32 直接操作寄存器开发环境配置 ) 直接操作寄存器代码: #include stm32f10x_lib.h #include system
[单片机]
<font color='red'>stm32</font>的按键扫描[操作寄存器+库函数]
STM32高级定时器1控制伺服直流电机
简介:使用STM32也有很多年了,现在毕业临近了,就想写写,做做记录也希望能帮助到可以帮助的人。STM32定时器有很多的用途,我也不一一举例,我最常用的就是输出PWM,定时器,输入捕获以及编码盘模式等等。 第一 : 用STM32高级定时器1控制伺服直流电机 /////////////////////////////////////////// //定时器1PWM初始化 共4路可变掌控比///////// //输入参数PWM1/2/3/4掌控比参数30000-60000// ////////////////////////////////////////// void TIM1_PWM(unsigned in
[单片机]
浅析STM32的hex文件
前段时间需要用到BIN文件 随便把HEX文件也了解了一下 参考查阅了一些网上资料,如有雷同除了巧合还有借鉴参考。。。 正题:HEX文件格式如下 0x3a 0x0d 0x0a 分析下面具体例子 :020000040800F2 : 这个就是 0x3a ,也就是冒号 02 这个就是说明这行数据区的数据内容长度,也就是数据内容为两个字节在后面的 0800 那里 0000 这个是数据要送往的地址 要看具体数据类型 04 解释整行数据的数据类型,主要有这几种 '00' Data Record 数据 '01' End of File Record 文件结束标志 '02' Extended
[单片机]
浅析<font color='red'>STM32</font>的hex文件
STM32单片机下载调试解决方案 e-link32
在使用STM32单片机的时候,本人遇到以及看到同行们遇到了各种下载和调试过程中问题种种,比如下载器的驱动不合适,下载出现卡死,调试器会崩掉,还有同行购买了盗版的J-LINK在使用的过程中固件容易丢失等问题。现在正好入手了一件下载器,比较容易操作,希望可以解决大家在下载和调试中所出现的问题。 某宝就是上图的e-link32,此下载器支持Keil和IAR开发环境,并且支持了Cortex-M0/M0+/M3/M4/M7的内核,采用的是SWD的接口下载。速度还可以达到了10Mhz.,最为棒的一点是下载程序的时候是免驱动的,(还记得当时刚开始学习32的时候在使用下载器一脸懵逼的样子)但是在串口调试的过程中则需要安装驱动。该下载器还具备了
[单片机]
<font color='red'>STM32</font>单片机下载调试解决方案 e-link32
STM32基于时间片轮询机制
1. 基于时间片的轮询调度算法(仅局限单核CPU芯片): 利用定时器为每个任务函数设定执行时间间隔,保证使用频率高的函数多次被调用,提高单核芯片的资源利用率。如果只是简单地将A、B两个函数放在while中,那么在一定时间内这两个函数调用的次数是一致的,,这样就浪费了单核芯片的资源。 2. 例子: 函数A(100μs执行一次----使用频率高), 函数B(1000μs执行一次----使用频率低)。 那么在1ms 内 函数A 执行了10次,而函数B只执行1次 当然你要保证函数A在100μs内执行完毕、函数B在1000μs内执行完毕 如果超出时间的话系统会变得卡顿。有部分的函数可能没有别执行到。毕竟单核芯片只在很短时间内只做
[单片机]
一文了解STM32启动过程
1 概述 说明 每一款芯片的启动文件都值得去研究,因为它可是你的程序跑的最初一段路,不可以不知道。通过了解启动文件,我们可以体会到处理器的架构、指令集、中断向量安排等内容,是非常值得玩味的。 STM32作为一款高端 Cortex-M3系列单片机,有必要了解它的启动文件。打好基础,为以后优化程序,写出高质量的代码最准备。 本文以一个实际测试代码--START_TEST为例进行阐述。 整体过程 STM32整个启动过程是指从上电开始,一直到运行到 main函数之间的这段过程,步骤为(以使用微库为例): ①上电后硬件设置SP、PC ②设置系统时钟 ③软件设置SP ④加载.data、.
[单片机]
一文了解<font color='red'>STM32</font>启动过程
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved