1、ESP8266-12F的Flash

ESP8266-12F的Flash共4M字节。【4096K字节】

根据手册,一个扇区大小:4096字节。
共有(4096*1024/4096)=1024=0x400个扇区,扇区地址0~0x3FF.

2、Flash布局

可以对Flash进行读写,但是要注意地址,不要用到有用的范围喽~

下图是不支持云端升级版本的Flash布局,我们可以用的就是“用户数据”这一区域。

在这里插入图片描述

那么具体来说,这几个部分的范围是多少呢?

我圈起来的就是ESP8266-12F模组对应的那一行。

在这里插入图片描述

再结合bin文件的下载地址,就可以得到最后一列,各bin文件的扇区编号范围。

因此,安全的用户数据区域,扇区是从208~1018,一共811个扇区,3244K字节。

bin文件32Mbit下载地址扇区
eagle.flash.bin0x000000~15
eagle.irom0text.bin0x1000016~207
blank.bin0x3FB0001019
esp_init_data_default.bin0x3FC0001020~1021
blank.bin0x3FE0001022~1023

最后那几个扇区,与上图Flash布局有些许出入,估计是因为SDK版本问题导致的?欢迎留言。

2、API

主要是以下三个API,读、写、以及写之前的扇区擦除

API是以32位,也就是4字节为数据类型,请让Flash读写是4字节对齐操作。

2.1、读-spi_flash_read

在这里插入图片描述

2.2、擦除-spi_flash_erase_sector

  1. 写Flash之前需要擦除。
  2. 参数是扇区号,不是内存地址。
    在这里插入图片描述

2.3、写-spi_flash_write

在这里插入图片描述

3、代码&ESP8266的大小端模式

u8 read_buff[64];
u32 write_buff[16]={1,2,3,4,5,6,7,8, 9,10,11,12, 13,14,15,16};

void ICACHE_FLASH_ATTR user_init(void)
{
	u8 i;

	uart_init(115200,115200);
	my_delay_ms(1000);						//等待串口稳定,避免起始数据错误
	system_soft_wdt_feed();					//喂狗,防止复位

	spi_flash_erase_sector(0xFF);			//擦除扇区
	spi_flash_write(0xFF*4096,(uint32 *)write_buff,16*4); 	//写16个32位数据
	spi_flash_read(0xFF*4096,(uint32 *)read_buff,16*4);		//读16个32位数据

	for(i=0;i<16;i++){						//打印读出来的数据,8位数据格式
		os_printf("\r\nwrite[%d]=%d,read[%d]=%d\r\n",i,write_buff[i],i,read_buff[i]);
		my_delay_ms(10);
	}
}



串口输出结果如下,可以看到u32类型的1、2、3、4在内存中存放的顺序。

ESP8266为小端模式。

大端?小端?
从低地址到高地址,横着写出来,你一读就对的是大端,不符合我们习惯的是小端。(大端—大众、小端—小众,我是这样记的~)
比如这个read数组,前4的是"1000",而实际应该是1,不符合习惯,故为小端。
P.S.小端:低地址存放数据的低字节;
在这里插入图片描述

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