xiangtaochen 发表于 2022-1-20 19:20:29

开机偶尔会导致FLASH内的数据变成65535

设备开机的时候偶尔会导致FLASH内的数据变成65535,
开机的过程中有接触器会吸合,
想复现这个问题不容易,
STM32主控,在开机的时候会从FLASH里面读之前设置的温度,然后变成设定值,
接触器如果动作能导致FLASH出问题?
大家有遇到过这样的问题吗?这要怎么搞啊?

xiangtaochen 发表于 2022-1-20 19:26:32

凡意见被证实有效解决问题的,我会在答案中选出3个人邮寄礼物以做感谢~!

neutronlmk 发表于 2022-1-20 19:35:02

开机只是读数据,很小机率出问题。
关键还是检查下关机时是不是去写flash

N_EMBED 发表于 2022-1-20 19:42:30

遇到过FLASH数据丢失的情况一般是在写入过程中MCU和外部FLASH供电电压突然被拉低导致写入数据不完整,某个扇区或者整片数据被破坏。

一种供电电压瞬间被吸走大量电流,MCU有电压监控芯片,比如MAX809之类,有助减少这种情况的出现。

另外一个可能是干扰导致MCU在写入FLASH时复位了,控制接触器电路是否有隔离?

xiangtaochen 发表于 2022-1-20 19:46:01

neutronlmk 发表于 2022-1-20 19:35
开机只是读数据,很小机率出问题。
关键还是检查下关机时是不是去写flash

关机就一个电源键,按下去会切断所有的电源,这个时候STM32怎么知道要关机啊?

PPS 发表于 2022-1-20 19:49:02

65535就是FFFF,说明擦出flash后没来得及写入就掉电了,或者写入逻辑有问题导致没执行写入步骤。用flash做存储的,最好准备两份,一份用作备份,失败后用备份的恢复。

pt2go 发表于 2022-1-20 19:50:23

研究代码把,写入的逻辑有问题。可以加入https://www.amobbs.com/thread-5716825-1-1.html,防止写入掉电

Merisy 发表于 2022-1-20 19:52:01

搞一个带掉电防护的数据保存机制。

qd118118 发表于 2022-1-20 20:01:04

我感觉是关机时保存数据时断电造成的,加大电容或每次修改设置及时保存即可。还有开机时应读取数据后再延时一点时间再进行下步工作

t3486784401 发表于 2022-1-20 20:07:51

xiangtaochen 发表于 2022-1-20 19:46
关机就一个电源键,按下去会切断所有的电源,这个时候STM32怎么知道要关机啊? ...

一个二极管、一只大点的电容,就可以让单片机晚于系统一小会断电。
利用这个时间就可以紧急保存参数

eiglxl 发表于 2022-1-20 20:22:31

设置温度是通过什么方式设置的?如果是按键来设置的,看是否按键被干扰了。

neutronlmk 发表于 2022-1-20 20:29:08

xiangtaochen 发表于 2022-1-20 19:46
关机就一个电源键,按下去会切断所有的电源,这个时候STM32怎么知道要关机啊? ...

不好意思,表达错误。是检查掉电时候会不会还在写flash。

lgg88 发表于 2022-1-20 20:48:35

最稳妥的办法增加一个掉电检测电路,发现外部电源关掉的时候就不要写。楼主这种情况应该是在写入之前擦除了就没电了,导致写入不正常。

modbus 发表于 2022-1-20 22:03:13

数据写3份在不同扇区中,读时比较2份相同的采用

D.lovers 发表于 2022-1-20 22:16:16

建议是:
1. 做一个温度设定(写到FLASH中)备份值(刚上电的时候读取一次),跟要写到Flash中的值对比,不一样就写入flash,再更新备份值。需要考虑的是会不会频繁更改写入。可以设定一个定时器,长时间对比不一样才写入。
2. 掉电检测功能,增大储能电容。当发现掉电,立刻关闭耗电大的电路,然后判断是否要写入flash。

1105284241 发表于 2022-1-20 22:16:56

写不同地方,同样数据写3次,读取比较是不是一样的。或程序读到FF就另外处理了,当无效数据不要按正常处理。

lb0857 发表于 2022-1-21 08:15:10

粗暴简单的方法
n年前   做一款工控专业替换PLC的工控板
时不时出现LZ的问题公司里面无论测试都不会把故障复现
后来 数据保存量大的产品直接上铁电小是外置24cxx   
之后没有这个接到问题投诉啦{:biggrin:}

