esp8266 eeprom_ESP8266_08基于flash的数据掉电保护
这一节主要研究一下flash的用法,目的嘛,实现数据的掉电保护。
听起来像EEPROM?
确实很像,但不是!以STM32为例,片上是没有EEPROM的。但是,可以把一部分ROM当做EEPROM,通过程序进行擦写,最终实现的效果和EEPROM几乎是一样的。
那,怎么选这段ROM?一般是选flash的最后一个页(它是以页为单位的)。因为烧程序的时候,程序是从前往后开始烧录的,只要你的程序没有大到占用了最后一个页,那就能用。
ESP8266在这方面其实跟32很像,区别主要有两点:
1、ESP8266是以扇区为单位,一个扇区4KB。
2、ESP8266的最后4个扇区不能动,所以咱们要用的话,可以选倒数第5个扇区。
看下面的图(下图及相关说明转自乐鑫的相关手册):
上面两个图分别是不支持在线升级和支持在线升级的固件,在flash中的布局情况。
系统程序:用于存放系统运行必要的固件。
用户数据:当系统数据未占满整个Flash空间时,空闲区域均可用于存放用户数据。
用户参数:地址由用户自定义,IO T _Demo 中设置为0X3C000开始的4个扇区,用户可以设置为任意未占用的地址。
系统参数:固定为 Hash 的最后4个扇区。
BOOT信息:位于 FOTA 固件的分区1,存放FOTA升级预留信息。
预留:位于 FOTA 固件的分区2,与分区1 BOOT信息区对应的预留区域。
注:FLASH中每扇区为4KB。
注:上述信息参考手册2a-esp8266-sdk_getting_started_guide_cn。
根据上面给出的截图和信息,可以知道,如果要实现类似EEPROM的效果,需要把数据存到“用户数据”这一部分。用户数据在flash中有两部分,只要是没有被占用的,都可以。为了简单计算,这里建议大家使用倒数第五个扇区。
如果后期你对flash的布局了解的足够多了,可以使用任意可用的扇区,但是在初期,建议你还是先这么用。
接下来说用法,结合串口做演示(终于不用LED了)。最终实现的效果,上电的时候先把一组数据写入flash,然后循环读取这部分数据,并通过串口打印出来。开始之前先包含以下头文件:
#include "spi_flash.h"
相关的读写函数都在里面了。
步骤简单的令人发指,读写都算进去,只需要4步:
1选择你要写入的扇区
因为每个人手里的模块flash大小都有可能不一样,所以要先根据你的flash大小,计算一下你的倒数第五个扇区的编号是多少。
以我的为例,我的模块是16MBit的,也就是2MB,换算成KB是2048KB,再换算成扇区的个数是2048/4,得到512.
512个扇区,它们的编号从0开始,也就是0~511,那么倒数第五个的编号就是507.
所以我这里的代码写成这样:
#define MY_ESP8266_FLASH 2048
#define USER_DATA_SEC (MY_ESP8266_FLASH / 4 - 1 - 4)
uint32 hello[5] = {1,2,3,4,5};
uint32 read[5];
你们只需要把MY_ESP8266_FLASH后面的数值改成你的就行了。后面的两个数组一个用来存放被写入的数据,另一个用来存放读出的数据。
为什么是uint32类型?后面说!
2擦除该扇区
无论你要写哪个扇区,一律先擦后写!
spi_flash_erase_sector(USER_DATA_SEC);
好简单,不解释~
3写入数据
spi_flash_write(USER_DATA_SEC * 4 * 1024, hello, 5 * 4);
该函数共有三个参数:
第一个参数:写入flash的目的地址。虽然前面换算了半天的扇区,这里还是要换算回去。
第二个参数:被写入数据的指针。
第三个参数:数据长度,也就是被写入数据的大小。因为uint32占用4个字节,所以用数组元素个数乘以4.
回到刚才的问题,为什么一定要uint32类型?
答:规定!flash读写必须4字节对齐,所以定义的时候尽量是uint32类型。
4读出数据
spi_flash_read(USER_DATA_SEC * 4 * 1024, read, 5 * 4);
读取的地址、存放的位置、读取的长度,好简单~~~
注:参考手册2c-esp8266_non_os_sdk_api_reference_cn的45页,和99a-esp8266_flash_rw_operation_cn_v1.0。
程序里使用了一个软件定时器,每隔3秒通过串口打印输出一下读取到的数据,波特率115200.
保存、清理、编译、下载一条龙,然后重新上电,效果如下所示:
到此,flash的用法说完了。
链接:https://pan.baidu.com/s/1UTi45EmPB-6iguJrLUoiFw
提取码:btfy
ESP8266_前言
ESP8266_01搭建开发环境
ESP8266_02程序的编译与下载
ESP8266_03 SDK与Makefile的基本用法
ESP8266_04管脚控制与软件定时器
ESP8266_05 ESP8266有几个串口?
ESP8266_06硬件定时器与IO中断
ESP8266_07基于PWM的呼吸灯
esp8266 eeprom_ESP8266_08基于flash的数据掉电保护相关推荐
- iar编译工程的map怎么看使用flash大小_ESP8266_08基于flash的数据掉电保护
这一节主要研究一下flash的用法,目的嘛,实现数据的掉电保护. 听起来像EEPROM? 确实很像,但不是!以STM32为例,片上是没有EEPROM的.但是,可以把一部分ROM当做EEPROM,通过程 ...
- 单片机带掉电保护c语言,基于LM358的单片机掉电保护电路
描述 掉电保护简介 掉电数据保护是系统设备一个重要的功能. 目前,掉电数据保护的方法主要有2种: (1)加足够容量备用蓄电池,使系统掉电后继续工作: (2)不加备用电池,把掉电时需要保护的数据存储在非 ...
- flash写保护原理_STM32系统中的2种数据掉电保护方法!
在嵌入式设备开发中,往往需要保存一些掉电不易失性的数据,如果系统配置.用户定制信息等等,如果增加额外的ROM IC,比如(基于I2C的24C02等等)往往会造成额外的PCB空间增大,硬件成本增加,降低 ...
- 基于串行E2PROM掉电保护计数器的设计
百度网盘下载地址(959):点击下载 本实验是利用数码管来显示一个不断累加的两位数,其效果如图4-5所示: 图4-5 数码管的显示实验 在这个实验中,数码管的读数是经过IIC总线,从型号为24C02C ...
- 新手必看!单片机掉电检测与数据掉电保存方案
单片机在正常工作时,因某种原因造成突然掉电,将会丢失数据存储器(RAM)里的数据.在某些应用场合如测量.控制等领域,单片机正常工作中采集和运算出一些重要数据,待下次上电后需要恢复这些重要数据. 因此, ...
- SSD掉电保护也是一门艺术
你是否会遇到这样一种情况: 当你正在文思泉涌地敲打键盘赶稿件时,电脑突然抽风,然后,你就看到了绝望的蓝色(系统崩溃,电脑蓝屏了). 其实office软件有自动保存的功能,当电脑重启,再次打开WORD文 ...
- 固态硬盘掉电保护测试原理及要点
前言 固态硬盘由于必须使用FTL做逻辑地址和物理地址之间的转换,如果在SSD读.写.删除等正常工作的情况下出现异常掉电,有可能会导致mapping table的因为来不及更新而丢失,从而出现SSD无法 ...
- ESP8266 arduino 一键配网之后掉电不丢失wifi数据
本文关注掉电丢失wifi数据和不丢失数据的异同点. 一.软硬件 所用硬件如下图,软件是arduino 1.8.9. 二.代码分析 代码如下: void smartConfig() {WiFi.mode ...
- 关于jffs2文件系统如何掉电保护
JFFS2 是将节点信息保存在内存中 Flash上日志型文件系统的资料,了解到传统的基于闪存转换层(FLT)的文件系统存在的主要问题: 1. 效率低.因为每次都要把要修改的数据所在擦写块放入内存,产生 ...
最新文章
- Java创建数组的三种方法
- 使用ansible批量部署开机启动时为字符界面
- VTK:Rendering之Mace
- OpenCV TSP(TravelingSalesman Problem)的实例(附完整代码)
- no ip domain-lookup 什么意思
- 随笔-机器如何学习我们的知识?
- python的标准库学习之__buitin__
- 异步调用结果的获取(转)
- WIZnet无线模块WizFi210/220 硬件设计指导
- OpenCV探索之路(零):HighGUI——使用imwrite调整保存的图片质量
- 2010-11-23 network virtualization papers(2)
- 【卫朋】硬件创业:营销与开发同行
- 台式计算机cpu品牌,台式电脑CPU天梯图2018年9月最新版 桌面CPU性能排名
- MySQL - 基于ibd文件恢复表数据
- 相机标定:像素焦距和毫米焦距的转换,根据内参计算FOV
- 应急灯电源驱动方案:OC5205 30V/1.5A ,可完美替代PT4205/PT4115
- 5000字加21图文 | 抓包带你体验同网段的通信过程,这些细节很关键
- WriteFile写文件乱码问题
- SSD模型(论文大致内容)
- “即刻搜索”为什么使用率几乎为零