STM32深入系列01——内存简述(Flash和SRAM)

这篇具有很好参考价值的文章主要介绍了STM32深入系列01——内存简述(Flash和SRAM)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

====>>> 文章汇总(有代码汇总) <<<====

最近学到了 内存池、IAP 相关的知识,虽然明白大致的过程,但是对于具体的很多数字还是有些似懂非懂,因此又回来稍微细致的总结一下,方便理解。

1. STM32内存简述

1.1. STM32寻址范围

  1. STM32是一个32位的单片机,因此,它有32根地址线,每个地址线有两种状态:导通 或 不导通。
  2. 单片机内存的地址访问存储单元是按照字节编址的。

按照字节编址,也就是说,访问一个地址上存储的数据,得到的是一个字节的数据。

根据上述两条,可以得出结论:

  1. STM32的寻址(内存)大小为:2^32(字节) = 4G(字节)
  2. STM32的寻址范围为:0X0000 0000 ~ 0XFFFF FFFF

1.2. 存储器功能划分

上述存储地址被分为了8个块(目前我用到的芯片F1、F4、L4的都是,其他的没用过不确定)。
如下表所示:

存储块 功能 地址范围
Block0 Code(Flash) 0x0000 0000 ~ 0X1FFF FFFF(512M)
Block1 SRAM 0x2000 0000 ~ 0X3FFF FFFF(512M)
Block2 片上外设 0x4000 0000 ~ 0X5FFF FFFF(512M)
Block3 FSMC BanK1&2 0x6000 0000 ~ 0X7FFF FFFF(512M)
Block4 FSMC BanK3&4 0x8000 0000 ~ 0X9FFF FFFF(512M)
Block5 FSMC寄存器 0xA000 0000 ~ 0XBFFF FFFF(512M)
Block6 没用到 0xC000 0000 ~ 0XDFFF FFFF(512M)
Block7 Cotrx M3内部外设 0xE000 0000 ~ 0XFFFF FFFF(512M)

比如,这里打开STM32L475的芯片手册上可以看到,从0X0000 0000 ~ 0XFFFF FFFF被分成了八份,也就是八个块。

不同芯片在整体的划分上都差不多,但是在实际的划分细节(大小)上会有差异。

STM32深入系列01——内存简述(Flash和SRAM)

2. SRAM、ROM位置

简单说:

  • RAM:读写速度快、掉电数据丢失;类比于电脑内存的作用。
  • ROM:读写速度相对慢、掉电数据仍在;类比于电脑硬盘的作用。

其中对于STM32而言,SRAM就是内存;Flash就是硬盘
STM32深入系列01——内存简述(Flash和SRAM)

以最最最常见的STM32F103C8T6为例:
STM32深入系列01——内存简述(Flash和SRAM)
它有64K字节的Flash、20K字节的RAM。

使用CubeMX对该芯片创建一个工程,然后点击魔术棒可以看到:

  1. 它的内置ROM起始地址为0X0800 0000,大小为0X10000,也就是FLASH的大小为:0X10000个字节 = 65536个字节 = 64k个字节 = 64kBytes。
  2. 它的内置RAM起始地址为0X2000 0000,大小为0X5000,也就是RAM的大小为:0X5000个字节 = 20480个字节 = 20k个字节 = 20kBytes。
    STM32深入系列01——内存简述(Flash和SRAM)
    对比一下芯片的数据手册:可以看到,其中FLASH位于第一块(索引0)的中间区域,RAM位于第二块(索引1)的开头。
    STM32深入系列01——内存简述(Flash和SRAM)

如果在KEIL软件中使用STLINK下载代码,就会发现代码是从0X0800 0000处开始保存的。

但是对于部分芯片来讲,其不止有一块RAM,比如STM32L475VET6,它有512K字节的Flash、128K字节的RAM。
STM32深入系列01——内存简述(Flash和SRAM)
同样的使用CubeMX对该芯片创建一个工程,然后点击魔术棒:

  1. 它的内置ROM起始地址为0X0800 0000,大小为0X80000,也就是FLASH的大小为:0X80000个字节 = 524288个字节 = 512k个字节 = 512kBytes。
  2. 它的内置RAM分为两块,第一块起始地址为0X2000 0000,大小为0X18000;第二块起始地址为0X1000 000,大小为0X8000,也就是RAM的大小为:0X18000+0X8000个字节 = 0X20000个字节 = 131072个字节 = 128k个字节 = 128kBytes。
    STM32深入系列01——内存简述(Flash和SRAM)
    同样对比一下芯片的数据手册:可以看到,其中FLASH位于第一块(索引0)的中间区域,RAM1位于第二块(索引1)的开头,RAM2位于第一块(索引0)的中间区域。
    STM32深入系列01——内存简述(Flash和SRAM)
    通过对比两个芯片的内存分布,可以看到,不同芯片的分布是有点差别的。

