当前位置: 首页 > news >正文

STM32存储结构

我们在使用Keil编译程序成功后会,有一行各部分占用内存的提示信息,如下

Program Size:Code=7492 RO-data=556 Rw-data=72 ZI-data=11688,这是stm32代码编译后的提示

我们分析一下这个编译输出:

- Code: 7492字节 -> 代码部分(存放在Flash)

- RO-data: 556字节 -> 只读数据(存放在Flash)

- RW-data: 72字节 -> 已初始化的读写数据(在Flash中存储初始值,运行时拷贝到RAM)

- ZI-data: 11688字节 -> 未初始化的数据(运行时在RAM中初始化为零)

所以,占用Flash的空间为:Code + RO-data + RW-data(因为RW-data的初始值需要存储在Flash中) 即:7492 + 556 + 72 = 8120字节 ,但是注意,ZI-data不占用Flash空间,因为它只需要在程序运行时在RAM中分配并初始化为零。

因此,这个程序占用的Flash空间为8120字节。 另外,程序运行时占用的RAM空间为:RW-data + ZI-data = 72 + 11688 = 11760字节。

总结:

 Flash占用:8120字节  约7.93KB

 RAM占用:11760字节  约11.48kB

并且我们在购买单片机的时候会经常看到一下字样,Flash ,RAM等今天我们将解密他们究竟是什么

简单来说:

  • Flash大小:决定了你的程序代码能写多大,以及能存储多少常量数据(如图片、字体等)。如果你的程序很大,就要选Flash大的型号。

  • RAM大小:决定了你的程序运行时能同时使用多少变量和数据。如果你的程序需要处理大量数据、有很多全局变量、或者使用了复杂的算法和递归,就需要更大的RAM。RAM不足是导致程序莫名崩溃的常见原因。

要想深入了解这些东西 需要我们对STM32存储器划分结构有一定了解

STM32的存储器结构采用了哈佛架构(Harvard Architecture),这意味着程序存储器(Flash)和数据存储器(RAM)在物理上是分开的并且有独立的地址总线和数据通路,这使得CPU可以同时取指和访问数据,提高了执行效率。

地址划分

Flash

(ROM)

0x0800 0000-程序存储器存储C语言编译之后的代码
0x1FFF F000-系统存储器存储BootLoader,用于串口下载
0x1FFF F800-选项字节存储一些独立于代码的配置参数
RAM0x2000 0000-运行内存SRAM存储运行中的临时变量
0x4000 0000-外设寄存器存储各个外设的配置参数
0xE000 0000-内核外设寄存器存储内核各个外设的配置参数

当芯片手册上标称 “64KB Flash” 时,这个总容量通常包含了主Flash、系统存储器和选项字节等所有部分。需要查阅芯片的内存映射图来了解具体是如何划分的。例如,一颗62KB Flash的STM32芯片,其内存映射可能是:62KB的主Flash + 2KB的系统存储器 + 一小部分(如16字节)的选项字节。

什么是Flash和RAM?

1.Flash (闪存)

  • 它是什么:是一种非易失性存储器。意思是即使断电,里面存储的数据也不会丢失。

  • 在办公室比喻中:它就是你的文件柜。你把不经常用但很重要的东西(比如项目文档、参考资料、年度报告)长期存放在这里。

  • 在单片机中的作用:

    • 存储程序代码:你编写好的程序,经过编译后生成的机器码,就永久地烧录(存储)在Flash中。单片机一上电,就从这里读取指令来执行。

    • 存储常量数据:比如固定的字体、图片、音乐数据、配置参数等只读不写的数据。

  • 特点速度较慢(相比RAM)、容量较大(相比RAM)、断电数据不丢失可擦写(但次数有限,通常10万次以上)。

简单记:Flash是放程序的地方,断电还在

2. RAM (随机存取存储器)

  • 它是什么:是一种易失性存储器。意思是只有在通电时才能保持数据,一旦断电,里面的所有数据都会丢失。

  • 在办公室比喻中:它就是你的办公桌面。你正在处理的文件、临时记下的笔记、计算中的草稿纸都放在桌面上。这些东西只是暂时用一下,工作结束就收走或扔掉。

  • 在单片机中的作用:

    • 存储变量:程序运行中产生的临时变量、中间计算结果、函数调用的堆栈等都放在RAM里。

    • 动态内存分配:像malloc()new申请的内存空间,也位于RAM中。

  • 特点速度极快容量较小(在单片机里通常是KB级别)、断电数据丢失可无限次读写

简单记:RAM是程序运行时的临时工作区,断电就清空。

了解完什么是Flash我们来看看STM32的Flash划分了那几部分

1. 主Flash存储器 (Main Flash Memory)

  • 位置:Flash的绝大部分区域。

  • 功能:这就是我们通常说的“Flash”,用来存储你编写的应用程序代码常量数据

  • 权限:用户程序可以自由地读取这里的数据。在允许自我编程(IAP)的单片机上,用户程序也可以擦写这个区域(比如用于固件升级)。

  • 比喻:大楼里开放的办公区域,员工可以自由进出和使用。

