收藏官网首页
查看: 2945|回复: 0

利用flash实现掉电数据恢复

106

主题

107

帖子

7264

积分

论坛元老

Rank: 8Rank: 8

积分
7264
跳转到指定楼层
#
 楼主| 发表于 2023-9-1 20:30:58 | 只看该作者 |只看大图 回帖奖励 |正序浏览 |阅读模式
注册成为机智云开发者,手机加虚拟设备快速开发
    智能家居设备通常需要用户进行个性化设置,例如温度设定、时间表、互联网连接等。如果这些设置数据在掉电后没有被保存,用户将不得不每次重新配置设备,这会显著降低用户体验并引起不满。因此,我们把设置数据到闪存可以确保用户不必担心掉电导致的数据丢失。无论何时重新上电,设备都能自动恢复之前的设置,使设备的操作更加便捷和无缝。

那我们来看看如何实现,首先要说明的是,如果设备有ota的功能需求的话,可以从分区表再划一个1k大小的空间用于存放数据,一般不是很大的项目flash的剩余空间都是很充足的。这里我就不使用分区表了,直接对页进行操作,因为我的设备还没加上ota功能。

在此篇文章,已经介绍过了读写内部flash的方法https://club.gizwits.com/thread-169692-1-1.html 我们只需要进行修改即可实现存放数据点。

擦除数据的代码暂时无需修改,因为1k已经足够我的需求了


对于读取flash,我们需要修改,这里是通过一个数组来存放数据的,因此在读取一个数据后,flash的地址要偏移2个字节


同样,对于数据写入,每写入一个数据也要对地址偏移2个字节


这样,我们需要的读写擦除函数已经准备好了,现在我们要解决的是,读写逻辑的问题。

首先,我们可以准备一个uint16的数组,第一个数据用于存放标志位,可以是已写入或者用于判断此区域是否是合法区域,亦或者是判断数据有没有初始化。
因此流程是:读出数据-》判断标志位-》根据标志位操作数组-》数组内容赋值给数据点

那么我们就可以编写代码了 在main函数while开始之前读出数据,根据内容选择初始化还是赋值给数据点

然后,到机智云事件处理函数里,调用数据写入函数,使用外部变量引用数据即可

这样,在我们改变设备状态的时候,数据就会被写入到flash中,当然flash的寿命是有限的,假如操作次数比较多,可以积累起来,达到一定后进行合并读写。


您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

加入Q群 返回顶部

版权与免责声明 © 2006-2024 Gizwits IoT Technology Co., Ltd. ( 粤ICP备11090211号 )

快速回复 返回顶部 返回列表