ESP8266 non-os⑴ Flash掉电记录数据读写

本文介绍了ESP8266 non-os SDK 3.1.0版本中关于Flash的布局,扇区地址计算方法,以及如何在Flash中进行掉电记录数据的读写操作,包括非保护模式和保护模式。强调了5个保留扇区,以及在保护模式下如何确保数据安全性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ESP8266 non-os SDK为3.1.0

掉电数据保存是绝大多数单片机开发绕不开的,先把方法记录下来,方便查找

Flash布局介绍

在这里插入图片描述

⽤户可以通过修改 ESP8266_NONOS_SDK/ld/eagle.app.v6.ld ⽂件来改变
eagle.irom0text.bin 的上限值,即修改⽂件中 irom0_0_seg 参数的 len 字段,如图 4-2 中红⾊标示。
不同版本 SDK 中 irom0.text ⽂件的地址也不同。⽤户必须查阅 eagle.app.v6.ld ⽂件,确保将 eagle.irom0.text.bin 下载到正确的地址。图 4-2 中蓝⾊标示即为
eagle.irom0.text.bin 的地址。
ESP8266 ⽬前系统程序区最⼤⽀持 1024 KB
在这里插入图片描述
在这里插入图片描述

扇区地址计算方法

ESP8266-12F使用的外部存储芯片为w25q32有32Mbit,容量4M。
esp8266-01s使用的是一个w25q8的存储芯片,也就是8Mbit,容量1M。
在这里插入图片描述
在ESP8266-12F里w25q32把4M容量分为了64块, 每一块又分为16个扇区, 而每个扇区占4K大小,每1K等于1204字节。由此可计算到,w25q32有 32Mbit / 8 * 1024 / 16 / 4 = 64 块 ,有64 * 16 = 1024 个扇区.
扇区号由0开始计数,所以最高为1023号扇区。

在这里插入图片描述
ESP8266-12F的扇区地址计算方法:
eagle.flash.bin 位于扇区0          地址0x00000
eagle.irom0text.bin 位于扇区16       地址0x10000
blank.bin 位于扇区1022          地址0x3FE000
esp_init_data_default.bin位于扇区1020  地址0x3FC000
4M容量的十六进制3FB000地址转换为十进制为:4173824
所在扇区为:4173824/4/1024= 1019
4M容量的十六进制3FC000地址转换为十进制为:4177920
所在扇区为:4177920/4/1024= 1020
4M容量的十六进制3FE000地址转换为十进制为:4186112
所在扇区为:4186112/4/1024= 1022

Flash操作

ESP8266-12F的Flash操作:
下列5个扇区不能占用!!!!
eagle.flash.bin 位于扇区0          地址0x00000
eagle.irom0text.bin 位于扇区16       地址0x10000
blank.bin 位于扇区1022          地址0x3FE000
esp_init_data_default.bin位于扇区1020  地址0x3FC000
RF_CAL 参数 位于扇区1019       地址0x3FB000

假如用户eagle.irom0text.bin程序小于等于480K,那么用户存储数据的安全区域起始地址为 :
1741024+4801024=561152 137扇区
把561152字节位置转换为十六进制地址0x89000
储数据的安全区域结束地址为 :1018扇区
1018
4*1024=4169728
把4169728字节位置转换为十六进制地址0x3FA000
用户存储数据的安全区域为:137扇区到1018扇区。

Flash掉电记录数据读写操作(非保护模式)
/**Flash 写操作 */
#define sec 137  //扇区号
uint32 value;
//定义数组addr_case1
uint8* addr_case1 = (uint8*)&value;
	addr_case1[0] = 10;
	addr_case1[1] = 11;
	//擦除要写入的Flash扇区
	spi_flash_erase_sector(sec);
	//写入数据,sec*4*1024就是写入起始地址,就是具体的字节地址
	spi_flash_write(sec*4*1024, (uint32*)addr_case1, sizeof(addr_case1));
	//打印
	os_printf("@xie_ru@:%d%d\r\n", addr_case1[0], addr_case1[1]);

/**Flash 读操作 */
#define sec 137  //扇区号
#define sec_pianyi 0 //偏移量
uint32 value;
//定义数组addr_case1
uint8* addr_case1 = (uint8*)&value;
	//读取flash数据,sec*4*1024就是读取起始地址,就是具体的字节地址
	spi_flash_read(sec*4*1024, (uint32*)addr_case1, sizeof(addr_case1));
	//打印
	os_printf("@du_qu@:%d%d\r\n", addr_case1[0], addr_case1[1]);

1个扇区可以储存4Kb=4*1024=4096字节数据,一般而言:
int 占据的内存大小 是

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值