这个实验的功能是使用乐鑫提供的 nvs 库去对 spi flash 的读写。 这个实验的代码为工程“3_9_nvs”目录。

3.9.1. 实验内容

(1) 学习 NVS 库函数接口
(2) 学习 NVS 存储/读取多种类型数据

3.9.2. ESP32 NVS 功能介绍

NVS总的来说,就是非易失性存储,类似MCU EEPROM,但实际上调用ESP32这些函数,数据是存储在FLASH中的。它的管理方式类似数据库的表,在NVS里面可以存储很多个不同的表,每个表下面有不同的键值,每个键值可以存储8位,16位,32位等等不同的数据类型,但不能是浮点数。
NVS相关API使用方法如下:
(1)初始化
调用“nvs_flash_init();”,如果失败可调用“nvs_flash_erase()”擦除NVS,然后再次初始化。
(2)打开一个表
nvs_open(“List”, NVS_READWRITE, &my_handle);
这个API第一个形参为一个字符串,可称为表名。第二个是读写模式,可选读写或者只读,第三个是当前打开的表的句柄。如此声明:“nvs_handle my_handle; ”。后面对表里面的键值进行读写,都需要输入键值所在表的句柄。
(3)读写
读:vs_get_i8(my_handle, “nvs_i8”, &nvs_i8);
读写不同的数据类型需要调用不同的API,类似的API有:“nvs_get_i16”,“nvs_get_u32”等等
形参方面,第一个是表的句柄,第二个是键值,第三个则是对应的变量的指针,如“nvs_i8”是个“int8_t”类型的变量。

     写:nvs_set_i8(my_handle, "nvs_i8", nvs_i8);基本跟读差不多,注意的是第三个形参变成了对应的变量,而不是变量的指针。

(4)提交与关闭
提交:
    nvs_commit(my_handle);
关闭:
    nvs_close(my_handle);

3.9.3. ESP32 NVS 函数介绍

NVS 使用的流程如图:

 NVS 初始化函数
函数定义:
esp_err_t nvs_flash_init(void); 参数说明:无
返回值:ESP_OK(成功) 。

 NVS 擦除函数
函数定义:
esp_err_t nvs_flash_erase(void); 参数说明:无
返回值:ESP_OK(成功) 。

 NVS 打开命名空间函数
函数定义:
esp_err_t nvs_open(const char* name, nvs_open_mode open_mode, nvs_handle out_handle); 参数说明:
char
name:命名空间的名字,最长支持 15 个字符
nvs_open_mode open_mode:打开的模式,NVS_READWRITE (读写模式)和 NVS_READONLY(只读模式) nvs_handle *out_handle:这个是返回值,用于后面的读写操作的句柄。
返回值:ESP_OK(成功)。

 NVS 写入数据函数
写入数据就是数据写入到 NVS 里,每个函数都是三个参数,参数 1 是 nsv_open 返回的句柄,参数 2
就是保存数据的键值,参数 3 就是要保存的数据。

esp_err_t nvs_set_i8 (nvs_handle handle, const char*key, int8_t value); esp_err_t nvs_set_u8 (nvs_handle handle, const char*key, uint8_t value); esp_err_t nvs_set_i16 (nvs_handle handle, const char* key, int16_t value); esp_err_t nvs_set_u16 (nvs_handle handle, const char* key, uint16_t value); esp_err_t nvs_set_i32 (nvs_handle handle, const char* key, int32_t value); esp_err_t nvs_set_u32 (nvs_handle handle, const char* key, uint32_t value); esp_err_t nvs_set_i64 (nvs_handle handle, const char* key, int64_t value); esp_err_t nvs_set_u64 (nvs_handle handle, const char* key, uint64_t value); esp_err_t nvs_set_str (nvs_handle handle, const char* key, const char* value);

当调用了上面的任意一个或者多个函数写入数据后,必须调用 nvs_commit 提交才能真正地写入数据,函数 定义如下,函数的参数就是 nsv_open 返回的句柄:
esp_err_t nvs_commit(nvs_handle handle);

 NVS 读取函数
读取函数就是把数据从 NVS 读取出来,除了最后一个函数 nvs_get_str 外,都是都是三个参数,参数 1 是 nsv_open 返回的句柄,参数 2 就是保存数据的键值,参数 3 就是要保存的数据的指针,最后一个函数 nvs_get_str 多了第 4 个参数是长度的指针。

