NVS

文章目录

  • NVS
    • 1. NVS
      • 1.1 概述
      • 1.2 键值对
      • 1.2 命名空间
      • 1.3 NVS使用流程
        • 1.3.1 配置分区表
        • 1.3.2 擦除nvs空间
        • 1.3.3 初始化nvs空间
        • 1.3.4 获取nvs空间的操作句柄
        • 1.3.4 读写nvs空间
        • 1.3.4 提交修改
        • 1.3.5 关闭nvs空间
    • 2. 使用案例
      • 2.1 单变量操作
      • 2.2 复杂结构体操作
    • 3. 参考资料

1. NVS

1.1 概述

   NVS全称是非易失性存储。用在flash中以键值对的形成存储数据。

  NVS 适合存储一些小数据,如果对象占用空间比较大,使用负载均衡的fat文件系统

  如果nvs分区被截断,比如更改分区表布局的时候,应该擦除分区内容。可以使用idf.py erase_flash 命令擦除flash上全部的内容

1.2 键值对

  key最大键长为154字符

  value可以使用以下数据类型

  • 整数型:uint8_t、int8_t、uint16_t、int16_t、uint32_t、int32_t、uint64_t 和 int64_t;
  • 以 \0 结尾的字符串;
  • 可变长度的二进制数据 (BLOB)

1.2 命名空间

  为了减少不同组件之间键名的潜在冲突,NVS 将每个键值对分配给一个命名空间。命名空间的命名规则遵循键名的命名规则,即最多可占 15 个字符。命名空间的名称在调用 nvs_open 或 nvs_open_from_part 中指定,调用后将返回一个不透明句柄,用于后续调用 nvs_get_、nvs_set_ 和 nvs_commit 函数。这样,一个句柄关联一个命名空间,键名便不会与其他命名空间中相同键名冲突。请注意,不同 NVS 分区中具有相同名称的命名空间将被视为不同的命名空间。

1.3 NVS使用流程

1.3.1 配置分区表

  配置分区表: 我们也可以使用默认的分区表。默认分区表中nvs大小是24k(0x6000),可以根据自己需要对nvs空间进行修改

1.3.2 擦除nvs空间

   如果nvs空间已经满了,或者希望清空原来的数据,就需要执行这一步

nvs_flash_erase()

1.3.3 初始化nvs空间

  nvs 空间使用前要进行初始化


nvs_flash_init();

1.3.4 获取nvs空间的操作句柄

   对nvs空间进行操作的时候,是使用句柄实现的。

  同时,为了尽可能减少键值对的冲突,nvs引入了命名空间的概念,不同命名空间下的key捕获产生冲突。

  同时也要在这里配置对nvs空间进行操作的权限,分为读和读写两种

nvs_handle_t my_handle;
nvs_open("storage", NVS_READWRITE, &my_handle);

1.3.4 读写nvs空间

  按照不同的数据类型,对数据进行get和set操作

nvs_set_i8(nvs_handle_thandle, const char *key, int8_t value);
nvs_set_u8(nvs_handle_thandle, const char *key, uint8_t value);
nvs_set_i16(nvs_handle_thandle, const char *key, int16_t value);
nvs_set_u16(nvs_handle_thandle, const char *key, uint16_t value);
nvs_set_i32(nvs_handle_thandle, const char *key, int32_t value);
nvs_set_u32(nvs_handle_thandle, const char *key, uint32_t value);
nvs_set_i64(nvs_handle_thandle, const char *key, int64_t value);
nvs_set_u64(nvs_handle_thandle, const char *key, uint64_t value);
nvs_set_str(nvs_handle_thandle, const char *key, const char *value);
nvs_get_blob(nvs_handle_thandle, const char *key, void *out_value, size_t *length);

1.3.4 提交修改


nvs_commit(my_handle); //在修改被提交之前,是不会写入到falsh中的

1.3.5 关闭nvs空间

 nvs_close(my_handle);

2. 使用案例

2.1 单变量操作


