12-ESP32-S3 的 NVS(Non-Volatile Storage)

本文介绍了ESP32-S3芯片的NVS非易失性存储功能,包括其基本概念、如何在ESP-IDF中使用nvs_set_i32和nvs_get_i32进行数据存储和读取,以及初始化和数据持久性的注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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擦除🧹完成👌
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

宁子希

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

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

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

打赏作者

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

抵扣说明:

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

余额充值