NVS入门(基于ESP-IDF)

主要参考资料:
B站Up主 孤独的二进制《ESP32 存储篇 NVS 非易失性存储库》
ESP-IDF开发指南>API参考>非易失性存储: https://docs.espressif.com/projects/esp-idf/zh_CN/v5.1/esp32s3/api-reference/storage/nvs_flash.html

目录

  • 概述
  • NVS使用(以Wi-Fi账号密码为例)
    • 打开NVS
    • 存储数据
    • 读取数据
    • 关闭NVS
  • 迭代器
  • 获取状态信息

概述

怎么理解NVS(非易失性存储库)?其实可以把它与我们的电脑磁盘做类比。
NVS入门(基于ESP-IDF)_第1张图片

进一步拆解NVS,我们在分区表中可以看到NVS只有24K的空间,每个NVS有很多的4096B的Page,每个Page又是由32B的Entry组成。
这个Entry就是一个最小单位,即使你只存int8一个字节,也要消耗一个Entry。
一个Entry里会包括15B的key和value,以及CRC验证,因此NVS适合存储int类,而不是string或者Blob二进制。
NVS入门(基于ESP-IDF)_第2张图片

NVS使用(以Wi-Fi账号密码为例)

打开NVS

nvs_flash_init();

//打开时需要输入一个命名空间 、状态和一个句柄
char* namespace ="namespace";
nvs_handle_t handle;
nvs_open(namespace, NVS_READWRITE, handle);

存储数据

//定义一个结构体存储账号密码
typedef struct{
	char ssid[50];
	char password[50];
}ap_t;
ap_t aps_set;

//将准备好的账号密码复制进来
strcpy(aps_set.ssid,"wifi_ssid");
strcpy(aps_set.ssid,"wifi_password");

//往NVS存储数据,这个API需要输入handle、key、value和大小
nvs_set_blob(handel, "ap", aps_set, sizeof(aps_set));

读取数据

//定义一个结构体存储账号密码
typedef struct{
	char ssid[50];
	char password[50];
}ap_t;
ap_t aps_set;

//从NVS获取数据,这个API需要输入handle、key、value和大小的指针
size_t length = sizeof(aps_set);
nvs_get_blob(handel, "ap", aps_set, &length );

关闭NVS

//关闭时需要输入一个句柄
nvs_close(handle);
nvs_flash_deinit();

迭代器

迭代器简单说就是可以罗列出所有键值对

这是它的一些API
在这里插入图片描述
这是使用的一个案例

// Example of listing all the key-value pairs of any type under specified partition and namespace
 nvs_iterator_t it = NULL;
 esp_err_t res = nvs_entry_find(, , NVS_TYPE_ANY, &it);
 while(res == ESP_OK) {
     nvs_entry_info_t info;
     nvs_entry_info(it, &info); // Can omit error check if parameters are guaranteed to be non-NULL
     printf("key '%s', type '%d' \n", info.key, info.type);
     res = nvs_entry_next(&it);
 }
 nvs_release_iterator(it);

获取状态信息

可以查看有多少Entry和空余Entry,案例如下

// Example of nvs_get_stats() to get the number of used entries and free entries:
nvs_stats_t nvs_stats;
nvs_get_stats(NULL, &nvs_stats);
printf("Count: UsedEntries = (%d), FreeEntries = (%d), AllEntries = (%d)\n",
       nvs_stats.used_entries, nvs_stats.free_entries, nvs_stats.total_entries);

你可能感兴趣的:(嵌入式软件,c语言)