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

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

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

  • 30
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
NV(Non-Volatile)S是一种非易失性存储器技术,可以在断电或关机后保持存储数据。在嵌入式系统和物联网设备中,由于需要长时间运行和断电存储数据的要求,NV存储器技术变得越来越重要。 NVSNon-Volatile Storage)是一种基于闪存的非易失性存储技术,可以在ESP32等嵌入式系统中使用。在ESP32中,可以使用NVS来存储配置信息,例如WiFi连接信息、设备ID等。下面是使用ESP32中的NVS进行存储和读取数据的步骤: 1. 定义NVS命名空间和键值对 NVS命名空间是一个字符串,用于区分不同的NVS存储区域。键值对是一个字符串和一个数据类型的组合,用于存储和读取数据。例如,可以定义一个名为"storage"的NVS命名空间和一个名为"ssid"的键值对来存储WiFi连接的SSID: ``` #define STORAGE_NAMESPACE "storage" #define SSID_KEY "ssid" nvs_handle_t nvs_handle; esp_err_t err; // 打开NVS命名空间 err = nvs_open(STORAGE_NAMESPACE, NVS_READWRITE, &nvs_handle); if (err != ESP_OK) { // 错误处理 } // 存储SSID err = nvs_set_str(nvs_handle, SSID_KEY, "my_wifi_ssid"); if (err != ESP_OK) { // 错误处理 } // 提交更改 err = nvs_commit(nvs_handle); if (err != ESP_OK) { // 错误处理 } ``` 2. 读取NVS存储的数据 可以使用nvs_get_xxx函数从NVS中读取数据,其中xxx是数据类型,例如nvs_get_str用于读取字符串类型的数据。例如,可以读取之前存储的WiFi连接的SSID: ``` char ssid[32]; size_t ssid_size = sizeof(ssid); // 读取SSID err = nvs_get_str(nvs_handle, SSID_KEY, ssid, &ssid_size); if (err != ESP_OK) { // 错误处理 } ``` 3. 关闭NVS命名空间 最后,需要使用nvs_close函数关闭NVS命名空间: ``` nvs_close(nvs_handle); ``` 注意,在使用NVS存储数据时,需要考虑数据类型、数据长度、错误处理等问题,以确保数据的正确性和可靠性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

宁子希

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

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

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

打赏作者

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

抵扣说明:

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

余额充值