esp_err_t nvs_get_i8(nvs_handle handle, const char* key, int8_t* out_value); esp_err_t nvs_get_u8(nvs_handle handle, const char* key, uint8_t* out_value); esp_err_t nvs_get_i16(nvs_handle handle, const char* key, int16_t* out_value); esp_err_t nvs_get_u16(nvs_handle handle, const char* key, uint16_t* out_value); esp_err_t nvs_get_i32(nvs_handle handle, const char* key, int32_t* out_value); esp_err_t nvs_get_u32(nvs_handle handle, const char* key, uint32_t* out_value); esp_err_t nvs_get_i64(nvs_handle handle, const char* key, int64_t* out_value); esp_err_t nvs_get_u64(nvs_handle handle, const char*key, uint64_t*out_value);

 擦除键值
函数定义:
esp_err_t nvs_erase_key(nvs_handle handle, const char* key); 参数说明:
nvs_handle handle:是 nsv_open 函数返回的句柄。
char* key:保存数据的键值 返回值:ESP_OK(成功)。

 擦除整个命名空间函数
函数定义:
esp_err_t nvs_erase_all(nvs_handle handle); 参数说明:
nvs_handle handle:是 nsv_open 函数返回的句柄。
返回值:ESP_OK(成功)。

 关闭命名空间函数
函数定义:
void nvs_close(nvs_handle handle); 参数说明:
nvs_handle handle:是 nsv_open 函数返回的句柄。
返回值:ESP_OK(成功)。

3.9.4. 代码讲解

使用 vs code 展开本实验的工程目录,如下图:

我们的这个实验,只有一个源文件 app_main.c,在源文件的入口函数 app_main()里,通过 nvs 的初始 化、打开、读取数据、修改数据后写入数据、数据提交和交闭 NVS,最后延时 10 秒系统重启,重新操作。 代码如下,代码都有带注释,使用到的函数前面都有讲解:

