esp32 nvs blob
时间: 2024-04-07 16:22:11 浏览: 186
ESP32 NVS(Non-Volatile Storage)Blob是一种存储在ESP32芯片非易失存储器中的数据结构。它可以存储各种类型的数据,例如配置参数、设备身份信息、网络设置等。NV Blob是一个自定义的二进制结构,可以存储ESP32芯片需要的所有数据,其大小可以在编写代码时进行定义。
在ESP32中,通过使用NVS Blob API,可以轻松地创建、读取、更新和删除NVS Blob。具体来说,可以使用以下API:
- nvs_blob_create() - 创建一个新的NVS Blob。
- nvs_blob_read() - 读取NVS Blob中的数据。
- nvs_blob_write() - 向NVS Blob中写入数据。
- nvs_blob_erase() - 删除NVS Blob中的数据。
- nvs_blob_get_size() - 获取NVS Blob的大小。
通过使用ESP32 NVS Blob,可以方便地存储和管理设备的配置参数和其他数据,从而提高设备的效率和可靠性。
相关问题
esp32 nvs备份
ESP32的Non-Volatile Storage (NVS)是一种存储系统,可以在ESP32中存储和检索数据,即使在断电重启后也可以保留数据。备份ESP32的NVS数据非常重要,以防止意外丢失数据。
以下是备份ESP32 NVS数据的步骤:
1. 使用ESP-IDF提供的nvs_flash_init函数初始化NVS系统。
2. 使用nvs_open函数打开NVS命名空间。
3. 使用nvs_get_blob函数获取要备份的数据。要备份所有数据,可以使用nvs_get_all函数。
4. 关闭NVS命名空间并调用nvs_flash_deinit函数。
5. 将备份数据写入外部存储器,如SD卡。可以使用ESP-IDF提供的SD卡驱动程序来实现。
下面是一个简单的示例代码,演示如何备份ESP32的NVS数据到SD卡上:
```c
#include "esp_system.h"
#include "nvs_flash.h"
#include "nvs.h"
#include "driver/sdmmc_host.h"
#include "sdmmc_cmd.h"
#include "esp_vfs_fat.h"
#define NVS_NAMESPACE "my_namespace"
#define SD_MOUNT_POINT "/sdcard"
void backup_nvs_data() {
// 初始化NVS系统
esp_err_t ret = nvs_flash_init();
if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND) {
ESP_ERROR_CHECK(nvs_flash_erase());
ret = nvs_flash_init();
}
ESP_ERROR_CHECK(ret);
// 打开NVS命名空间
nvs_handle_t nvs_handle;
ret = nvs_open(NVS_NAMESPACE, NVS_READONLY, &nvs_handle);
ESP_ERROR_CHECK(ret);
// 获取要备份的数据
size_t nvs_size = 0;
ret = nvs_get_blob(nvs_handle, "my_data", NULL, &nvs_size);
ESP_ERROR_CHECK(ret);
uint8_t* nvs_data = malloc(nvs_size);
ret = nvs_get_blob(nvs_handle, "my_data", nvs_data, &nvs_size);
ESP_ERROR_CHECK(ret);
// 关闭NVS命名空间
nvs_close(nvs_handle);
// 卸载SD卡
esp_vfs_fat_sdmmc_unmount();
// 挂载SD卡
sdmmc_host_t host = SDMMC_HOST_DEFAULT();
sdmmc_slot_config_t slot_config = SDMMC_SLOT_CONFIG_DEFAULT();
esp_vfs_fat_sdmmc_mount_config_t mount_config = {
.format_if_mount_failed = true,
.max_files = 5
};
sdmmc_card_t* card;
esp_err_t card_ret = esp_vfs_fat_sdmmc_mount(SD_MOUNT_POINT, &host, &slot_config, &mount_config, &card);
ESP_ERROR_CHECK(card_ret);
// 将备份数据写入SD卡
FILE* fp = fopen("/sdcard/nvs_backup.bin", "wb");
fwrite(nvs_data, nvs_size, 1, fp);
fclose(fp);
// 卸载SD卡
esp_vfs_fat_sdmmc_unmount();
// 释放内存
free(nvs_data);
}
```
在这个例子中,我们使用了ESP-IDF提供的SD卡驱动程序来挂载和卸载SD卡,并使用标准的文件IO函数来写入备份数据。
请注意,此代码仅用于演示目的。在实际应用中,您需要根据您的需求进行修改和调整。
esp32 nvs读写idf完整代码
下面是ESP32 NVS读写的完整代码示例,使用ESP-IDF开发框架:
```
#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_system.h"
#include "nvs_flash.h"
#include "nvs.h"
#define STORAGE_NAMESPACE "storage"
void nvs_write(void)
{
nvs_handle my_handle;
esp_err_t err = nvs_open(STORAGE_NAMESPACE, NVS_READWRITE, &my_handle);
if (err != ESP_OK) {
printf("Error (%s) opening NVS handle!\n", esp_err_to_name(err));
} else {
// Write values including string, binary and integer
uint8_t buf[] = {0x00, 0x01, 0x02, 0x03};
err = nvs_set_i32(my_handle, "int_val", 123);
err = nvs_set_str(my_handle, "string_val", "Hello world");
err = nvs_set_blob(my_handle, "blob_val", buf, sizeof(buf));
printf((err != ESP_OK) ? "Failed to write NVS\n" : "NVS write done\n");
// Close handle
nvs_close(my_handle);
}
}
void nvs_read(void)
{
nvs_handle my_handle;
esp_err_t err = nvs_open(STORAGE_NAMESPACE, NVS_READWRITE, &my_handle);
if (err != ESP_OK) {
printf("Error (%s) opening NVS handle!\n", esp_err_to_name(err));
} else {
// Read values including string, binary and integer
int int_val;
char str_val[20];
size_t size = sizeof(str_val);
uint8_t buf[4];
err = nvs_get_i32(my_handle, "int_val", &int_val);
err = nvs_get_str(my_handle, "string_val", str_val, &size);
err = nvs_get_blob(my_handle, "blob_val", buf, &size);
printf("int_val=%d, string_val=%s, blob_val=%02x%02x%02x%02x\n", int_val, str_val, buf[0], buf[1], buf[2], buf[3]);
// Close handle
nvs_close(my_handle);
}
}
void app_main()
{
// Initialize NVS
esp_err_t err = nvs_flash_init();
if (err == ESP_ERR_NVS_NO_FREE_PAGES || err == ESP_ERR_NVS_NEW_VERSION_FOUND) {
// NVS partition was truncated and needs to be erased
printf("NVS partition was truncated and needs to be erased\n");
err = nvs_flash_erase();
if (err != ESP_OK) {
printf("Failed to erase NVS partition (%s)\n", esp_err_to_name(err));
return;
}
// Retry nvs_flash_init
err = nvs_flash_init();
}
if (err != ESP_OK) {
printf("Failed to initialize NVS (%s)\n", esp_err_to_name(err));
return;
}
// Write and read NVS values
nvs_write();
nvs_read();
}
```
此代码在ESP32上使用NVS Flash存储写入和读取值,并使用ESP-IDF开发框架进行编写。在使用此代码之前,应该先在ESP32上执行`nvs_flash_init()`进行初始化。
阅读全文