剖析STM32的FLASH和SRAM的使用情况

发布者:快乐的旅程最新更新时间:2023-08-23 来源: elecfans关键字:STM32  FLASH  SRAM 手机看文章 扫描二维码
随时随地手机看文章

01前言

STM32片上自带FLASH和SRAM,简单讲FLASH用来存储程序的,SRAM是用来存储运行程序中的中间变量。本文详细分析下如何查看程序中FLASH和SRAM的使用情况。


本文开发工具: keil5

芯片: STM32F105VCT6

02FLASH和SRAM介绍

FLASH存储器又成为闪存,它与EEPROM都是掉电后数据不丢失的存储器,但是FLASH的存储容量都普遍的大于EEPROM,在存储控制上,最主要的区别是FLASH芯片只能一大片一大片地擦除,而EEPROM可以单个字节擦除。


SRAM是静态随机存取存储器。它是一种具有静止存取功能的内存,不需要刷新电路即能保存它内部存储的数据。STM32F1系列可以通过FSMC外设来拓展SRAM。


注意:SRAM和SDRAM是不相同的,SDRAM是同步动态随机存储器,同步是指内存工作需要同步时钟,内部的命令的发送与数据的传输都以它为基准;动态是指存储阵列需要不断的刷新来保证数据不丢失;随机是指数据不是线性依次存储,而是自由指定地址进行数据读写。STM32的F1系列是不支持SDRAM的。

stm32不同型号的SRAM和FLASH大小是不相同的,可在datasheet中查看如下图:

08d40a92-990f-11eb-8b86-12bb97331649.png

08ee58de-990f-11eb-8b86-12bb97331649.png

03编译结果分析

在keil中编译结果如下图:

0915ec64-990f-11eb-8b86-12bb97331649.png

打开生成的map文件拉到最后可看到如下:

093488e0-990f-11eb-8b86-12bb97331649.png

编译结果里面几个的含义

Code:代码空间,本质是ARM指令( FLASH)。

RO-data:即 Read Only-data, 表示程序定义的常量,如 const 类型( FLASH)。

RW-data:即 Read Write-data, 非0初始化的全局和静态变量占用的RAM大小,同时还要占用等量的ROM大小用于存放这些非0变量的初值(FLASH+RAM)。

ZI-data:即 Zero Init-data, 0初始化的内存区的大小(该区域3个用途:0初始化的全局和静态变量+堆区+栈区)(RAM)。

由上可知:

程序占用FLASH=Code + RO-data + RW-data 即map文件中ROM size

程序占用RAM = RW-data + ZI-data 即map文件中RW size


常见的俩个疑问:

1、RW-data为什么会即占用Flash又占用RAM空间?

由前文知道RAM掉电数据会丢失,RW-data是非0初始化的数据,已初始化的数据需要被存储在掉电不会丢失的FLASH中,上电后会从FLASH搬移到RAM中。

2、为什么烧录的镜像文件不包含ZI-data呢?

我们都知道在烧写程序的时候,需要烧写bin文件或者hex文件到STM32的flash中,被烧写的文件称为镜像像文件image。image的内容包含这三个Code 、 RO-data 和 RW-data。


通过第一个问题大家应该有所理解,因为ZI数据是0,没必要包含,只要在程序运行前把ZI数据区域一律清零即可,包含进去反而浪费Flash存储空间。


关键字:STM32  FLASH  SRAM 引用地址:剖析STM32的FLASH和SRAM的使用情况

上一篇:基于STM32和MPU-6050的两轮自平衡小车系统设计与实现
下一篇:一文详解GD32单片机和STM32单片机

推荐阅读最新更新时间:2024-11-08 13:38

