转载:PIC18f的EEPROM阵列刷新是用来干什么的?

2020-02-06 10:14发布

18f的EEPROM阵列刷新是用来干什么的?
是不是说EEPROM擦/写了大概快10M次后,只要执行
阵列刷新,就可以再擦/写了10M次,如此循环?


D124   TREF   在刷新之前的总擦写周期数(2)   型值† 10M


2: 有关EEPROM 耐擦写能力的更多细节,请参见第7.8 节“ 使用数据EEPROM”


7.8 使用数据EEPROM
数据EEPROM 是高耐擦写周期,可字节寻址的阵列,
已对其进行优化,允许频繁地更改存储信息(例如,程
序变量或其他经常更新的数据)。更新频率通常要高于
D124 规范中的规定。如果情况并非如此,就必须执行
阵列刷新。因此,不常修改的变量(例如常数、ID 和校
准值等)应该存储在闪存程序存储器上。
例7-3 所示为简单的数据EEPROM 刷新程序。
例7-3: 数据EEPROM 刷新程序

CLRF EEADR ; Start at address 0
BCF EECON1, CFGS ; Set for memory
BCF EECON1, EEPGD ; Set for Data EEPROM
BCF INTCON, GIE ; Disable interrupts
BSF EECON1, WREN ; Enable writes
Loop ; Loop to refresh array
BSF EECON1, RD ; Read current address
MOVLW 55h ;
MOVWF EECON2 ; Write 55h
MOVLW 0AAh ;
MOVWF EECON2 ; Write 0AAh


BSF EECON1, WR ; Set WR bit to begin write
BTFSC EECON1, WR ; Wait for write to complete
BRA $-2
INCFSZ EEADR, F ; Increment address
BRA LOOP ; Not zero, do it again
BCF EECON1, WREN ; Disable writes
BSF INTCON, GIE ; Enable interrupts


注: 如果数据EEPROM 仅用于存储常数和/
或很少修改的数据,可能不必进行阵列刷
新。请参见D124 规范。
如果EEPROM中有些数据很少被改写,而另一些数据改写次数较频繁, 这些相对静态的、很少修改的数据就有可能被破坏掉。为了防止数据被破坏,就要周期性的刷新。
所以要避免周期性刷新,这些“configuration/calibration data”静态数据最好放在程序空间。

关于这个问题,在Microchip网站的英文论坛里也有过很多讨论,确实在理解上很容易混淆。综合了一些网上的讨论结果,总结如下。
1)EEPROM的工艺上,是用浮栅保存电子来记忆数据。当某个EEPROM单元保存了一个数据,如果你不再对EEPROM进行擦写操作,或者掉电,这个浮栅里的电子(也就是数据)能够保存大于40年时间。
2)如果某个EEPROM单元保存了固定数据,而你又对EEPROM的其他单元进行了擦写,在每次对其他单元的擦写时,都会在一定程度上影响那个保存固定数据的单元。这是所有EEPROM的共同特性。
3)正因为2)的影响,如果对于其他单元的擦写次数过多,那个保存固定数据的单元里的内容,有可能在一定其他单元擦写次数后发生改变。
4)如果对那个保存固定数据的单元进行了刷新(Refresh),方法是,把它单元里的内容读出来,再写回去。这样操作后,它就回到了最初状态,没有了之前擦写对它的影响。
5)在3)中提到的“对其他单元的一定擦写次数”之后,固定数据单元里的内容有可能发生改变。这里的“一定擦写次数”,参考数据手册是:如果只对一个字节擦写,是100K次。总共擦写次数是1M次。这就意味着,如果EEPROM里有某个单元数据几乎不变,你对其他单元擦写100K次之前,需要把那个不变化的单元至少刷新一次。(注意:具体参数以对应型号的数据手册为准, 这里提到的数字仅供参考.)
6)数据手册里建议把常数或很少改变的数据放到Flash程序空间里是非常正确的,这样就可以避免执行Refresh的过程。
7)如果你的设计对EEPROM的写入不会大于(单字节擦写100K次)或(总共1M次),可以不考虑Refesh的问题。(注意:具体参数以对应型号的数据手册为准, 这里提到的数字仅供参考.)
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。