产品概述

单片机flash存储 一篇文章讲透单片机的RAM和FLASH

小编 2025-06-27 产品概述 23 0

一篇文章讲透单片机的RAM和FLASH

最近在一个问答社区回答了一个问题,关于单片机存储器的,于是有了想专门写一篇关于单片机存储器的想法。作为单片机内部一个重要组成部分,存储器占有很重要的地位,今天就来聊聊我对于单片机的内部存储器RAM和FLASH的一些认识和理解。

1、先聊聊存储器

存储器是单片机结构的重要组成部分,存储器是用来存储编译好的程序代码和数据的,有了存储器单片机系统才具有记忆功能。按照存储介质的特性,可以分“易失性存储器”和“非易失性存储器”两类。易失性存储器断电后,里面存储的内容会丢失;非易失性存储器断电后,数据可以依然保持。

存储器分类

2、单片机的存储器

如下图所示是STM32F103RB系列单片机所使用的存储器大小,Flash为128KB,RAM为20KB,这里的RAM是指SRAM。

STM32F103RB内存大小

这两个存储器的寄存器输入输出端口被组织在同一个4GB的虚拟线性地址空间内。可访问的存储器空间被分成8个主要块,每个块为512MB。Flash用来存储编译好的程序文件,SRAM用来存储运行程序时所创建的临时数据。所以如果不加入外置存储器,那么程序里的东西就会出现在这两个存储器中。

下图为STM32F103RB单片机的内存映射图(部分),可以看到画红圈的两个就是SRAM和Flash存储器。不知道大家有没有注意,当使用J-Flash软件给stm32下载bin文件的时候需要填写起始地址,那个0x08000000其实就是Flash存储器的起始地址。

STM32F103内存映射图

3、关于编译器生成的文件

如果你玩过单片机,那你应该对Keil这款软件不会感到陌生,下图是我的那款OLED时钟的软件用Keil编译后的编译信息。

KEIL编译信息

很多人并不一定知道Program Size的含义,我来给大家解释一下。

Code: 是程序中代码所占字节大小;

RO-data: 程序只读的变量,也就是带const的,和已初始化的字符串等;

RW-data: 已初始化的可读写全局/静态变量;

ZI-data: 未初始化的可读写全局/静态变量;

那么这个程序占用的Flash存储器的空间大小是多少呢?程序所占Flash空间大小=Code+RO data+RW data=生成的bin文件大小

那么这个程序占用的SRAM存储器的空间大小是多少呢?程序固定占用RAM大小=RW data+ZI data

这些信息除了在编译器下方的信息栏里面看到,也可以在项目文件里的.map文件的最下面找到,如下图:

.map文件信息

4、数据在存储器上的存储结构

程序在Flash上的存储结构如下图所示,通过阅读hex文件和MDK下调试综合提炼出来的。其中,ZI-data对应未初始化数据段,RW-data对应已初始化数据段,Code对应代码段。

STM32的Flash存储结构

数据在SRAM上的结构,如下图所示。这部分大家可以参考上面的内存映射图来理解。

STM32的SRAM存储结构

5、总结

至此我相信大家应该对stm32单片机的内部存储有了更进一步的认识。其实如果想更深入的了解单片机的运行轨迹,我建议大家来详细研究一下stm32单片机的上电内存读取过程,如果搞明白了这块收获会是非常大的。后面有机会我也会对这块进行深入的总结,并整理成文章发出来,与大家一起分享。

单片机FLASH存储算法浅谈

一般32位单片机没有自带EEROM, 而是有相对丰富的FLASH,但是写FLASH之前必须先做擦除操作才能写入,一般按页擦除,且擦除寿命在10000次左右,因此,需要加一些读写算法,来避免经常性的擦除动作,提高FLASH的寿命。

