总结一下引起AVR内部EEPROM数据丢掉的原因:
1.程序问题;
2.程序跑飞;
3.EEPROM相关寄存器因强磁场、高压静电等外部搅扰犯错所发生的写入动作;
4.体系有很大的理性负载,在断电的时分会发生一个反向高压,EEPROM有或许会自擦除。
……(还有什么原因,欢迎咱们持续罗列,以便完善及想办法处理)
针对问题1,程序问题不再该文评论范围内。
针对问题2,程序跑飞,这个因该是引起EEPROM数据丢掉的主要原因。可是引起程序跑飞的原因却是多方面的。
榜首.电压不正常,作业不稳定,程序跑飞。针对这个问题,能够敞开内部BOD、或许外加复位芯片处理,在低功耗场合,外部复位是有必
要的,究竟BOD功耗太高。
第二,晶体振动受搅扰,频率不稳定,程序跑飞。针对这个问题,主张晶体运用全幅振动,而且走线的时分尽量短,而且运用地线阻隔。
第三体系受外界环境搅扰,修正了PC等寄存器,程序跑飞。针对这个搅扰问题,这个引起程序跑飞的或许性应该不大,假如环境真实恶劣
,那么就应该想到做电磁屏蔽,ESD维护等,假如还不可,那么只能主张换换其他单片机试试看了。
针对问题3,咱们只能优化电路设置,尽量避免,比方加屏蔽罩,加ESD维护,加TVS维护,电源加电容退耦等等。
针对问题4,假如体系真的具有很大的理性负载,那么请注意加续流二极管、滤波电容等做维护,不要让这种反向高压发生,无论如何,这
种由于理性负载忽然断电自激发生的高压,不仅仅会对EEPROM有影响,而是对整个体系都存在要挟。
==============================================================================================================
通过上面硬件上的一些处理,尽管EEPROM数据丢
失的或许现已很小了,可是咱们依然不能确保EEPROM数据就不会丢掉了。这时EEPROM数据的可*性,那就得从软件上去考虑了,接着咱们从
软件的方面持续评论。
我的做法是,数据分块,分区,校验,备份。当然这儿讲的处理办法,仅仅是供给一种主意,你能够做不同数据长度的分块,不同巨细的
分区,选用不同的地址映射办法,以及选用更屡次的数据备份。下面以Mega168为例持续评论。
1.Mega168EEPROM512字节,把EEPROM分为两个区,每个区256个字节,然后以8个字节为一个段,那么每个区就有32段。
数据区:0x000-0x0FF
0段:0x000-0x007
1段:0x008-0x00F
……
31段:0x0F8-0x0FF
备份区:0x100-0x1FF
每个段8个字节,其间前6个字节为有用数据,后2个字节为CRC16校验,数据格式下图所示:
2.EEPROM读写操作
EEPROM的操作以段为单位,
段写入函数:写数据到数据区时,先核算数据CRC16校验,然后一起把数据写入到数据区和备份区;
段读取函数:读取数据时,一起读取数据区以及备份区,假如数据区校验有误,备份区数据校验正确,就用备份区数据康复数据区数据;
假如备份区数据有误,数据区数据正确,那么数据写入备份区从头备份;假如数据区备份区数据都有误,那么回来读取失利。
3.数据区与备份区的对应联系
数据读写操作以段进行,内部的数据区与备份区怎样映射呢?为了防治数据与备份一起被意外修正,那么数据与备份地址空间相隔不能太
近,而且数据与备份的地址,应该尽量不同。假定数据地址为Data_Addr,备份地址为Bakup_Addr,我运用下面的函数映射地址:
Bakup_Addr=(Data_Addr+0x100)^0x03F
加0x100是把地址界说到备份区,与0x03F异或,是把低6bits取反,这样处理,数据与备份的地址空间较远,而且地址有7bits的不同。
例如,第3段的地址:0x018-0x01F,
对应的备份区为:0x127-0x120
如下图所示:
4.读写函数参加写维护判别,在读写EEPROM前封闭写维护,读写结束后,当即敞开写维护,这样能够有用避免程序跑飞形成的EEPROM意外修正
。
5.第0块主张制止运用。