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.bin | 0x00000 | 0~15 |
eagle.irom0text.bin | 0x10000 | 16~207 |
blank.bin | 0x3FB000 | 1019 |
esp_init_data_default.bin | 0x3FC000 | 1020~1021 |
blank.bin | 0x3FE000 | 1022~1023 |
最后那几个扇区,与上图Flash布局有些许出入,估计是因为SDK版本问题导致的?欢迎留言。
2、API
主要是以下三个API,读、写、以及写之前的扇区擦除。
API是以32位,也就是4字节为数据类型,请让Flash读写是4字节对齐操作。
2.1、读-spi_flash_read
2.2、擦除-spi_flash_erase_sector
- 写Flash之前需要擦除。
- 参数是扇区号,不是内存地址。
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.小端:低地址存放数据的低字节;