具有高耐久性的EEPROM


8

我目前在一个嵌入式项目中工作,其中有一个计数器将一直处于活动状态。如果断电,那么我还必须存储上一个计数器状态,并在下次启动时将其加载回去。因此,我打算使用EEPROM,在其中我将连续写入计数器值。但是我读过某个地方EEPROM具有大约100,000的读/写寿命,我将每24小时更新该计数器大约120,000。因此,我正在寻找替代方法来完成此任务。请给我您的建议。


4
使用较大的环氧树脂并进行流平处理吗?
PlasmaHH


6
可以使用RAM +掉电检测吗?那就是通常要做的。
Bryan Boettcher

1
EEPROM可能不是最合适的解决方案。除此之外,如果您的要求允许,您可以尝试降低写作的频率。另外,您可能希望对随机/运行地址进行写操作,而不要对同一地址进行写操作(当然,您必须提供一些能够在以后检索该地址的数据结构。)
Eugene Sh。

2
除了EEPROM或闪存外,还有其他类型的NVRAM。尝试搜索FRAM或MRAM芯片-这些芯片的耐用性要高几个数量级。
Turbo J

Answers:


12

另一种解决方案是使用带有非易失性FRAM的微控制器。FRAM的写入周期不受EEPROM的限制。

TI的某些MSP430产品可与FRAM一起使用,这是与您所描述的应用程序相似的链接:

具有FRAM的MSP430在电源故障时保存状态

这是有关FRAM的维基百科文章:FRAM


这根本不是解决方案,因为在电源故障时多字节写入仍将被破坏。还是您建议OP将自己限制为一个字节?
ultimA

1
@ultimA NVS库保证16位写入,OP未说明其计数器的大小。这只是一个例子,其他技术也可以允许存储较大的数据结构:非易失性存储(NVS):该库使非易失性数据的处理变得容易且健壮,可以防止间歇性断电或异步设备复位。具有FRAM非易失性存储器的MSP430器件可在所有情况下保证16位写入。通常,要存储的数据是较大的结构。NVS包含的功能可以确保在不损坏的情况下恢复最后一个有效条目,从而存储数据。
约翰D

5
FRAM是解决此问题的绝佳解决方案。我很高兴在这里看到一个建议使用它的答案。如果没有,我要写一个类似的答案。我使用FRAM的解决方案始终按顺序存储数据的两个副本。其中只有一个可能会损坏。FRAM的写入速度也比EEPROM快。数据的每个副本都需要一种验证其正确性的方法。可以使用简单的XOR CRC来完成,或者对于小型数据集,您可以简单地将数据及其补充存储在每个数据集中。在启动时,您只需检查所存储数据的哪个副本可以验证。
Michael Karas

顺便说一句,有些人在开玩笑地建议使用核心记忆。FRAM是该技术的现代版本,其工作方式类似于核心内存的操作方式。
迈克尔·卡拉斯

1
如果有足够的空间,可以通过许多简单的方法来保持计数器的安全更新。一种简单的方法是拥有计数器的两个副本以及一个副本对其有效的指示符。如果仅当两个副本均有效时才更改指示符,并且在更改任一副本代码之前将指示符设置为指示另一副本是有效的(并且在写入后将指示符设置为显示两个副本均有效),那么值的大小无关紧要从掉电期间正在写入的内容中读取数据。
超级猫

11

我在当前项目中有这个问题。

我处理它的方法是将计数器的实时值保留在RAM中。我添加了一些硬件,以便微控制器可以检测到原始输入电源电压低。如果是这样,它将停止正在执行的操作,将实时计数器值保存在EEPROM中,然后等待查看原始电源电压。如果它返回并带有一些滞后,则微控制器实际上会重新启动。否则,如果电源继续掉电,则微控制器最终将停止运转。下次重启时,计数器值从EEPROM加载,然后再次在RAM中实时使用,直到下次掉电为止。

将很小的值写入EEPROM不需要很长时间。现有电源系统很可能具有足够的能量存储,可以检测到电压变低,并且在微控制器的电源低于工作或EEPROM写入阈值之前,仍具有足够的保证运行时间。

在我的情况下,唯一的附加硬件是一个肖特基二极管,以防止直流电源在向下的途中从本地储能器中吸取电荷,并使用两个电阻作为分压器,以便微控制器可以读取原始输入电压。剩下的就是固件。

