Arduino框架下对ESP32 NVS非易失性存储解读以及应用示例

Arduino框架下对ESP32 NVS非易失性存储解读以及应用示例


NVS非易失性存储库介绍

非易失性存储 (NVS) 库主要用于在 flash 中存储键值格式的数据。本文档将详细介绍 NVS 常用的一些概念。

  • 引用:https://docs.espressif.com/projects/esp-idf/zh_CN/latest/esp32/api-reference/storage/nvs_flash.html

NVS 最适合存储一些较小的数据,而非字符串或二进制大对象 (BLOB) 等较大的数据。如需存储较大的 BLOB 或者字符串,请考虑使用基于磨损均衡库的 FAT 文件系统。

在Arduino框架下,NVS区域在分区表上的体现:

分区表配置文件位置:C:\Users\Administrator\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.4\tools\partitions

在这里插入图片描述

  • Arduino IDE分区表配置信息选项:
    在这里插入图片描述
NVS区域具体在每一份分区表当中的体现

app13Mfat3M.csv为例:

在这里插入图片描述

在Arduino环境下,不同的分区表默认配置的NVS容量都是5000 Byte(字节)

NVS 存储对象

像用户的一般数据存储例如wifi信息,eeprom库也是使用了其中的一部分。

用户如何使用NVS 来存储数据

相关头文件位置:C:\Users\Administrator\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.4\libraries\Preferences\src

在这里插入图片描述

  • 获取数据函数

在这里插入图片描述

        int8_t getChar(const char* key, int8_t defaultValue = 0);
        uint8_t getUChar(const char* key, uint8_t defaultValue = 0);
        int16_t getShort(const char* key, int16_t defaultValue = 0);
        uint16_t getUShort(const char* key, uint16_t defaultValue = 0);
        int32_t getInt(const char* key, int32_t defaultValue = 0);
        uint32_t getUInt(const char* key, uint32_t defaultValue = 0);
        int32_t getLong(const char* key, int32_t defaultValue = 0);
        uint32_t getULong(const char* key, uint32_t defaultValue = 0);
        int64_t getLong64(const char* key, int64_t defaultValue = 0);
        uint64_t getULong64(const char* key, uint64_t defaultValue = 0);
        float_t getFloat(const char* key, float_t defaultValue = NAN);
        double_t getDouble(const char* key, double_t defaultValue = NAN);
        bool getBool(const char* key, bool defaultValue = false);
        size_t getString(const char* key, char* value, size_t maxLen);
        String getString(const char* key, String defaultValue = String());
        size_t getBytesLength(const char* key);
        size_t getBytes(const char* key, void * buf, size_t maxLen);
  • 读取数据函数
        size_t putChar(const char* key, int8_t value);
        size_t putUChar(const char* key, uint8_t value);
        size_t putShort(const char* key, int16_t value);
        size_t putUShort(const char* key, uint16_t value);
        size_t putInt(const char* key, int32_t value);
        size_t putUInt(const char* key, uint32_t value);
        size_t putLong(const char* key, int32_t value);
        size_t putULong(const char* key, uint32_t value);
        size_t putLong64(const char* key, int64_t value);
        size_t putULong64(const char* key, uint64_t value);
        size_t putFloat(const char* key, float_t value);
        size_t putDouble(const char* key, double_t value);
        size_t putBool(const char* key, bool value);
        size_t putString(const char* key, const char* value);
        size_t putString(const char* key, String value);
        size_t putBytes(const char* key, const void* value, size_t len);
  • 数据操作函数
 bool clear();
 bool remove(const char * key);

操作流程

在这里插入图片描述

键值对使用注意事项

  • NVS 的操作对象为键值对,其中键是 ASCII 字符串,当前支持的最大键长为 15 个字符。(键的名字不要取过长的字符串名)
  • 在同一个命名空间(NameSpace)当中,键名不能有重复。

示例程序

本示例展示的是对结构体数据对象进行存储,比起使用eeprom库来实现,在操作上来讲要简单的多。