了解这部分的内容主要是因为:在使用内存池的时候,要知道内存池到底是怎么划分的,可以划分几个内存池,每个内存池的大小最大可以划分多大,都要参考这部分的内容。

另外关注一下:地址0x1FFFF 0000到0x1FFF 7000这部分,这部分是系统存储器,不需要我们用户来操作,但是要知道这部分出厂的时候就已经存了有东西的,后面看到Bootloader的时候会说到。

3. 程序占用内存大小

3.1. 查看程序大小

使用 CubeMX 创建一个 stm32 工程,创建完成后什么也不写,直接使用 Keil 对编写的程序进行编译,编译完成之后,软件最下方会提示编写的程序所占空间的大小。

STM32深入系列01——内存简述(Flash和SRAM)
也可以在工程目录中保存编译结果的文件夹中找到.map文件,在文件最下方查看更详细的信息。
STM32深入系列01——内存简述(Flash和SRAM)

3.2. 占用内存分析

数据类型解释:

  • Code:代码,也就是编译之后产生的机器指令。
  • RO_data:Read Only data,只读数据域,指程序中用到的只读数据,这些数据被存储在ROM区,因而程序不能修改其内容。C语言中const关键字定义的变量就是典型的RO-data。这部分在程序运行过程中不能被更改,因此在运行时只需要来读取即可,无需占用 RAM 空间。
  • RW_data:Read Write data,可读写数据域,指初始化为“非0值”的可读写数据,程序刚运行时,这些数据具有非0的初始值,且运行的时候它们会常驻在RAM区,因而应用程序可以修改其内容。C语言中定义的全局变量,且定义时赋予“非0值”给该变量进行初始化。
  • ZI_data:Zero Initialie data,即0初始化数据,它指初始化为“0值”的可读写数据域。它与RW-data的区别是程序刚运行时这些数据初始值全都为 0,而后续运行过程与RW-data的性质一样,它们也常驻在RAM区,因而应用程序可以更改其内容。例如C语言中使用定义的全局变量,且定义时赋予“ 0 值”给该变量进行初始化(若定义该变量时没有赋予初始值,编译器会把它当ZI-data来对待,初始化为 0);

再补充一个

  • ZI-data 的栈空间(Stack)及堆空间(Heap):在C语言中,函数内部定义的局部变量属于栈空间,进入函数的时候会向栈空间申请内存给局部变量,退出时释放局部变量,归还内存空间。而使用malloc动态分配的变量属于堆空间。在程序中的栈空间和堆空间都是属于ZI-data区域的,这些空间都会被初始值化为0值。编译器给出的ZI-data占用的空间值中包含了堆栈的大小(经实际测试,若程序中完全没有使用malloc动态申请堆空间,编译器会优化,不把堆空间计算在内)。

上述四种类型的数据占用内存情况如下:

  1. 在程序烧录完成之后如左图所示。Code + RO_data + RW_data(RO + RW)三种类型需要占用 Flash 空间。RAM不需要用到。
  2. 在程序运行时的情况如右图所示。Flash 的空间未发生变化;对于RAM的空间,程序启动时首先需要把 Flash 中的 RW_data(RW)复制到 RAM 中,然后把 ZI_data 加载到 RAM中。

STM32深入系列01——内存简述(Flash和SRAM)
对应到具体的内存上,结合启动流程如下图所示。
STM32深入系列01——内存简述(Flash和SRAM)
结论,想要让一个程序正常运行。

  • 芯片的 Flash 大小 要大于 Code + RO-data + RW-data 的大小;
  • 芯片的 RAM 大小 要大于 RW-data + ZI_data 的大小。

4. text、data、bss

上面分析了程序占用的 ROM 和 RAM 大小。然后分析一下数据或变量的存储位置。
STM32深入系列01——内存简述(Flash和SRAM)

图片来源:https://blog.csdn.net/wangguchao/article/details/119776738

程序编译后的内容包括:代码段(text)、数据段(data)、bss段、堆栈段(head stack) 。
其中:

  • text 段:存放代码程序的可执行指令
  • data 段:存放已被初始化的 全局变量 和 常量
  • bss 段:存放未被初始化的 全局变量

来自嵌入式软件工程师试题答案。

有时间了来补个案例。文章来源地址https://www.toymoban.com/news/detail-484575.html

