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。
在这里插入图片描述
最后推荐一款开发套件,可以手淘扫码查看。
在这里插入图片描述

  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

bytechip

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值