开机偶尔会导致FLASH内的数据变成65535
设备开机的时候偶尔会导致FLASH内的数据变成65535,开机的过程中有接触器会吸合,
想复现这个问题不容易,
STM32主控,在开机的时候会从FLASH里面读之前设置的温度,然后变成设定值,
接触器如果动作能导致FLASH出问题?
大家有遇到过这样的问题吗?这要怎么搞啊?
凡意见被证实有效解决问题的,我会在答案中选出3个人邮寄礼物以做感谢~!
开机只是读数据,很小机率出问题。
关键还是检查下关机时是不是去写flash 遇到过FLASH数据丢失的情况一般是在写入过程中MCU和外部FLASH供电电压突然被拉低导致写入数据不完整,某个扇区或者整片数据被破坏。
一种供电电压瞬间被吸走大量电流,MCU有电压监控芯片,比如MAX809之类,有助减少这种情况的出现。
另外一个可能是干扰导致MCU在写入FLASH时复位了,控制接触器电路是否有隔离? neutronlmk 发表于 2022-1-20 19:35
开机只是读数据,很小机率出问题。
关键还是检查下关机时是不是去写flash
关机就一个电源键,按下去会切断所有的电源,这个时候STM32怎么知道要关机啊? 65535就是FFFF,说明擦出flash后没来得及写入就掉电了,或者写入逻辑有问题导致没执行写入步骤。用flash做存储的,最好准备两份,一份用作备份,失败后用备份的恢复。 研究代码把,写入的逻辑有问题。可以加入https://www.amobbs.com/thread-5716825-1-1.html,防止写入掉电 搞一个带掉电防护的数据保存机制。 我感觉是关机时保存数据时断电造成的,加大电容或每次修改设置及时保存即可。还有开机时应读取数据后再延时一点时间再进行下步工作 xiangtaochen 发表于 2022-1-20 19:46
关机就一个电源键,按下去会切断所有的电源,这个时候STM32怎么知道要关机啊? ...
一个二极管、一只大点的电容,就可以让单片机晚于系统一小会断电。
利用这个时间就可以紧急保存参数 设置温度是通过什么方式设置的?如果是按键来设置的,看是否按键被干扰了。 xiangtaochen 发表于 2022-1-20 19:46
关机就一个电源键,按下去会切断所有的电源,这个时候STM32怎么知道要关机啊? ...
不好意思,表达错误。是检查掉电时候会不会还在写flash。 最稳妥的办法增加一个掉电检测电路,发现外部电源关掉的时候就不要写。楼主这种情况应该是在写入之前擦除了就没电了,导致写入不正常。 数据写3份在不同扇区中,读时比较2份相同的采用 建议是:
1. 做一个温度设定(写到FLASH中)备份值(刚上电的时候读取一次),跟要写到Flash中的值对比,不一样就写入flash,再更新备份值。需要考虑的是会不会频繁更改写入。可以设定一个定时器,长时间对比不一样才写入。
2. 掉电检测功能,增大储能电容。当发现掉电,立刻关闭耗电大的电路,然后判断是否要写入flash。 写不同地方,同样数据写3次,读取比较是不是一样的。或程序读到FF就另外处理了,当无效数据不要按正常处理。 粗暴简单的方法
n年前 做一款工控专业替换PLC的工控板
时不时出现LZ的问题公司里面无论测试都不会把故障复现
后来 数据保存量大的产品直接上铁电小是外置24cxx
之后没有这个接到问题投诉啦{:biggrin:}
从此之后 内部FLASH当eeprom的方案
明文规定 在某公司研发部禁止使用 {:lol:} 更新温度时要删除再写,可能某时刻关机时刚好遇到更新温度刚删除完就没电了。 商用级别的代码,没有数据有效性检查?写入数据的同时还要写入有效标志或者校验字节,读数据的时候要检查数据是否有效,如果数据无效就不应该用,或者赋予默认值。 ST的主控,移植ST的EEPROM_emul,实现写平衡的同时,也能防止掉电没写完出错。
我刚移植到G070上,G070的Flash循环次数只有1K。
基本思路是用至少2页flash,每次写的时候往后面写,一页写满了,把有效数据写到下一页再擦除写满的页。 Doding 发表于 2022-1-21 09:12
ST的主控,移植ST的EEPROM_emul,实现写平衡的同时,也能防止掉电没写完出错。
我刚移植到G070上,G070的Fl ...
G070 FLASH 只有1万次? 加电容和掉电检测,断电后维持一小会,如果正在写flash,把写操作搞完 gsq19920418 发表于 2022-1-21 09:34
G070 FLASH 只有1万次?
我觉得写1K应该没歧义吧,是1千,不是1万。
楼主又没有提到,掉电时要保存数据。觉得不一定保存数据时出了问题,很可能开机是受到强干扰,FLASH数据出现了紊乱。应该加强硬件的抗干扰设计。 只是读取的问题,还是 Flash 内容真的变成 65535 了呢?这是两个方向。 lb0857 发表于 2022-1-21 08:15
粗暴简单的方法
n年前 做一款工控专业替换PLC的工控板
时不时出现LZ的问题公司里面无论测试都不会把故 ...
内部flash最大问题是寿命有限,别的可以通过软件解决 Doding 发表于 2022-1-21 09:53
我觉得写1K应该没歧义吧,是1千,不是1万。
这是最少吧!我记得STM32F103写的好像是最少1K,典型是10K吧,要不这写程序调试就挺恶心了 No sources No talk! monkeynav 发表于 2022-1-21 12:21
内部flash最大问题是寿命有限,别的可以通过软件解决
请教一下 是不是冗余处理的方法 呢
多年的顽疾打算纠正过来 本帖最后由 2nd 于 2022-1-21 13:31 编辑
Doding 发表于 2022-1-21 09:12
ST的主控,移植ST的EEPROM_emul,实现写平衡的同时,也能防止掉电没写完出错。
我刚移植到G070上,G070的Fl ...
谢分享,平时不存数据在Flash,没看G0的擦写寿命,1kcycles岂不是调试得多都会写坏{:lol:}
编辑说明:加个图
读错了很难吧。读出FF多半是上次写入的时候光擦了但没写成功(擦1写0)。
需要跟踪一下擦除过程成功与否,比如说写入完毕最后环节多写一个CRC值进去,下次开机时检验CRC值正确与否。另外也可多开辟几倍的区域轮转写入,如果错了就退回上一个正确的(相当于游戏的N个存档位轮着用)。 2nd 发表于 2022-1-21 13:25
谢分享,平时不存数据在Flash,没看G0的擦写寿命,1kcycles岂不是调试得多都会写坏...
1kcycles是质量保证性质的,在保看厂家,出保看天命,这种感觉。(实际使用的寿命会多很多) lb0857 发表于 2022-1-21 13:22
请教一下 是不是冗余处理的方法 呢
多年的顽疾打算纠正过来
写入顺序的问题。看看数据库或者文件系统怎么设计的:写入是顺序的,考虑好逻辑关系即可。不要擦掉原来的数据,先写实际数据再写日志(标志),读取时通过标志可判断该用旧数据还是新数据。 gsq19920418 发表于 2022-1-21 13:16
这是最少吧!我记得STM32F103写的好像是最少1K,典型是10K吧,要不这写程序调试就挺恶心了 ...
103最少是1万次 monkeynav 发表于 2022-1-21 13:42
写入顺序的问题。看看数据库或者文件系统怎么设计的:写入是顺序的,考虑好逻辑关系即可。不要擦掉原来的 ...
可以理解 : 新数据的地址最好是另外一页(防止整页被误擦除等等异常毁灭数据)
然后读取时候 根据检验码(或者标记位)进行相应处理
这样理念在产品上面 排开flash寿命不谈 有批量产品稳定性很好的案例吧
先谢谢您解答{:handshake:} STM32是32位的单片机,一次读出来是32位,怎么读出16位了呢?
应该是变量没有定义好 sunrn123 发表于 2022-1-21 14:34
STM32是32位的单片机,一次读出来是32位,怎么读出16位了呢?
应该是变量没有定义好 ...
读取的粒度(granularity)好像可以精细一些。这个并非跟着cpu位数绑定的,我记得可以精细到字节。
(* 实际上写入的粒度倒是更大的,好像最少一次要写8个字节?小于这个粒度就只能读取-修改-回写了) lb0857 发表于 2022-1-21 14:31
可以理解 : 新数据的地址最好是另外一页(防止整页被误擦除等等异常毁灭数据)
然后读取时候 根据检验码( ...
文件系统、数据库的掉电保护的本质就是这样,这是成熟的理论:
写总是往新的地址写,只是将旧的内容标志为无效,当新内容写完后,将新的内容标志为有效。当空间不够时,开始所谓的磁盘整理。 security 发表于 2022-1-21 15:07
文件系统、数据库的掉电保护的本质就是这样,这是成熟的理论:
写总是往新的地址写,只是将旧的内容标志 ...
谢谢解答
内部flash要稳定可靠
软硬件都是要下一番功夫滴 lb0857 发表于 2022-1-21 14:31
可以理解 : 新数据的地址最好是另外一页(防止整页被误擦除等等异常毁灭数据)
然后读取时候 根据检验码( ...
flash不需要擦除就能写0,擦除是0设置为1。原有内容0xff,修改成其他值不需要擦除。flash寿命有限,可以当作磁带使用:
每次往后写入变更部分,最后再写个校验码。如果校验不对,最后一块数据就抛弃掉。隔一段时间做一次清理,把最终的数值写到另一个页面,再擦除原有的。
校验码一定是最后写进去,这样校验错了就等于没写过。 gsq19920418 发表于 2022-1-21 13:16
这是最少吧!我记得STM32F103写的好像是最少1K,典型是10K吧,要不这写程序调试就挺恶心了 ...
1K是ST保证的次数,实际能用到多少不一定,很可能1KK都没事,也可能1K1就出问题,Flash模拟EEPROM要做写平衡和掉电处理,还要估算一下1K的次数能否满足产品寿命要求。 2nd 发表于 2022-1-21 13:25
谢分享,平时不存数据在Flash,没看G0的擦写寿命,1kcycles岂不是调试得多都会写坏
编辑说明: ...
生产的时候,一般就写一两次,调试用的板不能当正式产品发货,只能当样机。如果不用Flash保存数据,产品使用时只会读flash,最多在升级的时候写一次,1K的循环次数已经足够用了。
页:
[1]