/*Name:     Sketch1.inoCreated: 2021/4/12 18:46:05Author:   hp
*/// the setup function runs once when you press reset or power the board#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_system.h"
#include "nvs_flash.h"
#include "nvs.h"void setup() {//01 初始化nvs flashesp_err_t err = nvs_flash_init();//02 如果nvs flash 满了就清空if (err == ESP_ERR_NVS_NO_FREE_PAGES || err == ESP_ERR_NVS_NEW_VERSION_FOUND) {// NVS partition was truncated and needs to be erased// Retry nvs_flash_initESP_ERROR_CHECK(nvs_flash_erase());err = nvs_flash_init();}ESP_ERROR_CHECK(err);//03 打开nvs,配置句柄printf("\n");printf("Opening Non-Volatile Storage (NVS) handle... ");nvs_handle my_handle;err = nvs_open("storage", NVS_READWRITE, &my_handle);if (err != ESP_OK) {printf("Error (%s) opening NVS handle!\n", esp_err_to_name(err));}else {printf("Done\n");//04 读操作printf("Reading restart counter from NVS ... ");int32_t restart_counter = 0; // value will default to 0, if not set yet in NVSerr = nvs_get_i32(my_handle, "restart_counter", &restart_counter);switch (err) {case ESP_OK:printf("Done\n");printf("Restart counter = %d\n", restart_counter);break;case ESP_ERR_NVS_NOT_FOUND:printf("The value is not initialized yet!\n");break;default:printf("Error (%s) reading!\n", esp_err_to_name(err));}//05 写操作printf("Updating restart counter in NVS ... ");restart_counter++;err = nvs_set_i32(my_handle, "restart_counter", restart_counter);printf((err != ESP_OK) ? "Failed!\n" : "Done\n");//06 提交修改printf("Committing updates in NVS ... ");err = nvs_commit(my_handle);printf((err != ESP_OK) ? "Failed!\n" : "Done\n");//07 关闭nvsnvs_close(my_handle);}printf("\n");// Restart modulefor (int i = 10; i >= 0; i--) {printf("Restarting in %d seconds...\n", i);vTaskDelay(1000 / portTICK_PERIOD_MS);}printf("Restarting now.\n");fflush(stdout);esp_restart();}void loop() {}

2.2 复杂结构体操作

/*Name:      Sketch1.inoCreated: 2021/4/12 18:46:05Author:   hp
*/// the setup function runs once when you press reset or power the board#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_system.h"
#include "nvs_flash.h"
#include "nvs.h"#define NameSpace "store"  //定义命名空间标志
#define BufferSize 20   //定义buffer大小
#define Name "nvs"  //定义要被使用的nvs区域的名称
#define Key "wrt"  //定义键名typedef  uint32_t DataType; //给数据类型起别名
DataType wrt[5] = { 0,1,2,3,4 }; //用于测试写入的数据
DataType buffer[20]; //用于测试读取的buffer
size_t required_sise; //用于读取数据的时候,说明数据的大小void setup() {//01 初始化分区表命名为nvs的区域//如果使用nvs_flash_init 是对所有type为data,subtype为nvs的区域进行初始化操作esp_err_t err;  //定义错误标志位err=nvs_flash_init_partition(Name);if (err == ESP_OK){printf("初始化成功\n");//02 打开nvs区域,并配置句柄nvs_handle my_handle;  //定义句柄//这里也是如果使用nvs_open 就会让句柄指向所有type为data,subtype为nvs的区域err = nvs_open_from_partition(Name, NameSpace, NVS_READWRITE, &my_handle);if (err != ESP_OK){printf("打开失败 !\n");}else{printf("打开成功\n");//03 执行写入操作nvs_set_blob(my_handle, Key, wrt, sizeof(wrt));//04 确认写入//写入操作在进行commit之前,都没有进行真正的执行err = nvs_commit(my_handle);if (err != ESP_OK){printf("写入失败\n");}else{printf("写入成功\n");//05 进行数据的读取//05-1 确定数据的长度//有的时候,我们并不知道要读取的数据要多长,因此要先确认一下长度//对于nvs_get_blob函数,如果输入的length为0,会有0字节的数据被存储到out_value中//不过键key对于的值value的大小,会被写到length中,这样我们就知道了value的长度//如果我们已经提前知道了这个数据的长度,可以直接进行读取,跳过这一步err = nvs_get_blob(my_handle, Key, NULL, &required_sise);if (err != ESP_OK){printf("数据不存在\n");}else{//05-2 读取数据err = nvs_get_blob(my_handle, Key,buffer, &required_sise);if (err != ESP_OK){printf("get error %s\n", esp_err_to_name(err));}else{for (int i = 0; i < required_sise / sizeof(DataType); i++){printf("%d\n", buffer[i]);}}}}}}else{printf("初始化失败\n");}}void loop() {}

3. 参考资料

[1] 非易失性存储库

