【Starting with ESP8266 (2)–Touch to control relay status-circuit design & electronic components selection】
【Starting with ESP8266(3) — Touch to control Relay-Programming & PCB design】
由于ESP8266系统可以自动保存系统参数到flash完成上电自动选择wifi工作模式和wifi连接参数等,但用户有时也需要保存一些非易失的数据,这就需要用户将信息写入flash,如果进一步考虑,写入flash的时候必须整扇区(4kb)擦除,然后再写入,所以存在一定的时长,如果为了数据完整性、安全性考虑,就必须考虑写入的时候突然掉电的风险。官方对这个问题是有说明的。见文档:
https://www.espressif.com/zh-hans/support/download/documents?keys=&field_type_tid%5B%5D=14
ESP8266 Flash 读写说明
本文先讨论了用户参数存放区域问题,然后调用系统api进行数据安全读写。
【由于字数限制,代码等详细信息见原博客,见谅啊】
http://www.straka.cn/blog/start-esp8266-4-flash-parameter-securely-save-load/
首先根据官方的文档
ESP8266 SDK 入门指南
或者结合博文【ESP8266开发入坑1—-点亮LED】提到的flash布局说明,
不支持云端升级(即NON-FOTA)的用户数据在eagle.irom0text.bin之后,而改文件的大小和保存地址在指南里有:
结合这两个文件,我们就可以计算出用户参数区的首地址:
比如512-non-fota,用户数据区首地址 = eagle.irom0text.bin的首地址 0x10000 + 大小 368*1024 = 0x6C000,
而实际用的是扇区数而不是字节地址数,所以需要0x6C000/4096 = 0x5C,
这里计算注意16-10进制转换。同理可以计算出fota布局下的用户参数区地址。
而用户参数区的大小除了首地址外还需要结尾地址决定,这个其实就是RF-CAL区的首地址,也就是blank.bin的存放地址。
我这里都算好了,并利用 user_rf_cal_sector_set里对flash布局的swtich顺便完成了该地址计算:
好了,有了参数保存地址,我们再看看参数的保存和加载吧。
官方SDK API文档有说明其保护机制:
https://www.espressif.com/sites/default/files/2C-ESP8266_Non_OS_SDK_API_Reference__CN.pdf
这个官方有API的我就不造轮子了,如果有更多要求的可以自己实现。
这里我就定义了通用方法放到FlashParam头和实现文件中
[color=rgb(51, 51, 51) !important]
|
代码见:
https://github.com/atp798/BlogStraka/tree/master/ESP8266_NONOS_SDK-2.2.1-WebServer/
原博客:
http://www.straka.cn/blog/start-esp8266-4-flash-parameter-securely-save-load/