STM32 串口详解
01、USART的特点 USART是通用异步收发传输器(UniversalAsynchronousReceiver/Transmitter),通常称作UART,是一种异步收发传输器,是设备间进行异步通信的关键模块。UART负责处理数据总线和串行口之间的串/并、并/串转换,并规定了帧格式;通信双方只要采用相同的帧格式和波特率,就能在未共享时钟信号的情况下,仅用两根信号线(Rx和Tx)就可以完成通信过程,因此也称为异步串行通信。 全双工异步通信。 小数波特率发生器系统,提供精确的波特率。 可配置的16倍过采样或8倍过采样,因而为速度容差与时钟容差的灵活配置提供了可能。 可编程的数据字长度(8位或者9位); 可配置的停止位(支
[单片机]
<font color='red'>STM32</font> 串口详解
STM32开发 -- Ublox GPS之设置PUBX
之前获取GPS所需内容需要解析多个GNNS消息,甚是麻烦了。 查看手册里面有PUBX部分,专有消息:即由u-blox定义的消息。 只要解析这一个就可以了,甚好。哈哈 简单的看一下这里面都有些什么吧。 这里主要看里面的PUBX00、PUBX03和PUBX04。其他两个自行查看手册。 一、PUBX 1、PUBX00 经纬度定位信息 2、PUBX03 卫星状况 3、PUBX04 时间和时钟信息 二、UCenter配置 配置UBX- CFG- MSG- PUBX00/PUBX03/PUBX04,选择UART1。 如果只打印PUBX内容,GNSS内容不想打印该怎么办呢?? so easy!选择对应相,把所有勾选去掉
[单片机]
<font color='red'>STM32</font>开发 -- Ublox GPS之设置PUBX
STM32的Code/RO/RW/ZI区、Flash/Ram的占用情况、堆栈大小的设置
以cortex-M3为例,例如STM32F103 这篇文章要讲2个问题: 1、编译出的程序(指令)、变量的存放位置、大小? 2、在代码和keil中,“堆、栈”两者的大小如何设置? keil编译完成后,会有提示,形如: Program Size: Code=1148 RO-data=424 RW-data=20 ZI-data=1636 其中: ① Code为代码,本质上就是一大堆ARM指令; ② RO为只读的数据,例如,char *name = TOM ;//TOM三个字符就存放在ROM中作为RO-DATA;又如,为了减小sin的计算量,把sin的各个值直接制作成表,const float sinVal =
[单片机]
<font color='red'>STM32</font>的Code/RO/RW/ZI区、<font color='red'>Flash</font>/Ram的占用情况、堆栈大小的设置
STM32 JTAG接口PB3PB4配置为IO口使用问题
因为IO口紧张,在原理绘制期间就利用了PB3和PB4,但是在调试程序的时候才发现,PB3和PB4控制不了。 查看了一下芯片手册,发现芯片在上电后,居然默认是JTAG接口,怪自己粗心了。 JTAG和SWD接口对照如下图。 我们可以看到PB3,PB4,PA15都被利用为JTAG接口中,SWD接口只要PA13,PA14。 所以为了重新使用PB3,PB4,我关闭JTAG功能, RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); //开启AFIO时钟 GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable , ENABLE); //禁止JTAG功
[单片机]
<font color='red'>STM32</font> JTAG接口PB3PB4配置为IO口使用问题
基于Keil、STM32,用C++编写流水灯程序
通常来说,在单片机上编程,要么汇编,要么C语言,而用C++进行开发的很少,那么究竟能不能用C++开发单片机呢? 答案是肯定可以的,下面讲讲基于Keil、STM32,用C++编写流水灯程序的一些内容。 1、为什么很少用C++开发单片机 不知道大家对面向过程和面向对象的理解有多少? C语言面向过程的语言,C++是面向对象的编程语言。结合本文来说,面向过程相比面向对象的编程,代码量更小,运行效率更高。 所以,C语言相比C++具有更小代码量、更快的运行速度。 当然,这里是C相对C++而言。其实,汇编相对C而言,具有更小代码量和更快的运行速度。可以参看文章:用 汇编 和 C语言 写流水灯程序有什么不一样? 因为单片机的RAM和Flash资源
[单片机]
stm32 时钟 pcclk ahb hclk
AHB (HCLK) 时钟 = SYSCLK = 72MHz APB2(PCLK2)时钟 = AHB时钟 = 36MHz APB1(PCLK1)时钟 = AHB 1/2时钟 = 72MHz ADC时钟 = PCLK2 1/4 = 9MHz PLL时钟 = HSE*9 = 72MHz ErrorStatus HSEStartUpStatus; //初始化RCC外部设备寄存器 RCC_DeInit(); //打开外部高速晶振 RCC_HSEConfig( RCC_HSE_ON ); //等待外部高速设备准备好 H
[单片机]
STM32硬件IIC操作
Stm32具有IIC接口,接口有以下主要特性 多主机功能:该模块既可做主设备也可做从设备 主设备功能 C地址检测 产生和检测7位/10位地址和广播呼叫 支持不同的通讯速度 状态标志: 发送器/接收器模式标志 字节发送结束标志 总线忙标志 错误标志 2个中断向量 可选的拉长时钟功能 具单字节缓冲器的DMA 虽然很多人说STM的硬件IIC不好用,但是对于这么一个设备去探索一下还是很有必要的,指不定哪天就用上了呢, IIC借口一共有九个寄存器,比较重要的几个寄存器分别如下 1. CR1 由这几个位我们可以正常产生标准IIC的START条件STOP条件,ACK与NOACK CR2 控制IIC的通行频率 这两位检测IIC总线
[单片机]
<font color='red'>STM32</font>硬件IIC操作
X-CUBE-STL:支持更多STM32, 揭开功能安全的神秘面纱
X-CUBE-STL 目前支持 STM32MP1、STM32U5、STM32L5、STM32H5和 STM32WL。实际上,这个最大的通用微控制器产品家族还在不断扩大,将会有更多的产品支持SIL2和SIL3系统。客户的开发团队可以在ST最新的产品上开发满足 IEC 61508、ISO 13849 和 IEC 61800 等要求 的应用。此外,在ST网站的功能安全网页上,开发者很容易找到各种资源,轻松快速通过工业或家电安全认证。网页上还列出了ST 授权合作伙伴以及他们提供的实时操作系统、开发工具、工程服务和培训课程,确保客户团队能够完成从概念验证到商品的市场转化。 o观看ST的功能安全网络研讨会 国际电工委员会对安全的定
[单片机]
X-CUBE-STL:支持更多<font color='red'>STM32</font>, 揭开功能安全的神秘面纱
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
  • 学习ARM开发(16)
    ARM有很多东西要学习,那么中断,就肯定是需要学习的东西。自从CPU引入中断以来,才真正地进入多任务系统工作,并且大大提高了工作效率。采 ...
  • 学习ARM开发(17)
    因为嵌入式系统里全部要使用中断的,那么我的S3C44B0怎么样中断流程呢?那我就需要了解整个流程了。要深入了解,最好的方法,就是去写程序 ...
  • 学习ARM开发(18)
    上一次已经了解ARM的中断处理过程,并且可以设置中断函数,那么它这样就可以工作了吗?答案是否定的。因为S3C44B0还有好几个寄存器是控制中 ...
  • 嵌入式系统调试仿真工具
    嵌入式硬件系统设计出来后就要进行调试,不管是硬件调试还是软件调试或者程序固化,都需要用到调试仿真工具。 随着处理器新品种、新 ...
  • 最近困扰在心中的一个小疑问终于解惑了~~
    最近在驱动方面一直在概念上不能很好的理解 有时候结合别人写的一点usb的例子能有点感觉,但是因为arm体系里面没有像单片机那样直接讲解引脚 ...
  • 学习ARM开发(1)
  • 学习ARM开发(2)
  • 学习ARM开发(4)
  • 学习ARM开发(6)
何立民专栏 单片机及嵌入式宝典

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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