如何提高FLASH使用寿命以实现EEPROM的功能呢 ?

电子说

1.2w人已加入

描述

一、

stm32的FLASH擦除是按整页或者整扇区擦除的,不同芯片的页或者扇区(下边统称为页)的大小是不一样的,有1K,16K,64K,128K等大小。

现在我们想要 存3个不同16bit变量的数据,1秒存一次 ,如果不做任何算法,将这3个变量存到3个不同的页的16bit地址,每次更改变量内容都要擦除一次整页(但是我们只使用了16bit的空间),根据芯片数据手册可知,保证性能的情况下flash最少擦除次数为10K,1万次。

我们就按1万次计算,理论上不到3小时我们使用的16bit地址就有损坏的风险。而且要存储的变量个数也有限,我们芯片不可能有那么多页,H7系列也就16页。所以需要一些算法处理,充分利用页的空间。

Flash存储

二、EEPROM组件原理分析

还是上边说的存储情况,存3个不同16bit变量的数据,1秒存一次。

先说一下其大致思路,开辟两块连续大小相同的页,分别为page0,page1,假如我们选用F4的芯片,选用第2页和第3页,均为16K。每个变量分配一个16bit的虚拟地址,同16bit数据一起存储,虚拟地址为了读取数据方便。

三个变量首先在page0存储,存满page0之后,将这3个变量最新的数据复制到page1,然后擦除page0,接下来在page1中存储,page1存满之后,将3个变量最新的数据复制到page0,然后擦除page1,就这样循环存储。

我们粗略的计算一下保证flash的可靠性的前提下,可以使用的时间,2个页共32K,也就是每存32K的数据,page0,page1各擦除一次,我们存的是16bit数据+16bit的虚拟地址,那就是每存8K的16bit数据,page0,page1各擦除一次,这是3个变量,那么每个变量平均存2730次时,擦除一次页,flash擦除寿命按1万次计算,16bit变量1秒存一次,可以存2730100001秒=>7583小时=>315天,这是每天不间断的使用,如果每天只使用8小时,大概可以使用2.5年。如果每天使用8小时,变量每10秒存一次,大概可以使用25年。这样就充分利用了页空间。

这里需要注意变量个数,和存储周期,如果周期太快或者变量个数太多,可以增加页,如果增加页还是不满足,那就只能加专用存储芯片了。

下面看一下具体是怎么实现的:

每个页都有3个状态:

  • ERASED:当期页已擦除。
  • RECEIVE_DATA:页正在从另一个满页接收(复制)数据。
  • VALID_PAGE:页中包含有效数据,并且在将所有有效数据完全传输到已擦除页之前,此状态不会改变。

根据官方提供的这个表,结合程序看,逻辑就很清晰了。

Flash存储

推荐看此表的顺序:自上而下,从左到右。先看同一列,自上而下,再看不同列,从左到右。一定要结合程序实际过一遍,那样更深刻。

注:page0格式化是指,将page0设置为VALID_PAGE状态。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分