amobbs.com 阿莫电子技术论坛

标题: 操作eepROM时单片机掉电问题 [打印本页]

作者: stirwl    时间: 2013-10-3 09:41
标题: 操作eepROM时单片机掉电问题
最近用的STC15F204EA,本来程序会在eepROM里保存数据的,测试的时候发现断几次电之后会有程序无法运行的情况,会不会是eepROM没有操作完成就返回导致单片机程序一直卡在eepROM中无法重新开始运行?
如果是这样的话,除了使用掉电检测电路,还有其他方法避免这个问题吗?
作者: whatcanitbe    时间: 2013-10-3 09:52
上部分代码看看
作者: stirwl    时间: 2013-10-3 09:54
whatcanitbe 发表于 2013-10-3 09:52
上部分代码看看

代码很长……
感觉应该就是操作eepROM时掉电导致程序无法返回。但又懒得加硬件断电检测
作者: whatcanitbe    时间: 2013-10-3 11:46
如果你的程序是一直写EEPROM的话就会出现这样的问题

不想贴代码的话,可以说说你的程序是在什么时候会写EEPROM的
作者: electrlife    时间: 2013-10-3 18:26
eep操作应考虑掉电处理,上掉电应复位芯片防止程序跑飞更改eeprom。我一般使用备份区域来解决写eeorom时掉电问题。
作者: stirwl    时间: 2013-10-5 17:06
whatcanitbe 发表于 2013-10-3 11:46
如果你的程序是一直写EEPROM的话就会出现这样的问题

不想贴代码的话,可以说说你的程序是在什么时候会写EE ...

程序每次修改特定参数都会修改eepROM,
如果在操作eepROM时掉电会不会程序一直无法返回?
作者: stirwl    时间: 2013-10-5 17:08
electrlife 发表于 2013-10-3 18:26
eep操作应考虑掉电处理,上掉电应复位芯片防止程序跑飞更改eeprom。我一般使用备份区域来解决写eeorom时掉 ...

刚做了个掉电检测电路,掉电时产生中断,然后用法拉电容的能量在eepROM中保存数据,这样应该不会有问题了吧
作者: dadongleilei    时间: 2013-10-7 13:29
另外 EEPROM操作程序也应该做个超时处理吧,不应该出错的话 永远卡死在那里;再者如果程序不出来,看门狗不复位吗
作者: whatcanitbe    时间: 2013-10-8 09:42
stirwl 发表于 2013-10-5 17:06
程序每次修改特定参数都会修改eepROM,
如果在操作eepROM时掉电会不会程序一直无法返回? ...

问题
1)你是不是在写参数的时候掉过电
2)关机的时候会不会有写EEPROM啊
作者: stirwl    时间: 2013-10-9 22:50
whatcanitbe 发表于 2013-10-8 09:42
问题
1)你是不是在写参数的时候掉过电
2)关机的时候会不会有写EEPROM啊 ...

确实有可能呢,毕竟掉电时随机的
作者: stirwl    时间: 2013-10-9 22:51
dadongleilei 发表于 2013-10-7 13:29
另外 EEPROM操作程序也应该做个超时处理吧,不应该出错的话 永远卡死在那里;再者如果程序不出来,看门狗不 ...

这个程序不能开看门狗的
eepROM就是设置好参数然后等待eepROM返回啊。
可能问题不是eepROM函数没有返回,而是操作eepROM时掉电导致的问题
作者: schwarz    时间: 2013-10-9 23:00
不加掉电检测的话,我的方案是备份两套数据,每套数据都有效验码,如果你的cpu够强就做过md5,不行就用CRC32之类的,上电后验证效验码,如果某套数据不能通过验证就用另一套数据覆盖掉。
作者: whatcanitbe    时间: 2013-10-9 23:13
stirwl 发表于 2013-10-9 22:50
确实有可能呢,毕竟掉电时随机的

那软件上基本无解


作者: stirwl    时间: 2013-10-10 13:06
whatcanitbe 发表于 2013-10-9 23:13
那软件上基本无解

恩,又加了个断电检测电路上去,现在好多了
作者: stirwl    时间: 2013-10-10 13:08
schwarz 发表于 2013-10-9 23:00
不加掉电检测的话,我的方案是备份两套数据,每套数据都有效验码,如果你的cpu够强就做过md5,不行就用CRC3 ...

恩,加掉电检测了,懒得去写crc的程序,md5就更不用说了……
还有,我发现经常操作eepROM很容易导致程序错误,难道是操作eepROM时误写了程序区?按说程序写eepROM是写不了程序区的,很奇怪的问题
作者: whatcanitbe    时间: 2013-10-10 19:22
stirwl 发表于 2013-10-10 13:08
恩,加掉电检测了,懒得去写crc的程序,md5就更不用说了……
还有,我发现经常操作eepROM很容易导致程序 ...

EEPROM写入次数多了是会被写坏的.还有我碰到有些EEPROM本身就有坏的

软件上有个比较笨的解决办法,适合存储渐变的变量 ,比如产品的产量
每次写入同时写入3个位置  地址a=mData,  地址a+1=mData,地址a+2=mData
读的时候,读三个位置的值

根据三个值得大小关系可以判断出正确的值
作者: tragedy    时间: 2013-10-11 23:31
好像出现过的。
作者: zyw19987    时间: 2013-10-11 23:54
本帖最后由 zyw19987 于 2013-10-11 23:57 编辑

