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扇区
10184*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 占据的内存大小 是