重要的是要注意,您应该注意最终电源为微型计算机供电的输入电压,而不是直接为微型计算机的电源电压供电。当后者变低时,可能为时已晚。希望有一个电压范围低于一切正常运行时的最坏情况,并且高于微控制器的电源以保证微控制器的稳压电压。在我的情况下,微控制器的电源是由48 V供电的降压稳压器,因此有很大的范围低于正常范围,但微控制器仍可以可靠地工作。


4

旧的旧的旧解决方案,cmos计数器+锂电池或Ram +锂电池。

存储元件的电源(如果有)来自正常电源,而没有电池。

许多现代的睡眠微控制器将以非常低的电流供应来维持其状态。因此,您可以将此技术与掉电检测一起进入睡眠状态,然后在主电源关闭时的睡眠期间使用电池维持状态。


2
甚至更老的解决方案是磁芯存储器。
glen_geek

只是想回答同样的问题:)这是使用datasheets.maximintegrated.com/en/ds/DS1307.pdf
匿名,

1
@glen_geek甚至我都不记得使用它。:)
RoyC

4

Microchip具有一系列I 2 C“ EERAM”部分,这些部分允许将数据存储在SRAM中,然后在断电时将其写入EEPROM(使用电容器中存储的能量),并在恢复供电时加载。这似乎对您的应用程序来说是完美的。

这些零件的代表示例是47L04


3

另一个解决方案。

检测掉电并使用超级电容或非超级电容将电源保持几毫秒。利用这段时间将您的计数器值写入EPROM。仅在掉电时写入EPROM。EPROM周期数=掉电周期数。


3

使用FRAM芯片,例如FM24C04B。它们具有极高的写入耐久性,并且是非易失性的。

https://www.mouser.com/ds/2/100/001-84446_FM24C04B_4_KBIT_512_X_8_SERIAL_I2C_F-RAM-477782.pdf

您也可以使用电池供电的SRAM(NVRAM)模块。例如M48Z02-150PC1

https://www.mouser.com/ds/2/389/m48z02-955115.pdf


我不知道其他地区,但在英国digikey是多少比为Mouser的FRAM部分便宜。而且,一如既往,只要您可以找到可以依靠的供应商(或者如果您只需要小规模经营并且可以与潜在的不信任供应商打交道),很多中国供应商就可以在很大程度上改善两种价格。
Jules

1

我决定使用“ ds1307 RTC”。因为它具有54byte的后备电源SRAM。这允许无限的读/写周期。


0

如果您的嵌入式项目上有NIC,则将您的计数器发送到远程计算机/服务器。看来24小时内有120,000次迭代,大约是0.72秒内一次迭代,对于网络流量来说应该可以。

服务器将始终存储计数器的最后一个值。功率损耗无计数器值损坏,因为需要发出有效的数据包以更新服务器上的值;但是需要持续的连接,或者必须设计特殊的超时协议。另外,作为奖励,如果需要,您将可以从远程控制设备。


1
如果要求实现帧计数器以防止重放攻击并以其他方式确保协议合规性,您将如何将该值发送给设备?

0

A)在关闭期间,使用100 µF或更大的电容器为计数器加电。或保持计数器值所需的任何逻辑。

B)使用磁芯存储器,它们可能很难设置。

C)制作一个电动机控制的电位器(例如伺服系统),在某个时候您的计数器会溢出,对吗?将其映射到360度。然后建立一个反馈回路,以便您可以数字方式设置电位计的值并以数字方式读取它。

D)每隔一分钟将您的计数器值发送到一个或多个服务器,并让它们在关闭时间为您记住该值。然后,一旦电源恢复供电,即可取回计数器值。


1
您甚至还可以购买核心内存吗?
BeB00

@ BeB00我不知道,那是我的时间。但是我将六角螺母用于2 mm的螺纹杆,有些导线像环形线圈一样缠绕在其中。-然后回到核心存储器常用的任何电路。我认为,当磁芯的磁滞方向相反并释放能量时,仅ADC就足以读取。
哈里·斯文森

我的意思是……也许作为一个实验会很有趣,但是我绝对不会在需要工作的系统中使用它
BeB00

@ BeB00 ebay.com/bhp/vintage-core-memory哦,好吧,如果有人想要高质量的产品,它似乎存在。
哈里·斯文森

:P我不确定60年的保修期
BeB00
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.