从此之后   内部FLASH当eeprom的方案   
明文规定 在某公司研发部禁止使用 {:lol:}

mypear 发表于 2022-1-21 08:29:21

更新温度时要删除再写,可能某时刻关机时刚好遇到更新温度刚删除完就没电了。

liyang121316 发表于 2022-1-21 09:04:12

商用级别的代码,没有数据有效性检查?写入数据的同时还要写入有效标志或者校验字节,读数据的时候要检查数据是否有效,如果数据无效就不应该用,或者赋予默认值。

Doding 发表于 2022-1-21 09:12:43

ST的主控,移植ST的EEPROM_emul,实现写平衡的同时,也能防止掉电没写完出错。
我刚移植到G070上,G070的Flash循环次数只有1K。
基本思路是用至少2页flash,每次写的时候往后面写,一页写满了,把有效数据写到下一页再擦除写满的页。

gsq19920418 发表于 2022-1-21 09:34:26

Doding 发表于 2022-1-21 09:12
ST的主控,移植ST的EEPROM_emul,实现写平衡的同时,也能防止掉电没写完出错。
我刚移植到G070上,G070的Fl ...

G070 FLASH 只有1万次?

shiva_shiva 发表于 2022-1-21 09:37:52

加电容和掉电检测,断电后维持一小会,如果正在写flash,把写操作搞完

Doding 发表于 2022-1-21 09:53:14

gsq19920418 发表于 2022-1-21 09:34
G070 FLASH 只有1万次?

我觉得写1K应该没歧义吧,是1千,不是1万。

wangzex 发表于 2022-1-21 10:12:33

楼主又没有提到,掉电时要保存数据。觉得不一定保存数据时出了问题,很可能开机是受到强干扰,FLASH数据出现了紊乱。应该加强硬件的抗干扰设计。

security 发表于 2022-1-21 10:54:48

只是读取的问题,还是 Flash 内容真的变成 65535 了呢?这是两个方向。

monkeynav 发表于 2022-1-21 12:21:13

lb0857 发表于 2022-1-21 08:15
粗暴简单的方法
n年前   做一款工控专业替换PLC的工控板
时不时出现LZ的问题公司里面无论测试都不会把故 ...

内部flash最大问题是寿命有限,别的可以通过软件解决

gsq19920418 发表于 2022-1-21 13:16:25

Doding 发表于 2022-1-21 09:53
我觉得写1K应该没歧义吧,是1千,不是1万。

这是最少吧!我记得STM32F103写的好像是最少1K,典型是10K吧,要不这写程序调试就挺恶心了

abigpad 发表于 2022-1-21 13:19:49

No sources No talk!

lb0857 发表于 2022-1-21 13:22:45

monkeynav 发表于 2022-1-21 12:21
内部flash最大问题是寿命有限,别的可以通过软件解决

请教一下 是不是冗余处理的方法 呢   

多年的顽疾打算纠正过来

2nd 发表于 2022-1-21 13:25:19

本帖最后由 2nd 于 2022-1-21 13:31 编辑

Doding 发表于 2022-1-21 09:12
ST的主控,移植ST的EEPROM_emul,实现写平衡的同时,也能防止掉电没写完出错。
我刚移植到G070上,G070的Fl ...

谢分享,平时不存数据在Flash,没看G0的擦写寿命,1kcycles岂不是调试得多都会写坏{:lol:}

编辑说明:加个图

shamiao 发表于 2022-1-21 13:29:50

读错了很难吧。读出FF多半是上次写入的时候光擦了但没写成功(擦1写0)。

需要跟踪一下擦除过程成功与否,比如说写入完毕最后环节多写一个CRC值进去,下次开机时检验CRC值正确与否。另外也可多开辟几倍的区域轮转写入,如果错了就退回上一个正确的(相当于游戏的N个存档位轮着用)。

shamiao 发表于 2022-1-21 13:30:58

2nd 发表于 2022-1-21 13:25
谢分享,平时不存数据在Flash,没看G0的擦写寿命,1kcycles岂不是调试得多都会写坏...

1kcycles是质量保证性质的,在保看厂家,出保看天命,这种感觉。(实际使用的寿命会多很多)

monkeynav 发表于 2022-1-21 13:42:50

