ESP32入门-NVS的flash读写测试

硬件

① 开发板型号: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.实验说明
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值