QQ2355892364的个人空间 https://www.eechina.com/space-uid-157723.html [收藏] [复制] [RSS]

博客

ESP8266模块开发资料与开发问题解决

已有 908 次阅读2019-6-14 17:41

一、存储芯片W25Q系列
esp8266-12f
w25q 系列生产的加工的商家很多,但是里面的分布和命名规则都是一样的。比如华邦的w25q64,spi通讯接口,64就是指 64Mbit 也就是 8M 的容量。而我们平时的8266-12f的 32Mbit 就是 4M 容量。
以 w25q32 为例,里面的存储分布。w25q32把4M容量分为了 64 块,每一块又分为 16 个扇区,而每个扇区占 4K 大小。由此可计算到,w25q32有 32Mbit / 8 * 1024 / 16 / 4 = 64 块 ,有 64 * 16 = 1024 个扇区。
注:1B=8 Bit ,1KB=1024B ,1MB=1024KB
二、ESP8266内存分布
• 程序区:代码编译⽣成的 bin ⽂件,烧录到 Flash 占⽤的区域,请勿改写;
• 系统参数区: esp_iot_sdk 中底层⽤于存放系统参数的区域,请勿改写;
• 用户参数区:上层应⽤程序存储⽤户参数的区域。开发者请根据实际使⽤的 Flash size 设置,可 以参考⽂档“2A-ESP8266__IOT_SDK_User_Manual” 中的 “Flash Map” ⼀章。
2.1 Non-FOTA
2.2 FOTA

三、Flash读写接口
SPI Flash 接口位于 /ESP8266_NONOS_SDK/include/spi_flash.h。
system_param_xxx 接⼝位于 /ESP8266_NONOS_SDK/include/user_interface.h。
3.1 spi_flash_erase_sector
3.2 spi_flash_write
注意: 
    • Flash 请先擦再写。 
    • Flash 读写必须 4 字节对齐。
示例代码: 
    #define N 0x7C
    uint32 data[M];
    spi_flash_erase_sector (N);
    spi_flash_write (N*4*1024, data, M*4);
3.3 spi_flash_read
3.4 system_param_save_with_protect
3.5 system_param_load

示例代码:
/***************Flash 读写结构体声明***************/
struct esp_platform_saved_param {
// 服务器参数
uint8 devkey[40];
uint8 token[40];
uint8 activeflag;
char server_domain[64];
ip_addr_t server_ip;
int server_port;
 // AP参数
uint8 ssid[32];
uint8 password[64];
int authmode;
uint8 ssid_hidden;
// 填充
uint8 pad[2];
};
/***************Flash 读写结构体定义***************/
struct esp_platform_saved_param esp_param;
/***************Flash 写入数据***************/
system_param_save_with_protect(0x7D, &esp_param, sizeof(esp_param));
/***************Flash 读出数据***************/
system_param_load(0x7D, 0, &esp_param, sizeof(esp_param)); 
四、Flash读写保护
4.1 Espressif Flash读写保护示例
4.1.1 实现原理
Espressif Flash 读写保护⽰例,使⽤三个 sector(扇区)实现(每 sector 4KB),提供 4KB 的可 靠存储空间。 将 sector 1 和 sector 2 作为数据 sector,轮流读写,始终分别存放“本次”数据和“前⼀次”数据, 确保了⾄少有⼀份数据存储安全; sector 3 作为 flag sector,标志最新的数据存储 sector。
保护机制如下:
1. 初始上电时,数据存储在 sector 2 中,从 sector 2 中将数据读到 RAM。
2. 第⼀次写数据时,将数据写⼊ sector 1。 此时若突然掉电, sector 1写⼊失败, sector 2 & 3数据未改变;重新上电时,仍是从 sector 2 中 读取数据,不影响使⽤。
我:
3. 改写 sector 3,将标志置为 0,表⽰数据存于 sector 1。 此时若突然掉电, sector 3 写⼊失败, sector 1 & 2 均存有⼀份完整数据;重新上电时,因 sector 3 ⽆有效 flag,默认从 sector 2 中读取数据,则仍能正常使⽤,只是未能包含掉电前对 sector 1 写⼊的数据。
4. 再⼀次写数据时,先从 sector 3 读取 flag,若 flag 为0,则上次数据存于 sector 1,此次应将数 据写⼊ sector 2;若 flag 为⾮ 0,则认为上次数据存于 sector 2,此次应将数据写⼊ sector 1。 此时若写数据出错,请参考步骤 2、 3的说明,同理。
5. 写⼊ sector 1(或 sector 2)完成后,才会写 sector 3,重置 flag。 注意: 只有数据扇区(sector 1或 sector 2)写完之后,才会写 flag sector(sector 3),这样即使 flag sector 写⼊出错,两个数据扇区都已存有完整数据内容,目前默认会读取 sector 2。
4.1.2 软件示例
在 IOT_Demo 中,使⽤ 0x3C000 开始的 4 个 sector(每 sector 4KB),作为⽤户参数存储区。 其中 0x3D000、 0x3E000、 0x3F000 这 3 个 sector 实现了读写保护的功能,并存储了应⽤级参数 esp_platform_saved_param。
图中“有读写保护的存储区”, IOT_Demo 中建议调⽤ system_param_load 和 system_param_save_with_protect 进⾏读写。
system_param_load - 读 Flash ⽤户参数区数据
system_param_save_with_protect - 写 Flash ⽤户参数区数据

路过

鸡蛋

鲜花

握手

雷人

评论 (0 个评论)

facelist

您需要登录后才可以评论 登录 | 立即注册

关于我们  -  服务条款  -  使用指南  -  站点地图  -  友情链接  -  联系我们
电子工程网 © 版权所有   京ICP备16069177号 | 京公网安备11010502021702
返回顶部