lb0857 发表于 2022-1-21 13:22
请教一下 是不是冗余处理的方法 呢   

多年的顽疾打算纠正过来

写入顺序的问题。看看数据库或者文件系统怎么设计的:写入是顺序的,考虑好逻辑关系即可。不要擦掉原来的数据,先写实际数据再写日志(标志),读取时通过标志可判断该用旧数据还是新数据。

modbus 发表于 2022-1-21 14:07:45

gsq19920418 发表于 2022-1-21 13:16
这是最少吧!我记得STM32F103写的好像是最少1K,典型是10K吧,要不这写程序调试就挺恶心了 ...

103最少是1万次

lb0857 发表于 2022-1-21 14:31:30

monkeynav 发表于 2022-1-21 13:42
写入顺序的问题。看看数据库或者文件系统怎么设计的:写入是顺序的,考虑好逻辑关系即可。不要擦掉原来的 ...

可以理解   : 新数据的地址最好是另外一页(防止整页被误擦除等等异常毁灭数据)
然后读取时候 根据检验码(或者标记位)进行相应处理

这样理念在产品上面    排开flash寿命不谈   有批量产品稳定性很好的案例吧
先谢谢您解答{:handshake:}

sunrn123 发表于 2022-1-21 14:34:21

STM32是32位的单片机,一次读出来是32位,怎么读出16位了呢?
应该是变量没有定义好

shamiao 发表于 2022-1-21 14:50:10

sunrn123 发表于 2022-1-21 14:34
STM32是32位的单片机,一次读出来是32位,怎么读出16位了呢?
应该是变量没有定义好 ...

读取的粒度(granularity)好像可以精细一些。这个并非跟着cpu位数绑定的,我记得可以精细到字节。

(* 实际上写入的粒度倒是更大的,好像最少一次要写8个字节?小于这个粒度就只能读取-修改-回写了)

security 发表于 2022-1-21 15:07:25

lb0857 发表于 2022-1-21 14:31
可以理解   : 新数据的地址最好是另外一页(防止整页被误擦除等等异常毁灭数据)
然后读取时候 根据检验码( ...

文件系统、数据库的掉电保护的本质就是这样,这是成熟的理论:
写总是往新的地址写,只是将旧的内容标志为无效,当新内容写完后,将新的内容标志为有效。当空间不够时,开始所谓的磁盘整理。

lb0857 发表于 2022-1-21 15:18:05

security 发表于 2022-1-21 15:07
文件系统、数据库的掉电保护的本质就是这样,这是成熟的理论:
写总是往新的地址写,只是将旧的内容标志 ...

谢谢解答
内部flash要稳定可靠
软硬件都是要下一番功夫滴

monkeynav 发表于 2022-1-21 15:28:08

lb0857 发表于 2022-1-21 14:31
可以理解   : 新数据的地址最好是另外一页(防止整页被误擦除等等异常毁灭数据)
然后读取时候 根据检验码( ...

flash不需要擦除就能写0,擦除是0设置为1。原有内容0xff,修改成其他值不需要擦除。flash寿命有限,可以当作磁带使用:
每次往后写入变更部分,最后再写个校验码。如果校验不对,最后一块数据就抛弃掉。隔一段时间做一次清理,把最终的数值写到另一个页面,再擦除原有的。
校验码一定是最后写进去,这样校验错了就等于没写过。

Doding 发表于 2022-1-21 15:28:22

gsq19920418 发表于 2022-1-21 13:16
这是最少吧!我记得STM32F103写的好像是最少1K,典型是10K吧,要不这写程序调试就挺恶心了 ...

1K是ST保证的次数,实际能用到多少不一定,很可能1KK都没事,也可能1K1就出问题,Flash模拟EEPROM要做写平衡和掉电处理,还要估算一下1K的次数能否满足产品寿命要求。

Doding 发表于 2022-1-21 15:32:06

2nd 发表于 2022-1-21 13:25
谢分享,平时不存数据在Flash,没看G0的擦写寿命,1kcycles岂不是调试得多都会写坏

编辑说明: ...

生产的时候,一般就写一两次,调试用的板不能当正式产品发货,只能当样机。如果不用Flash保存数据,产品使用时只会读flash,最多在升级的时候写一次,1K的循环次数已经足够用了。
页: [1]
查看完整版本: 开机偶尔会导致FLASH内的数据变成65535