电子说
一、
stm32的FLASH擦除是按整页或者整扇区擦除的,不同芯片的页或者扇区(下边统称为页)的大小是不一样的,有1K,16K,64K,128K等大小。
现在我们想要 存3个不同16bit变量的数据,1秒存一次 ,如果不做任何算法,将这3个变量存到3个不同的页的16bit地址,每次更改变量内容都要擦除一次整页(但是我们只使用了16bit的空间),根据芯片数据手册可知,保证性能的情况下flash最少擦除次数为10K,1万次。
我们就按1万次计算,理论上不到3小时我们使用的16bit地址就有损坏的风险。而且要存储的变量个数也有限,我们芯片不可能有那么多页,H7系列也就16页。所以需要一些算法处理,充分利用页的空间。
二、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个状态:
根据官方提供的这个表,结合程序看,逻辑就很清晰了。
推荐看此表的顺序:自上而下,从左到右。先看同一列,自上而下,再看不同列,从左到右。一定要结合程序实际过一遍,那样更深刻。
注:page0格式化是指,将page0设置为VALID_PAGE状态。
全部0条评论
快来发表一下你的评论吧 !