ESP32数据存储 nvs
这个实验的功能是使用乐鑫提供的 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相关推荐
- Arduino ESP32 flash数据存储结构
Arduino ESP32 flash数据存储结构 分区表官方文档:<分区表> 想了解ESP32 flash数据存储结构需要从分区表开始了解.一点类似一台电脑上挂载的硬盘一样. 分区表保存 ...
- 如何使用Arduino ESP32将数据存储到MicroSD(软SPI和硬SPI)
如何使用Arduino ESP32将数据存储到MicroSD(软SPI和硬SPI) 主要针对使用这个库:github地址:https://github.com/nhatuan84/esp32-micr ...
- 【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 ...
- 英特尔 QLC 3D NAND 数据存储
英特尔 QLC 3D NAND 数据存储 NAND是什么 由于SSD固态硬盘的普及,NAND这个词逐渐进入用户们的视线.许多厂商都在产品宣传中提到3D NAND颗粒等词汇,对于普通用户来讲,完全不知道 ...
- Android的数据存储方式
1.Shared Preferences 2.文件存储数据 3.数据库 4.Content Provider存储数据,是所有应用程序之间数据存储和检索的一个桥梁,它的作用就是使得各个应用程序之间实现数 ...
- mysql更改数据库数据存储目录_MySQL更改数据库数据存储目录
MySQL数据库默认的数据库文件位于/var/lib/mysql下,有时候由于存储规划等原因,需要更改MySQL数据库的数据存储目录.下文总结整理了实践过程的操作步骤. 1:确认MySQL数据库存储目 ...
- AS3.0编程 So本地数据存储(“超级cookies”)--AS3:Local SharedObject
Flash影片运行过程中,大多数的数据都存储于影片本身,一旦影片被关闭,这些数据也就从内存中被清除掉,下次运行时,数据将从头开始.若想存储数据或者让客户端的多个影片共享同一组数据,就要想办法把数据存储 ...
- Java中数据存储方式
2019独角兽企业重金招聘Python工程师标准>>> 1. 寄存器(register).这是最快的存储区,因为它位于不同于其他存储区的地方--处理器内部.但是寄存器的数量极其有限, ...
- IOS数据存储之文件沙盒存储
前言: 之前学习了数据存储的NSUserDefaults,归档和解档,对于项目开发中如果要存储一些文件,比如图片,音频,视频等文件的时候就需要用到文件存储了.文件沙盒存储主要存储非机密数据,大的数据. ...
最新文章
- bootstrap layui 两种分页的实现
- java properties更新_对Java配置文件Properties的读取、写入与更新操作
- Java程序(类的抽象与封装)
- 解决burpsuite无法对DVWA环境(本地环境)进行抓包
- mybatis源码刨析总结
- android 监听网络状态
- .NET Core 跨平台 串口通讯 ,Windows/Linux 串口通讯
- RISC-V踩坑记----__builtin_clz((x)库函数的应用
- 中国十大科技进展2项,世界十大科技进展6项生物相关;相比工程,生物与国际差距还是较大...
- C++_004异常处理
- php事件检测,细说浏览器特性检测(2)-通用事件检测_jquery
- EL4.1配置文件管理浅谈(1)
- 67. 查询分页数据(2)
- CRMEB首届UI设计大赛报名啦!
- ThinkPHP学生社团管理系统
- WhatsApp使用教程
- 怎样把flac转换成mp3?四个步骤完成
- 富文本框TinyMCE4.8上传本地图片基本配置(前端篇)
- N卡版本查询--Windows命令下:
- 批一批淘宝首页的源代码
热门文章
- Spoken English
- icoformat.8bi 64位插件_【茶末余香】这款PS真牛完整官方无精简超强插件集成
- 毫米、微米、英寸、目数对照表
- 一个项目的经验教训:关于打乱和拆分数据
- github下载文件时让输入用户名和密码
- 电力监控系统在嘉兴万豪酒店的设计与应用
- vscode中文备注出现方框标注显示此字符非ascii字符如何取消
- 计算机神奇的画图教学反思,《画图》信息技术教学反思
- R语言︱函数使用技巧(循环、if族/for、switch、repeat、ifelse、stopifnot)
- 关于esxtop命令下%RUN、%RDY和%MLMTD三个参数的详细解读