NVS 介绍
NVS: Non-volatile storage , 即将数据存储到 flash 中, 掉电或重启后数据仍然存在,  flash 类似于 PC 上磁盘.
ESP8266 和 ESP32 上提供 nvs 接口给用户,  来保存和读取用户数据. 具体参考 nvs.h
nvs 更详细的说明请参考: NVS 文档
NVS 优势

接口更加安全
相比较于 spi_flash_read 和 spi_flash_write 等接口,  NVS 不直接操作 address. 对于终端用户而已, 更加安全.
例如: 应用复杂一点, 容易 spi_flash_write(address, src, size) 不小心写到同一个地址, 或地址写覆盖, 而导致长时间 debug

接口使用接近用户习惯
NVS 接口类似于电脑上操作文件一样:
打开文件(nvs_open), 写文件(nvs_set_xxx), 保存文件(nvs_commit), 关闭文件(nvs_close)
打开文件(nvs_open), 读取文件(nvs_get_xxx), 关闭文件(nvs_close)

擦写均衡, 使 flash 寿命更长
NVS 在操作少量数据上,  NVS 分区更大时,  擦写均衡表现的更为明显.
例如: flash 一个 sector 为 4KB,  NVS 分配大小为一个 sector, 写同一个 64 Bytes 数据到 flash, 分别比较 spi_flash_xxx 和 nvs 写 64 次

spi_flash_write: 每次写 flash 前, 需擦除 flash. 对应: 64 次擦除 flash, 64 次写 flash
nvs: nvs 内部有擦写均衡, 有标志位记录当前有效存储. 如第一次擦除 sector, 再写 sector 0-63 Byte, 第二次写 sector 64-127 Bytes, 第 64 次(4KB/64Bytes) 写完 sector 最后一个 64 Byte. 对应: 1 次擦除 flash, 64 次写 flash
这样 NVS 减少 64 倍擦除操作, 对 flash 寿命有较大提升.
在 NVS 分区更大, 存储信息少时, 表现的更为明显.

NVS 写
更多参考:  nvs.h
void nvs_write_data_to_flash(void)
{
    nvs_handle handle;
    static const char *NVS_CUSTOMER = "customer data";
    static const char *DATA1 = "param 1";
    static const char *DATA2 = "param 2";
    static const char *DATA3 = "param 3";

int32_t value_for_store = 666;

wifi_config_t wifi_config_to_store = {
        .sta = {
            .ssid = "store_ssid:hello_kitty",
            .password = "store_password:1234567890",
        },
    };

printf("set size:%u\r\n", sizeof(wifi_config_to_store));
    ESP_ERROR_CHECK( nvs_open( NVS_CUSTOMER, NVS_READWRITE, &handle) );
    ESP_ERROR_CHECK( nvs_set_str( handle, DATA1, "i am a string.") );
    ESP_ERROR_CHECK( nvs_set_i32( handle, DATA2, value_for_store) );
    ESP_ERROR_CHECK( nvs_set_blob( handle, DATA3, &wifi_config_to_store, sizeof(wifi_config_to_store)) );

ESP_ERROR_CHECK( nvs_commit(handle) );
    nvs_close(handle);

}
123456789101112131415161718192021222324252627
NVS 读
更多参考:  nvs.h
void nvs_read_data_from_flash(void)
{
    nvs_handle handle;
    static const char *NVS_CUSTOMER = "customer data";
    static const char *DATA1 = "param 1";
    static const char *DATA2 = "param 2";
    static const char *DATA3 = "param 3";

uint32_t str_length = 32;
    char str_data[32] = {0};
    int32_t value = 0;
    wifi_config_t wifi_config_stored;
    memset(&wifi_config_stored, 0x0, sizeof(wifi_config_stored));
    uint32_t len = sizeof(wifi_config_stored);

ESP_ERROR_CHECK( nvs_open(NVS_CUSTOMER, NVS_READWRITE, &handle) );

ESP_ERROR_CHECK ( nvs_get_str(handle, DATA1, str_data, &str_length) );
    ESP_ERROR_CHECK ( nvs_get_i32(handle, DATA2, &value) );
    ESP_ERROR_CHECK ( nvs_get_blob(handle, DATA3, &wifi_config_stored, &len) );

printf("[data1]: %s len:%u\r\n", str_data, str_length);
    printf("[data2]: %d\r\n", value);
    printf("[data3]: ssid:%s passwd:%s\r\n", wifi_config_stored.sta.ssid, wifi_config_stored.sta.password);

nvs_close(handle);
}
123456789101112131415161718192021222324252627
其他说明

不限于上面功能, nvs.h 中提供更多接口给用户使用
可参考 esp-idf  nvs blob demo 来测试相关接口和使用
NVS 说明文档
--------------------- 
作者:ustccw 
来源:CSDN 
原文:https://blog.csdn.net/ustccw/article/details/84636394 
版权声明:本文为博主原创文章,转载请附上博文链接!