我们可以开辟一片空间来做相应的处理,假设留出2K【2页】空间做存储。首先根据总存储区长度hislen和每次写入的数据长度datalen,计算出擦除一次可以写入数据的次数n, n = hislen/(datalen + 4 ),如果一次性按照64字节写入,每次写FLASH之前读取4字节校验码,并读取64字节数据计算出校验码,比对不成功后,则确定下来写入的索引值w_index,则进行数据写入以及将本次写入的数据进行计算,将校验值写入校验区,任何一次写入失败,都将w_index清0,FLASH存储BANK1擦除,重新写FLASH, 写到索引为0的位置,成功写入数据和校验后,再将BANK2擦除,具体流程图如下图:

FLASH存储结构如下所示:

读数据时,则从n开始,反向开始查找校验值和数据,并计算出数据校验值, 与校验区数据对比,校验通过则确定出索引值r_index, 则可以计算出地址,取出最新正确的数据。

实际开发中,需要确定可以用来数据存储的最大FLASH空间hislen,以及一次性需要存储的数据长度datalen, hislen越大,datalen越小,则FLASH使用寿命相对越长。

实现策略已介绍完毕,具体代码可自行实现,有需要参考代码的可联系博主。

相关问答

单片机 中数据怎样存入 flash ?

1可以考虑外接EEPROM如AT24C02等,这个事目前使用最广的一种方式2有一部分芯片内带EEPROM,如PIC的单片机大部分都带3目前有部分单片机支持对自带的闪存进行...

单片机 内的ROM和RAM如何储存程序与数据?

ROM一般用户只读不存(部份FLASH单片机的ROM可以由特殊指令进行先擦除,再改写存储),ROM掉电后数据不会丢失;RAM在上电后可由用户随意存取,但掉电后数据丢失...

请教 单片机 掉电后,如何快速的保存数据问题?

针对题主的问题,我想应该从以下几个方面入手:尽量选用内部的flash来存储数据,内部flash的读写速度快,可靠性高。如果用外置的flash或者是eeprom进行存...MCU供...

单片机 中程序已经下到 flash 中了,请问eeprom的作用是什么?

确实现在单片机eeprom和flash都差不多,象STC的单片机eeprom就是flash的一部分,只不过有的是单独作为一个存储空间,有的是和程序存储器共用的,程序存储器用不...

关于 单片机存储器 的问题,idata,data,badata,xdata,pdata,cod...

关于51单片机内存问题,一直是个疑惑大家的问题,因为51单片机是个很另类的单片机。下面我给楼主讲解一下:51单片机之所以另类,是因为,他寻址内存的空间,不是靠...

单片机 节日彩灯课程设计,从两边向中间点亮依次循环不止。亮灭时间为0.25S,用一个开关控制彩灯的工作?

/*程序详细功能介绍:*利用取表的方法,使端口P1做单一灯的变化:左移2次,右移2次,闪烁2次(延时的时间0.2秒)。*在用表格进行程序设计的时候,要用以下的...OR...

51 单片机 的程序在哪里跑, flash ?还是ram?-ZOL问答

4条回答:【推荐答案】51单片机的程序是在FLASH中跑的。51的存储结构是哈佛结构,也就是说ROM和RAM是分别寻址的,两者是无法混合在一起的。有些单片机的ROM和RAM是...

单片机flash 和ram/ROM的不同-ZOL问答

单片机的ROM,叫只读程序存储器,是FLASH存储器构成的,如U盘就是FLASH存储器。所以,FLASH和ROM是同义的。单片机的程序,就是写到FLASH中了。而RAM是...

单片机 C语言设置变量 存储 在什么地方?

变量在RAM。RAM是数据存储器,用来保存运行中的数据,掉电后数据消失。EEPROM跟FLASH都是程序存储器,保存程序代码跟不分配内存的常量,两者的区别在于写入方式...

flash 读取会导致数据丢失吗?

1、用户代码对Flash的误操作不当引起程序丢失或被错误改写例如,在有对Flash写入或擦除操作的代码中,如果用户误调用了写入或擦除函数或者由于程序跑飞而恰好...

猜你喜欢