这一节主要研究一下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的呼吸灯

iar编译工程的map怎么看使用flash大小_ESP8266_08基于flash的数据掉电保护相关推荐

  1. 新手必看!单片机掉电检测与数据掉电保存方案

    单片机在正常工作时,因某种原因造成突然掉电,将会丢失数据存储器(RAM)里的数据.在某些应用场合如测量.控制等领域,单片机正常工作中采集和运算出一些重要数据,待下次上电后需要恢复这些重要数据. 因此, ...

  2. IAR编译错误:unable to allocate space for sections/blocks with a total estimated minimum size of 0x504c

    IAR编译错误:unable to allocate space for sections/blocks with a total estimated minimum size of 0x504c 用 ...

  3. [IAR]Win7升级成Win10后用IAR编译项目出现System Error Code: 704

    简述: Win7 64bit系统,使用IAR编译工程.在升级到Win10后,同样的工程,编译时提示System Error Code: 704,System Error Message: 请求的操作需 ...

  4. IAR编译的工程无法正常仿真的问题

    问题描述 我们在用IAR进行开发的时候,比如开发CC254x或者CC26xx等等项目的时候,经常需要通过仿真来查看程序的运行过程以及查看某些变量的值的变化情况等,这个时候我们有可能遇到单步运行不执行某 ...

  5. iar c语言指令,IAR中工程相关配置及c语言易忘知识点

    使用K60单片机时,往往使用IAR的比较多.但是我之前一直使用KEIL来进行stm32的开发,所以就有一种先入为主的观念,总觉得KEIL比IAR要好一些.随着和IAR打交道越来越多,渐渐地发现IAR也 ...

  6. eclipse不能自动编译工程的解决方法

    任何时候看 Problems 找到正确原因,解决问题就没错的 =========================== eclipse出现不编译工程的现象.怎么刷新classes目录下也是空的. 具体都 ...

  7. 文件路径名太长导致IAR编译报错:Fatal Error[Pe1696]: cannot open source file

    在用IAR编译CC2640R2F工程的时候,报错: gattservapp_util.c   Fatal Error[Pe1696]: cannot open source file "xd ...

  8. IAR编译出现Error[Pe147]: declaration is incompatible with “__interwork __vfp int dir_get_dout()“ 报错

    IAR编译出现Error[Pe147]: declaration is incompatible with "__interwork __vfp int dir_get_dout()&quo ...

  9. [IAR] 编译报错:Variable expansion failed for Pre-Build command line

    这里写目录标题 项目场景: 问题描述: 原因分析: 解决方案: 项目场景: 导入工程,编译报错. Variable expansion failed for Pre-Build command lin ...

最新文章

  1. 当Elasticsearch遇见Kafka
  2. React开发(218):dva注意对应
  3. VM虚拟机上的CentOS 7系统重置root用户密码
  4. 【转】vb获得网络时间的函数
  5. 编译安装PHP出现Cannot load /usr/local/apache/modules/libphp5.so
  6. 【渝粤教育】电大中专电子商务网站建设与维护作业 题库
  7. 原有Android/IOS项目集成flutter功能
  8. 云智推任务提交版拉新系统源码-任务分销系统
  9. monk_notebook (交际德语教程 第二版 学生用书)
  10. 电感耦合等离子体发射光谱法测定水样中的金属含量
  11. egret的WebView实现(基于egret2.5)
  12. [GKCTF 2021]excel 骚操作
  13. 10年回顾:世界各地开发高手谈Java
  14. UVa 10041 - Vito's Family
  15. 如何用requests获取百度网站的图片资源
  16. php使用Qrcode生成二维码
  17. SwiftUI 音乐和网络大全之网络音乐播放App支持iTunes搜索与播放(教程含源码)
  18. 【Python】字符串不足位数补零/补空格
  19. 关于linux下,安装jdk后,会有Picked up _JAVA_OPTIONS: -Dawt.useSystemAAFontSettings=gasp的报错
  20. android官网m魅族15,魅族15系列亮相安卓官网 圆形Home键亮了

热门文章

  1. CCF201903-2 二十四点(100分)【表达式计算】
  2. 《程序设计技术》第五章例程
  3. CCF201709-1 打酱油(100分)
  4. B00015 平方矩阵问题
  5. NUC1305 哥德巴赫猜想【筛选法】
  6. 【等价转换】—— min/max 的转换与互相转换
  7. Java 并发 —— volatile 关键字
  8. cmd 批处理文件(.bat)文件的编写
  9. Python、Java 在线笔试
  10. 工具的使用——vs2013(三)