//用户函数入口,相当于 main 函数
void app_main()
//初始化 NVS
esp_err_t  err  = nvs_flash_init();
if  (err  ==  ESP_ERR_NVS_NO_FREE_PAGES ||
//发现新版本
//擦除 ESP_ERROR_CHEC
//打开
err =  nvs_open("hx_list",  NVS_READWRITE,  &my_handle); if  (err  !=  ESP_OK) {
ESP_LOGE(TAG,  "opening  NVS  Error  (%s)!\n", esp_err_to_name(err));
}  else {
ESP_LOGI(TAG,  "NVS  open OK");//读取数据,并通过 LOG 输出
err = nvs_get_i8(my_handle, "nvs_i8",  &nvs_i8); if(err==ESP_OK)  ESP_LOGI(TAG,  "nvs_i8  =  %d\n",  nvs_i8); err = nvs_get_i16(my_handle, "nvs_i16", &nvs_i16); if(err==ESP_OK) ESP_LOGI(TAG, "nvs_i16  =  %d\n",  nvs_i16); err = nvs_get_u32(my_handle, "nvs_u32", &nvs_u32); if(err==ESP_OK) ESP_LOGI(TAG, "nvs_u32  =  %d\n",  nvs_u32); err  =  nvs_get_u64(my_handle,  "nvs_u64", &nvs_u64);
if(err==ESP_OK)  ESP_LOGI(TAG,  "nvs_u64  =  %llu\n", nvs_u64);
//字符串
err = nvs_get_str (my_handle, str_key, str_value, &len);//100 是读取最大长度 if(err==ESP_OK)  ESP_LOGI(TAG,  "nvs_str  =  %s\n", str_value);//数据递增 1,修改字段的值 nvs_i8+=1;
nvs_i16
err  =  nvs_set_i8(my_handle,  "nvs_i8",
if(err!=ESP_OK) ESP_LOGE(TAG,
err = nvs_set_i16(my_handle, if(err!=ESP_OK) ESP_LOGE(TAG,
err = nvs_set_u32(my_handle, if(err!=ESP_OK) ESP_LOGE(TAG,
err = nvs_set_u64(my_handle,
err  =  nvs_set_str  (my_handle,  str_key, str_value);//提交写入 NVS
err  = nvs_commit(my_handle);
if(err!=ESP_OK)  ESP_LOGE(TAG,  "nvs_commit Error");//关闭 nvs_close(my_handle);
}
//10 秒复位倒计时
for (int i  =  10;  i  >=  0;  i--)

3.9.5. 实验过程

配置下载串口、波特率、编绎和程序下载的详细过程请往回看 3.1.4,在这个实验里都是一笔带过。 (1) 把开发板通过 USB 线接到电脑上,通过设备管理器查看生成的串口。开发板在我们演示电脑上生成的是 COM3。
(2) 在 menuconfig 菜单里配置下载程序串口。提供的例程配置的串口是 COM3,波特率为 921600。
(3) 通过 make all 编绎工程。
(4) 当编绎通过之后,使用命令 make flash 把程序下载到开发板上。或者参考 2.3.2 节,使用工具 下载。
(5) 使用串口工具打开开发板生成的串口,默认的波特率是 115200,通过按下 RESET 键后观察串口工 具的输出(拨码开关一定要打开)。串口工具在目录:.\开发软件\串口工具-sscom32.rar。

最后推荐一款开发套件,可以手淘扫码查看。

ESP32数据存储 nvs相关推荐

  1. Arduino ESP32 flash数据存储结构

    Arduino ESP32 flash数据存储结构 分区表官方文档:<分区表> 想了解ESP32 flash数据存储结构需要从分区表开始了解.一点类似一台电脑上挂载的硬盘一样. 分区表保存 ...

  2. 如何使用Arduino ESP32将数据存储到MicroSD(软SPI和硬SPI)

    如何使用Arduino ESP32将数据存储到MicroSD(软SPI和硬SPI) 主要针对使用这个库:github地址:https://github.com/nhatuan84/esp32-micr ...

  3. 【ESP32-IDF】04-2 存储-NVS

    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. 英特尔 QLC 3D NAND 数据存储

    英特尔 QLC 3D NAND 数据存储 NAND是什么 由于SSD固态硬盘的普及,NAND这个词逐渐进入用户们的视线.许多厂商都在产品宣传中提到3D NAND颗粒等词汇,对于普通用户来讲,完全不知道 ...

  5. Android的数据存储方式

    1.Shared Preferences 2.文件存储数据 3.数据库 4.Content Provider存储数据,是所有应用程序之间数据存储和检索的一个桥梁,它的作用就是使得各个应用程序之间实现数 ...

  6. mysql更改数据库数据存储目录_MySQL更改数据库数据存储目录

    MySQL数据库默认的数据库文件位于/var/lib/mysql下,有时候由于存储规划等原因,需要更改MySQL数据库的数据存储目录.下文总结整理了实践过程的操作步骤. 1:确认MySQL数据库存储目 ...

  7. AS3.0编程 So本地数据存储(“超级cookies”)--AS3:Local SharedObject

    Flash影片运行过程中,大多数的数据都存储于影片本身,一旦影片被关闭,这些数据也就从内存中被清除掉,下次运行时,数据将从头开始.若想存储数据或者让客户端的多个影片共享同一组数据,就要想办法把数据存储 ...

  8. Java中数据存储方式

    2019独角兽企业重金招聘Python工程师标准>>> 1. 寄存器(register).这是最快的存储区,因为它位于不同于其他存储区的地方--处理器内部.但是寄存器的数量极其有限, ...

  9. IOS数据存储之文件沙盒存储

    前言: 之前学习了数据存储的NSUserDefaults,归档和解档,对于项目开发中如果要存储一些文件,比如图片,音频,视频等文件的时候就需要用到文件存储了.文件沙盒存储主要存储非机密数据,大的数据. ...

最新文章

  1. bootstrap layui 两种分页的实现
  2. java properties更新_对Java配置文件Properties的读取、写入与更新操作
  3. Java程序(类的抽象与封装)
  4. 解决burpsuite无法对DVWA环境(本地环境)进行抓包
  5. mybatis源码刨析总结
  6. android 监听网络状态
  7. .NET Core 跨平台 串口通讯 ,Windows/Linux 串口通讯
  8. RISC-V踩坑记----__builtin_clz((x)库函数的应用
  9. 中国十大科技进展2项,世界十大科技进展6项生物相关;相比工程,生物与国际差距还是较大...
  10. C++_004异常处理
  11. php事件检测,细说浏览器特性检测(2)-通用事件检测_jquery
  12. EL4.1配置文件管理浅谈(1)
  13. 67. 查询分页数据(2)
  14. CRMEB首届UI设计大赛报名啦!
  15. ThinkPHP学生社团管理系统
  16. WhatsApp使用教程
  17. 怎样把flac转换成mp3?四个步骤完成
  18. 富文本框TinyMCE4.8上传本地图片基本配置(前端篇)
  19. N卡版本查询--Windows命令下:
  20. 批一批淘宝首页的源代码

热门文章

  1. Spoken English
  2. icoformat.8bi 64位插件_【茶末余香】这款PS真牛完整官方无精简超强插件集成
  3. 毫米、微米、英寸、目数对照表
  4. 一个项目的经验教训:关于打乱和拆分数据
  5. github下载文件时让输入用户名和密码
  6. 电力监控系统在嘉兴万豪酒店的设计与应用
  7. vscode中文备注出现方框标注显示此字符非ascii字符如何取消
  8. 计算机神奇的画图教学反思,《画图》信息技术教学反思
  9. R语言︱函数使用技巧(循环、if族/for、switch、repeat、ifelse、stopifnot)
  10. 关于esxtop命令下%RUN、%RDY和%MLMTD三个参数的详细解读