OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 12346|回复: 6

关于EEPROM循环使用的方法

[复制链接]

32

主题

84

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
291
金钱
291
注册时间
2012-9-12
在线时间
18 小时
发表于 2013-3-9 20:17:18 | 显示全部楼层 |阅读模式
各位大侠,高手们
     最近遇到一个问题,写了一个程序用EEPROM存放数据,
     数据量不大但是一天内可能写的次数在20次左右。为了尽量提高使用寿命
     我想使整片EEPROM循环使用起来,但那样搜索范围变的比原来大很多了
     所以想将EEPROM分成块来使用,还是没想出来分块后具体怎么使用
      最近一直没想到一个好的方法,所以想请教一下各位大侠是怎么处理的?
    
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-3-10 00:16:03 | 显示全部楼层
用一个地址X(存放在eeprom)存储当前使用的EEPROM地址,每次上电,先读取X的值,然后读写都在X指向的地址操作,每次写完读一次,进行校验,如果校验正确,说明没写坏,如果不一致,说明本地址已经报废,写入下一个地址,并将新地址值写入X,如此,即可最大程度的使用EEPROM了...
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 2 反对 0

使用道具 举报

2

主题

1446

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
2256
金钱
2256
注册时间
2010-12-16
在线时间
206 小时
发表于 2013-3-10 00:23:33 | 显示全部楼层
所谓的磨损算法,是要多用CPU的了.

最简单的方法,把需要存储的数据和一个标志位合并起来存储.

如果不会用结构体,就假设LZ需要存储一个int的数据,即4字节,然后增加1个字节,作为标志位,和int一起存储.假设组合体的第一个字节是非零标志位,后面4字节是目标数据int.

区块算法:假设1kbyte的空间,一共可以存储1024/5=204个组合体.

初始化:第一次读取或写入,先找到指向最新数据的指针,即从头开始查找*(n*5),找出第一个标志位是不是有效标志位的指针,然后后退一个组合体长度5,此时可以找到最新数据的指针.

写入算法:当前指针增加一个组合体长度5,在新的指针的位置按顺序写入非零标志位和int.然后把再往后5个字节擦除.注意容量限制.EEPROM擦除后数据不等于标志位,所以可以作为初始化的参考.

读取算法:读取当前指针对应的后4个字节获得int.
技术讨论请发帖 , 需要我回复请点左下的 < 回复 > 让系统通知我 . 本人不通过其他方式返回任何参数.
回复 支持 反对

使用道具 举报

2

主题

1446

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
2256
金钱
2256
注册时间
2010-12-16
在线时间
206 小时
发表于 2013-3-10 00:31:23 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
这个方式有一个隐患,存储器失效并不是瞬时表现的,它本身表现为存储寿命的下降.

典型EEPROM的存储寿命是10yrs,擦除次数是100k,意思是厂家保证在100k次的擦写操作后,存储单元仍能保证有10yrs的存储寿命.

所以,通过1s内的存储寿命验证并不能确保数据的可靠性,网上有些所谓的"经过n*100*标称周期的擦写,仍能正确读出数据,所以这个这个参数可以放心过度使用"的"测评"本身是不全面的.
技术讨论请发帖 , 需要我回复请点左下的 < 回复 > 让系统通知我 . 本人不通过其他方式返回任何参数.
回复 支持 反对

使用道具 举报

2

主题

12

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
313
金钱
313
注册时间
2013-9-26
在线时间
30 小时
发表于 2017-3-14 11:28:04 | 显示全部楼层
正点原子 发表于 2013-3-10 00:16
用一个地址X(存放在eeprom)存储当前使用的EEPROM地址,每次上电,先读取X的值,然后读写都在X指向的地址操作, ...

万一存储地址的 块坏了怎么弄呢?还有怎么知道读出来的数据是可靠的?
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
9
金钱
9
注册时间
2018-11-7
在线时间
2 小时
发表于 2019-1-13 21:26:51 | 显示全部楼层
正点原子 发表于 2013-3-10 00:16
用一个地址X(存放在eeprom)存储当前使用的EEPROM地址,每次上电,先读取X的值,然后读写都在X指向的地址操作, ...

大佬你好,请问这个地址X是怎么把EEPROM后面的所有地址都指向的呢...单片机小白的疑问
回复 支持 反对

使用道具 举报

7

主题

199

帖子

0

精华

高级会员

Rank: 4

积分
711
金钱
711
注册时间
2017-5-20
在线时间
96 小时
发表于 2019-1-14 10:39:22 | 显示全部楼层
原子的方法挺好。
意思是设置地址区与数据区。比如地址区是首地址0,数据区是除了首地址所在扇区的其他扇区。地址区存储数据所在地址。每次存取数据之前,首先读地址区,查找(获取)数据所在位置。而如果想写数据,则需要先写后读,判断此数据是否还完好。如果不完好(此扇区坏了),就更改地址,同时要把地址记录在地址区。
此方法,一般来说,在地址扇区损坏之前,
数据扇区早已损坏完了。所以不必担心假如地址区坏的问题。。。(真担心那就把地址区扩大,也是写后读取,验证是否坏块。)
因为数据扇区损坏一次,地址扇区才会写一次。一个EEPROM能有多少个扇区?100K的擦除次数,代表100K个扇区,每个扇区4K,那是1.5GB了。那么大,基本都用TF卡了吧。


回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-23 07:27

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表