到了这里,关于STM32深入系列01——内存简述(Flash和SRAM)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32快速复制MX25L1606E系列Flash

    去年做了一个使用RS485对PIC18F45K80系列单片机进行在线升级的程序,如果是小批量的出厂烧录程序和升级验证(出厂前肯定要测试单片机是否能正常读写Flash)是可以的,但是后来产品订单量很大,生产线的烧录及升级验证就很缓慢,主要是发送升级包这一步,主要原因如下:

    2024年01月16日
    浏览(33)
  • 嵌入式开发--STM32G4系列片上FLASH的读写

    这个玩意吧,说起来很简单,就是几行代码的事,但楞是折腾了我大半天时间才搞定。原因后面说,先看代码吧: 读操作很简单,以32位方式读取的时候是这样的: 需要注意的是,当以32位方式读取时,地址需要是4的整数倍,即32位。 8位或16位方式类似操作即可 需要注意的

    2024年01月18日
    浏览(49)
  • STM32的SRAM

    SRAM的介绍 STM32F407ZGT6自带了 192K字节的 SRAM。内存要求高的场合, STM32F4自带的这些内存就不够用了。 XM8A51216 是深圳星忆存储科技有限公司生产的一颗(512*16,即 1M 字节)容量的 CMOS 静态内存芯片。 啥是CMOS? 特点 该芯片具有如下几个特点: ⚫ 高速。具有最高访问速度 10

    2023年04月15日
    浏览(28)
  • 【STM32】FSMC——扩展外部SRAM

    🐱作者:一只大喵咪1201 🐱专栏:《STM32学习》 🔥格言: 你只管努力,剩下的交给时间! STM32控制器芯片内部有一定大小的SRAM及FLASH作为内存和程序存储空间,但当程序较大,内存和程序空间不足时,就需要在STM32芯片的外部扩展存储器了。STM32F103ZE系列芯片可以扩展外部

    2023年04月08日
    浏览(68)
  • 【STM32外设系列】NRF24L01无线收发模块

    🎀 文章作者:二土电子 🌸 关注公众号获取更多资料! 🐸 期待大家一起学习交流!   NRF24L01是NORDIC公司生产的一款工作在2.4GHz的无线收发模块,采用FSK调制,通常由频率发生器、增强型SchockBurstTM模式控制器、功率放大器、晶体放大器、调制器、解调器等组成,可以实现

    2024年03月26日
    浏览(41)
  • STM32复习笔记(五):FSMC连接外部SRAM

    目录 Preface: (一)原理相关 (二)CUBEMX配置 (三)轮询方式读写 (四)DMA方式读写 STM32F4有一个FSMC(Flexible Static Memory Controller,可变静态存储控制器),可以用来驱动8080接口的TFT LCD,我之前就写过一篇blog,是用FSMC来驱动4.3寸液晶屏;此外,还可以用FSMC来连接外部的各

    2024年02月03日
    浏览(35)
  • 【STM32】FSMC—扩展外部 SRAM 初步使用 1

    基于野火指南者《零死角玩转 STM32F103—指南者》的学习 STM32F103系列 1.详细功能参看《STM32F10x参考手册》,这边是概述 是一个外设,挂载在AHB总线下。 可以用于驱动包括 SRAM 、 NOR FLASH 以及 NAND FLSAH 类型的存储器,不能驱动如 SDRAM 这种动态的存储器 STM32F429 系列的控制器中,

    2024年02月20日
    浏览(28)
  • 【STM32外设系列】JW01三合一空气质量检测模块

    🎀 文章作者:二土电子 🌸 关注公众号获取更多资料! 🐸 期待大家一起学习交流!   首先我们看一下JW01的样子   值得注意的是,本文介绍的是三合一空气质量检测模块,能够检测空气中有机气态物质的浓度,同时也能检测甲醛和二氧化碳的浓度,该模块通过串口输

    2024年02月04日
    浏览(44)
  • STM32深入系列02——BootLoader分析与实现

    ==== 文章汇总 ==== 这个应该是最基本的方法,只要自己写过程序的应该都会,将编译生成的 hex 文件使用 ST-Link 工具或者 J-Link 工具直接下载进 Flash 即可。Keil中点击下载也能一键下载。 下载时可以看到地址是从 0x0800 0000 ,即 Flash 的起始地址开始下载的。 优点 :简单,插上下

    2024年02月02日
    浏览(32)
  • 解决keil-5中stm32f103系列使用ST-Link下载程序时不能连接的问题。“flash download failed ”

    出现的问题如下: 解决方法如下: 因为新版的Keil 加入了下载器的校验机制,所以我们需要替换掉新版编译器下的原文件 需要这个文件的评论下方留言记得留言哦。 一、解压后得到 STlink 文件夹,整个文件夹替换到 软件安装目录下 /ARM 处即可 二、更新下载器固件(更新一次

    2024年02月12日
    浏览(57)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包