/*
This example shows how to use Preferences (nvs) to store a
structure.  Note that the maximum size of a putBytes is 496K
or 97% of the nvs partition size.  nvs has signifcant overhead,
so should not be used for data that will change often.
*/ 
#include <Preferences.h>//引入头文件
Preferences prefs;

typedef struct {
  uint8_t hour;
  uint8_t minute;
  uint8_t setting1;
  uint8_t setting2;
} schedule_t;

void setup() {
  Serial.begin(115200);
  delay(2000);
  while(!Serial);
  prefs.begin("schedule"); // use "schedule" namespace
  Serial.println(prefs.freeEntries());//获取该"schedule" 命名空间大小:414
  uint8_t content[] = {9, 30, 235, 255, 20, 15, 0, 1}; // two entries
  prefs.putBytes("schedule", content, sizeof(content));//将数组存储进"schedule"命名的空间
  size_t schLen = prefs.getBytesLength("schedule");
  char buffer[schLen]; // prepare a buffer for the data
  prefs.getBytes("schedule", buffer, schLen);//获取"schedule"命名的空间数据的大小
  if (schLen % sizeof(schedule_t)) { // 对存储的数据进行校验
    log_e("Data is not correct size!");
    return;
  }
  schedule_t *schedule = (schedule_t *) buffer; // 用结构体指针指向buffer数组名,将数组成员赋值给结构体成员变量
  Serial.printf("%02d:%02d %d/%d\n", 
    schedule[1].hour, schedule[1].minute,
    schedule[1].setting1, schedule[1].setting2);//20:15 0/1
  
  Serial.printf("%02d:%02d %d/%d\n", 
    schedule[0].hour, schedule[0].minute,
    schedule[0].setting1, schedule[0].setting2);//09:30 235/255
     
  schedule[2] = {8, 30, 20, 21}; // add a third entry (unsafely)
  
// force the struct array into a byte array
  prefs.putBytes("schedule", schedule, 3*sizeof(schedule_t)); 
  schLen = prefs.getBytesLength("schedule");
  char buffer2[schLen];
  prefs.getBytes("schedule", buffer2, schLen);
  for (int x=0; x<schLen; x++) Serial.printf("%02X ", buffer[x]);//09 1E EB FF 14 0F 00 01 08 1E 14 15
  Serial.println(); 
}

void loop() {}
  • 串口打印信息
    在这里插入图片描述
  • 2
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ESP32 Arduino的掉电存储是指在ESP32芯片断电或重启后,能够保留一些数据或状态的功能。ESP32芯片具有内置的非易失性存储器(NVS),可以用于存储配置参数、状态信息等。 在ESP32 Arduino,可以使用EEPROM库来操作NVS,实现掉电存储的功能。EEPROM库提供了一些函数,如EEPROM.begin()用于初始化NVS,EEPROM.write()用于写入数据,EEPROM.read()用于读取数据等。 以下是一个简单的示例代码,演示如何使用EEPROM库在ESP32 Arduino进行掉电存储: ```arduino #include <EEPROM.h> // 定义存储的数据结构 struct ConfigData { int param1; float param2; }; void setup() { EEPROM.begin(sizeof(ConfigData)); // 初始化NVS,参数为数据结构的大小 } void loop() { // 读取数据 ConfigData config; EEPROM.get(0, config); // 从NVS的地址0开始读取数据到config // 对读取的数据进行处理 // ... // 写入数据 config.param1 = 123; config.param2 = 3.14; EEPROM.put(0, config); // 将config写入NVS的地址0处 // 等待一段时间,确保数据写入NVS delay(100); // 断电或重启后,重新读取数据 EEPROM.get(0, config); // 继续处理数据 // ... } ``` 在这个示例,我们定义了一个ConfigData结构来存储配置参数。在setup函数,通过EEPROM.begin函数初始化NVS,参数为ConfigData结构的大小。在loop函数,我们先使用EEPROM.get函数读取NVS的数据,然后对数据进行处理,然后使用EEPROM.put函数将修改后的数据写回NVS。 需要注意的是,ESP32的NVS有限,不适合存储大量数据。同时,频繁的写入操作可能会降低NVS的寿命。因此,在使用掉电存储时,需要注意数据大小和写入频率,以确保系统的稳定性和可靠性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值