2. 系统存储器 (System Memory)

  • 位置:Flash中一段固定的、出厂前预设好的区域。

  • 功能:里面存储的是芯片制造商预先烧录好的Bootloader程序。这个Bootloader通常是用于通过某种串行接口(如USART, USB, CAN等)来下载用户程序到主Flash存储器。最常见的例子就是STM32的USB DFUUART烧录功能。你选择从“系统存储器启动”时,芯片就会运行这里的程序。

  • 权限:这段区域是只读的。用户无法修改或擦除这里的内容,这是芯片厂商写死的,为了防止用户误操作导致芯片“变砖”。

  • 比喻:大楼里一个上了锁的机房,里面放着大楼的基础控制系统(如消防、供电)。只有大楼管理员(芯片厂商)有钥匙,普通员工(用户)只能使用它提供的功能(比如通过它来部署新程序),但不能改动里面的设备。

3. 选项字节 (Option Bytes)

  • 位置:Flash中一个非常小但极其重要的特殊区域。

  • 功能:它不是用来存储程序或数据的,而是用来配置单片机的硬件特性的,可以看作是芯片的“配置开关”。常见的配置包括:

    • 读写保护:给主Flash上锁,防止别人通过调试器读取或抄袭你的程序代码。

    • 写保护:保护Flash的某些扇区不被意外擦写。

    • 硬件看门狗:配置看门狗是硬件开启还是软件开启。

    • 复位级别:配置NRST引脚是作为复位引脚还是普通IO。

    • 启动配置:决定芯片上电后从主Flash、系统存储器还是RAM启动。

  • 权限:用户可以通过特定的编程流程(通常需要先解锁)来修改选项字节。修改后需要触发一个系统复位才能生效。

  • 比喻:大楼总电箱里的那些开关和保险丝。它们不参与日常办公,但决定了整个大楼的用电安全、照明方式等基础设置。改动它们需要谨慎并有特定权限。

4. Bootloader (引导加载程序)

  • 概念:这是一个程序,而不是一个存储区域。它是一段特殊的代码,负责在单片机正式运行用户主程序之前,完成一些初始化工作,或者决定从哪里、如何加载主程序。

  • 存放位置:它可能存放在两个地方:

    1. 系统存储器:即芯片厂商自带的,如上所述。

    2. 主Flash存储器:用户自己编写的Bootloader。比如你想通过网络来升级固件,你就可以自己写一个更强大的Bootloader,把它放在主Flash的开头部分。芯片上电后先运行你的Bootloader,你的Bootloader再决定是跳转到主应用程序,还是进入升级模式。

  • 比喻:大楼的前台接待员或门卫。每天早上(上电后),他先到岗,检查今天有没有新的快递(新的固件包)要接收,或者决定是让员工直接进入办公区(跳转到主程序),还是先组织一个安全会议(系统配置)。

RAM内存布局示例

http://www.xdnf.cn/news/1331137.html

相关文章:

  • 【JavaEE】多线程(线程安全问题)
  • 中国大学MOOC-C语言第九周指针(上)
  • 数据结构:利用旋转在AVL树中维持平衡(Inserting in AVL with Rotation)
  • 自建开发工具IDE(一)之拖找排版—仙盟创梦IDE
  • RabbitMQ 基础
  • 吱吱企业通讯软件保证内部通讯安全,搭建数字安全体系
  • Windows 中的“计数器”
  • TDengine IDMP 运维指南(数据导入导出)
  • 第三阶段数据-3:数据库脚本生成,备份与还原,分离与附加
  • RabbitMQ:SpringAMQP Topic Exchange(主题交换机)
  • Oracle:配置让插入语句时id自动输入
  • 生产环境MongoDB分片策略优化与故障排查实战经验分享
  • 翻译记忆库(TMX)与机器翻译的结合应用
  • ​​pytest+yaml+allure接口自动化测试框架
  • 计算机视觉(二)------OpenCV图像视频操作进阶:从原理到实战
  • MYSQL-增删查改CRUD
  • 遥感机器学习入门实战教程|Sklearn 案例④ :多分类器对比(SVM / RF / kNN / Logistic...)
  • 【C++】--指针与引用深入解析和对比
  • 2025 | 腾讯混元RLVMR颠覆强化学习:可验证推理奖励引爆AI智能体新范式!
  • 文本智能抽取:如何用NLP从海量文本中“炼“出真金?-告别无效阅读,让AI成为你的“信息炼金师
  • git 生成 Patch 和打 Patch
  • 在完全没有无线网络(Wi-Fi)和移动网络(蜂窝数据)的环境下,使用安卓平板,通过USB数据线(而不是Wi-Fi)来控制电脑(版本2)
  • 汽车ECU实现数据安全存储(机密性保护)的一种方案
  • 网页作品惊艳亮相!这个浪浪山小妖怪网站太治愈了!
  • uni-app跨端开发最后一公里:详解应用上架各大应用商店全流程
  • 云计算学习100天-第26天
  • 《CDN加速的安全隐患与解决办法:如何构建更安全的网络加速体系》
  • 【Ansible】变量、机密、事实
  • Ubuntu-安装Epics Archiver Appliance教程
  • ansible playbook 实战案例roles | 实现基于firewalld添加端口