【ESP32-IDF】04-2 存储-NVS相关推荐

  1. Arduino ESP32将数据保存到NVS中

    Arduino ESP32将数据保存到NVS中 该功能类似AVR单片机里面的EEPROM存储区域. 关于ESP32分区表参考<分区表> Preferences中数据以键值对(key - v ...

  2. ESP32( IDF平台)+MAX30102 配合Pyqt上位机实现PPG波形显示与心率计算

    0 引言 年前买了一个MAX30102模块,在家无聊做了这个demo对一些相关的知识进行学习. 主要学习的内容: 光体积变化描记图(Photoplethysmogram, PPG)测量原理学习. ES ...

  3. ESP32 IDF LVGL8.0 flash 外部字库显示 中文显示

    我从stm32一路学到esp32,发现这款芯片挺好玩的,主要是还是stm32太贵了,stm32主要是很多坑有人遇到了,并给出了解决方法,esp32这方面就少点,有时候找不到的,只能靠自己了. 本文使用 ...

  4. ESP32 IDF LVGL 1.47寸圆角屏幕测试

    前言 基于ESP32 IDF框架移植的LVGL,IDF版本为4.3.1,LVGL版本为8.1.1.屏幕为中景园的1.47寸172x320分辨率的圆角IPS,驱动芯片为st7789v3. B站视频效果: ...

  5. esp32系列(11):ESP32 IDF平台 mpu6050 DMP 驱动移植及测试上位机开发

    目录 1 DMP 官方库介绍 1.1 DMP与MPL(Motion Processing Libraries)功能 1.2 运行MPL的硬件要求 1.3 Motion Driver 6.12 的架构 ...

  6. ESP32数据存储 nvs

    这个实验的功能是使用乐鑫提供的 nvs 库去对 spi flash 的读写. 这个实验的代码为工程"3_9_nvs"目录. 3.9.1. 实验内容 (1) 学习 NVS 库函数接口 ...

  7. 深入浅出计算机组成原理04:存储和IO系统

    目录 1. 存储器层次结构全景 1.1 关于Cache 1.2 访问层次 1.3 不同存储器访问延时与成本 2. 局部性原理 2.1 时间局部性 2.2 空间局部性 2.3 局部性原理使用实例 3. ...

  8. 老宇哥带你玩转 ESP32:04 串口玩起来是真方便

    今天我们来玩儿串口. 概述 ESP32 芯片有3 个 UART 接口,UART0,UART1,UART2,支持异步通信和 IrDA,通信速度最高可达 5Mbps,3 个接口可以被 DMA 或 CPU ...

  9. esp32-c3 (esp32 IDF) wife设置中文wifi名

    1.进入esp32模板目录下的WiFi目录拷贝到你的项目目录 cd .\esp-idf\examples\wifi\getting_started\softAP\main 2.用编译器编写.c文件 s ...

最新文章

  1. 多线程join(加入)
  2. Maven详解(五)------ 坐标的概念以及依赖管理
  3. linux 修改图片的尺寸
  4. 十个行为把你变成糟糕的程序员
  5. java读取TXT文件的方法
  6. 液冷计算机组装,电脑水冷散热器原理解密及安装方法
  7. 计算机网络-自顶向下方法 7th 5.4 BGP协议总结
  8. android 发送csv邮件,无法在android中使用电子邮件发送.csv文件
  9. 阿里云服务器ECS云盾提醒网站被WebShell木马后门分析与对策
  10. Request.Querystring中文乱码问题解决
  11. 多个dwg文件批量合并_插件分享 | 多张单独内容DWG快速合并到一个文件
  12. dotnet core在Linux下运行的步骤
  13. java网页保存成pdf_JavaScript+Java实现HTML页面转为PDF文件保存的方法
  14. Biological Psychiatry:亚属连接预测经颅磁刺激位点抗抑郁疗效
  15. jsp显示中文文件名的图片 详细出处参考:http://www.jb51.net/article/37149.htm
  16. [ARC086]F - Shift and Decrement 位运算+数论+DP
  17. 中文核心期刊、科技核心期刊、CSCD核心期刊区别
  18. Linux 硬盘初始化
  19. linux 配置trac界面显示为中文,Trac的安装和配置
  20. 信息化App在「左」,数字化App在「右」

热门文章

  1. opencv3/C++ 机器学习-决策树/DTrees
  2. HackTheGame 游戏全攻略(各关攻略文章汇总)
  3. codeforces 581B Luxurious Houses(线段树点更新,区间查询)
  4. 3D漫游结合行业应用,实现企业营销价值
  5. Max-Margin Regularization for Chamfer Matching
  6. 第一个报表(简单滴)
  7. vscode如何设置自动保存
  8. 【Codeforces Gym - 101635C Macarons 】【矩阵快速幂+状压】【dfs时间换空间】
  9. vue中echarts使用案例:饼图(可直接使用)
  10. 服务端开发基础知识点