硬件
① 开发板型号:ESP32-WROOM-32
2.软件设计
2.1代码逻辑
①初始化NVS —> ②创建数据表 —> ③ 读写对应数据表中数据
2.1 软件应用说明
1.NVS使用说明
NVS官方说明
NVS 最适合存储一些较小的数据,而非字符串或二进制大对象 (BLOB) 等较大的数据。如需存储较大的 BLOB 或者字符串,请考虑使用基于磨损均衡库的 FAT 文件系统。
2.函数介绍
① NVS 初始化函数: nvs_flash_init(void);
② NVS 擦除函数: nvs_flash_erase(void);
③ NVS 打开命名空间函数: nvs_open();
//name:命名空间名称,最长 15 字符
//open_mode:打开模式 NVS_READWRITE :读写模式 NVS_READONLY:只读模式
//out_handle:NVS 句柄
//return : ESP_OK:打开成功
nvs_open(const char* name, nvs_open_mode_t open_mode, nvs_handle_t *out_handle);
3.初始化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
// Retry nvs_flash_init
ESP_ERROR_CHECK(nvs_flash_erase());
err = nvs_flash_init();
}
4.通过Ctrl+Shift+P创建新的NVS组件(命名自己定义)我的组件mins
可能会出现无法找到nvs_flash.h头文件问题
我是在创建的组件的中的CMakeLists.txt中改
idf_component_register(SRCS "flash.c" //改为对应的自己的.c文件
INCLUDE_DIRS "include"
PRIV_REQUIRES nvs_flash)
5.flash.c文件内容,在main.c中调用void flash_NVS_init(void)函数就好了;
#include <stdio.h>
#include "esp_err.h"
#include "flash.h"
#include "esp_log.h"
#include "nvs_flash.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_spi_flash.h"
void flash_NVS_init(void)
{
//打印系统信息
printf("[APP] Startup..\n");
printf("[APP] Free memory: %d bytes\n", esp_get_free_heap_size());
printf("[APP] IDF version: %s\n", esp_get_idf_version());
//初始化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
// Retry nvs_flash_init
ESP_ERROR_CHECK(nvs_flash_erase());
err = nvs_flash_init();
}
ESP_ERROR_CHECK( err );
//新建一个表的句柄
nvs_handle_t my_handle;
//打开当前的表
err = nvs_open("storage", NVS_READWRITE, &my_handle);
if (err != ESP_OK) {
printf("Error (%s) opening NVS handle!\n", esp_err_to_name(err));
} else {
printf("Done\n");
//读数据操作
int32_t restart_counter = 0; // value will default to 0, if not set yet in NVS
err = nvs_get_i32(my_handle, "restart_counter", &restart_counter);
//处理读的情况
switch (err) {
case ESP_OK:
printf("Done\n");
printf("Restart counter = %d\n", restart_counter);
break;
case ESP_ERR_NVS_NOT_FOUND:
printf("The value is not initialized yet!\n");
break;
default :
printf("Error (%s) reading!\n", esp_err_to_name(err));
}
// 写数据操作
restart_counter++;
err = nvs_set_i32(my_handle, "restart_counter", restart_counter);
//提交并保存表的内容
err = nvs_commit(my_handle);
//关闭
nvs_close(my_handle);
}
printf("\n");
//这里是我添加的,使能这个会擦除NVS刚写入的数据,如果不使能,默认会一直写
//ESP_ERROR_CHECK(nvs_flash_erase());
// Restart module
//设置10s后模块重启
for (int i = 10; i >= 0; i--) {
printf("Restarting in %d seconds...\n", i);
vTaskDelay(1000 / portTICK_PERIOD_MS);
}
printf("Restarting now.\n");
fflush(stdout);
esp_restart();
}
6.实验说明