ESP8266/ESP32 NVS 基本操作相关推荐

  1. ESP8266/ESP32 + MicroPython (一) 初识

    Arduino 大概来说是基于 c.c++.java 的,程序需要编译再上传,单一用途还算顺溜,但是如果有一些比较灵活的场合,就没有解释型环境来的方便. Python 也是基于 c.c++,但是默认是 ...

  2. 利用CH340C制作MicroPython ESP8266,ESP32的下载器-改进型

    简 介: 本文给出了利用CH340C芯片制作ESP32,ESP8266下载器的方法,并进行了实测测试. 关键词: ESP32,CH340C,MicroPython,下载器 ▌01 ESP的MicroP ...

  3. 测试CH340C的功能,制作MicroPython ESP8266,ESP32下载器

    ▌01 CH340C USB-UART芯片 CH340C 是沁恒公司的USB-UART的转换芯片.在 CH340E USB转串口 IC测试电路 测试了CH340E的基本功能.为了制作 ESP8266以 ...

  4. ESP8266/ESP32自动下载电路分析

    要让ESP8266/ESP32进入下载模式,需要在上电时拉低GPIO0,下载完成后又需要拉高GPIO0然后重新上电来正常运行. 一般在GPIO0上设置个按键来实现,但是每次都需要手动操作比较麻烦,其实 ...

  5. Arduino ESP8266/ESP32读取和改写MAC

    Arduino ESP8266/ESP32读取和改写MAC ESP8266/ESP32读取MAC示例代码 /*读取MAC*/ #ifdef ESP32#include <WiFi.h> # ...

  6. ESP8266/ESP32/nodeMcu/wemos D1 MINI开发板用TFT_eSPI库驱动ST7789(240*240)TFT显示屏

    ESP8266/ESP32/nodeMcu/wemos D1 MINI开发板用TFT_eSPI库驱动ST7789(240*240)TFT显示屏 材料 硬件连接 引脚连接表 引脚连接图 安装TFT_eS ...

  7. Arduino框架下对ESP32 NVS非易失性存储解读以及应用示例

    Arduino框架下对ESP32 NVS非易失性存储解读以及应用示例 NVS非易失性存储库介绍 非易失性存储 (NVS) 库主要用于在 flash 中存储键值格式的数据.本文档将详细介绍 NVS 常用 ...

  8. ESP32 NVS同windows文件系统的类比,附上一段NVS操作的代码解析

    ESP32 NVS同windows文件系统的类比,附上一段NVS操作的代码解析 下面例程是在NVS区域记录ESP32重启次数. 源码是改写Hello_world官方例程: #include <s ...

  9. 【丁丁历险记】ESP8266/ESP32发送数据到微信

    [丁丁历险记]全篇索引​​​​​​​​​​​​​​​​​​​​ 这里请允许我刷一个流氓,这篇文章的功能应该和[丁丁历险记]ESP8266/ESP32做微信遥控语音识别写在一起的.为了蹭点阅读量,更好的 ...

最新文章

  1. qpsk调制解调matlab_本科毕业设计课题—QPSK相干解调的MATLAB仿真(3)
  2. linux系统vim程序编译器,Linux学习:vim程序编辑器
  3. 装服务器的时候卡在复制文件,子域无法安装,卡在复制架构目录分区
  4. C语言实现希尔排序shell sort算法之二(附完整源码)
  5. 工作237:vuex取值
  6. 洛谷 P1440 求m区间内的最小值
  7. IPSEC 001 --- 原理简介
  8. 国科大学习资料--操作系统(杨力祥)--2017年思考题
  9. Android 11 系统修改默认字体
  10. 经纬度转换坐标接口 查询位置信息
  11. linux检测主机网络配置和状况的命令是,Linux常用网络状态测试命令
  12. SMing:2022年中青杯B题思路
  13. BOJ 1433 Tom 的潜望镜 优先队列+BFS
  14. 统计地铁一号线站点Python
  15. asp.net销售管理系统的设计和实现
  16. Android OKHttp 拦截器
  17. 微信公众平台开发测试账号配置URL失败的问题
  18. 正则表达式高级技巧背后的关键概念[SM]
  19. LSTM的数据集准备
  20. Eclipse中XML文件以表格形式显示

热门文章

  1. 给转型做技术的同学的一些建议
  2. Win10电脑录屏,视频有杂音,用耳机录音
  3. javax.servlet.jsp.JspFactory.getJspApplicationContext(Ljavax/servlet/ServletContext;)Ljavax/servlet/
  4. Java 数组升序降序排列Arrays.sort( )通俗易懂
  5. java socket绑定ip_ServerSocket 默认邦定IP
  6. 计算机模拟虫洞,Canvas 3D虫洞模拟
  7. 5图片展示_跃进小型宣传车价格 图片 配置
  8. 移动端访问mysql_java – (可能)数百个移动客户端访问MySQL数据库的最佳方法是什么?...
  9. Python之Pandas:利用pandas实现行数据添加,即将字典格式的数据,按照行数据,从头开始循环添加到dataframe中
  10. Python之selenium:selenium库的简介、安装、使用方法之详细攻略