ESP32-S3 的 NVS(Non-Volatile Storage)
ESP32-S3 是一款集成了 Wi-Fi 和蓝牙功能的系统级芯片,适用于各种物联网应用。其中,NVS(Non-Volatile Storage,非易失性存储)是 ESP32-S3 的一个重要特性,它允许我们在芯片的闪存中存储和读取数据,即使在断电后,这些数据也不会丢失。
NVS 的基本概念
NVS 是 ESP32 flash(flash就是板子上的一个存储芯片,如下图👇)中的一个存储分区,我们可以在其中存储键值对(key-value pairs)。每个键值对都有一个唯一的键名(key name)和一个对应的值(value)。这种组合类似于哈希表的(key-value)对应结构,或者可以把他理解成电脑上的文件📁,文件名和内容的对应关系😇,并且使用NVS的API不光可以对NVS分区进行操作,也可以对任意的分区进行操作
至于为什么NVS只适合存储key-value这种int类型,这与它的存储结构有关,感兴趣可以去看一下官方的文档,里面讲的很清楚👇
非易失性存储库
初始化NVS分区
在开始使用NVS之前,需要先初始化整个NVS分区。通常在应用程序启动阶段完成这一操作
#include <nvs_flash.h>
void app_main()
{
esp_err_t err = nvs_flash_init();
if (err == ESP_ERR_NVS_NO_FREE_PAGES || err == ESP_ERR_NVS_NEW_VERSION_FOUND) {
// 若由于分区版本更新或无可用页,尝试格式化并重新初始化
ESP_ERROR_CHECK(nvs_flash_erase());
err = nvs_flash_init();
}
ESP_ERROR_CHECK(err);
}
使用 NVS 存储数据
在 ESP-IDF 中,我们可以使用 nvs_set_*
函数来存储数据。例如,我们可以使用 nvs_set_i32
函数来存储一个整数:
// 存储数据
nvs_handle_t my_handle;
esp_err_t err = nvs_open("storage", NVS_READWRITE, &my_handle); //打开命名空间
if (err == ESP_OK) {
err = nvs_set_i32(my_handle, "key", 42);
if (err == ESP_OK) {
err = nvs_commit(my_handle);
}
nvs_close(my_handle);
}
在这个例子中,我们首先打开了一个名为 “storage” 的 NVS 名称空间,然后在其中存储了一个键名为 “key”、值为 42的键值对。
而nvs_commit()
函数的主要作用是将所有挂起的更改写入NVS。当你在NVS中设置一个键值对后,这个更改首先被存储在内存中。只有当你调用nvs_commit()
函数时,这些更改才会被写入闪存💾。
所以,如果你在调用nvs_commit()
函数之前重启了设备,那么你在NVS中设置的所有键值对都将丢失。因此,每次在NVS中设置键值对后,都应该调用nvs_commit()
函数,以确保这些更改在设备重启后仍然存在。
使用 NVS 读取数据
我们可以使用 nvs_get_*
函数来读取数据。例如,我们可以使用 nvs_get_i32
函数来读取一个整数:
// 检索数据
nvs_handle_t my_handle;
esp_err_t err = nvs_open("storage", NVS_READWRITE, &my_handle);
if (err == ESP_OK) {
int32_t value;
err = nvs_get_i32(my_handle, "key", &value);
if (err == ESP_OK) {
printf("Value = %d\n", value);
}
nvs_close(my_handle);
}
在这个例子中,我们首先打开了一个名为 “storage” 的 NVS 名称空间,然后从其中读取了键名为 “key” 的键值对的值。
删掉NVS上的数据
想要删掉NVS上的数据很简单,非常暴力😎只要把flash格式化掉就好
在idf的终端上输入下面这个命令👇
idf.py erase-flash
Flash擦除🧹完成👌