说说真正的数据管理方法。
把你要写的数据定义成一个块(可以用结构体来表示)块的最后两个字节是这个块所有数据的CRC校验结果,定义另外一个块叫备份区,每次写数据时是先写备份块,然后写数据块。记住是整块写,上电时看数据块数据是否正常(通过对块数据进行校验后和块的最后两字节比较)如果正常就往下执行,如果不正常就将备份块拷贝到数据块。保证系统不会死,不会乱跑。
分析:1、保存数据时写备份块时断电,从新上电时原来的数据块任然是之前的,系统不会乱。
       2、保存数据是备份块写完了,写数据块时断电,从新上电时会将备份块拷贝到数据块中,保证系统参数正常。
缺点,多一个备份块,写备份块断电的情况下,只能保证数据是上次的数据。
优点,不管何时出现断电,系统参数永远都会是合法的,不会出现非法数据而导致系统乱判断。
作者: McuPlayer    时间: 2013-10-12 00:31
楼上说的好,这其实就是数据完整性的问题

1、写错了数据,对方一定要能识别出来
2、识别数据出错后,应有后备方案,比如使用Default参数,备份参数
作者: stirwl    时间: 2013-10-13 10:13
whatcanitbe 发表于 2013-10-10 19:22
EEPROM写入次数多了是会被写坏的.还有我碰到有些EEPROM本身就有坏的

软件上有个比较笨的解决办法,适合 ...

……还有本来就坏的
那岂不是很不靠谱儿
恩,同时在几个位置存储确实不错呢
作者: stirwl    时间: 2013-10-13 10:14
tragedy 发表于 2013-10-11 23:31
好像出现过的。

发帖之前搜了一下,没搜到相关问题的哎
作者: stirwl    时间: 2013-10-13 10:20
zyw19987 发表于 2013-10-11 23:54
说说真正的数据管理方法。
把你要写的数据定义成一个块(可以用结构体来表示)块的最后两个字节是这个块所 ...

恩,这样确实可以解决写数据时掉电的数据都是问题,
唯一的缺点就是写备份块断电的那系统本次开机所做的工作就付诸东流了……
作者: stirwl    时间: 2013-10-13 10:22
McuPlayer 发表于 2013-10-12 00:31
楼上说的好,这其实就是数据完整性的问题

1、写错了数据,对方一定要能识别出来

恩,楼上的方法确实可以解决掉电时数据错乱的情况,唯一的问题就是如果没有保存数据,那系统本次开机所做的工作就付诸东流了
作者: zyw19987    时间: 2013-10-14 09:05
stirwl 发表于 2013-10-13 10:20
恩,这样确实可以解决写数据时掉电的数据都是问题,
唯一的缺点就是写备份块断电的那系统本次开机所做的 ...

天要下雨娘要嫁人。

加入电源监测,结合一个备用电源。此备用电源只在写备份数据块时发现主电源异常才硬一下,完了马上疲软.....
估计备用电源用不到几次,用到了,说明你可以去买彩票了。
作者: stirwl    时间: 2013-10-15 23:22
zyw19987 发表于 2013-10-14 09:05
天要下雨娘要嫁人。

加入电源监测,结合一个备用电源。此备用电源只在写备份数据块时发现主电源异常才硬 ...

加了个断电检测电路,检测到掉电的时候给个中断到单片机,然后靠个大电容的电荷保存数据。
目测已经没有问题了
作者: zyw19987    时间: 2013-10-15 23:49
stirwl 发表于 2013-10-15 23:22
加了个断电检测电路,检测到掉电的时候给个中断到单片机,然后靠个大电容的电荷保存数据。
目测已经没有 ...

一个产品的系统参数只有在掉电的时候才会保存?
当系统在设置参数的时候不保存,直到要掉电了才写入EEPROM?比如一个系统需要设置一个电话号码。

你的做法是在掉电时将运行过程中某些状态或标志保存一下,是知道要掉电了然后做出保存数据的动作,掉电在前,保存在后。而你的标题是保存数据过程中掉电..........
作者: stirwl    时间: 2013-10-16 20:32
zyw19987 发表于 2013-10-15 23:49
一个产品的系统参数只有在掉电的时候才会保存?
当系统在设置参数的时候不保存,直到要掉电了才写入EEPRO ...

程序会经常修改某些参数,一修改就保存会经常操作eepROM,而在操作eepROM时掉电就会丢失数据,所以才额外增加了电路,只在掉电的时候才保存一次数据,就是最终的状态
作者: zyw19987    时间: 2013-10-17 08:46
本帖最后由 zyw19987 于 2013-10-17 08:47 编辑
stirwl 发表于 2013-10-16 20:32
程序会经常修改某些参数,一修改就保存会经常操作eepROM,而在操作eepROM时掉电就会丢失数据,所以才额外 ...


参数改变了不马上写EEPROM?要等掉电才触发写入EEPROM?你的参数全部放在RAM里?


作者: stirwl    时间: 2013-10-17 19:51
zyw19987 发表于 2013-10-17 08:46
参数改变了不马上写EEPROM?要等掉电才触发写入EEPROM?你的参数全部放在RAM里?

...

恩,参数全才ram里。
因为实际运行发现,经常修改eepROM会导致程序出错……
而且,eepROM是有使用寿命的




欢迎光临 amobbs.com 阿莫电子技术论坛 (https://www.amobbs.com/) Powered by Discuz! X3.4