一、操作流程
初始化——》打开——》读/写——》保存——》关闭
1.NVS初始化
//函数作用:初始化NVS分区
//传参:
// 无
//返回值:
// ESP_OK 打开成功
esp_err_t nvs_flash_init(void)
2.打开命名空间
//函数作用:从NVS分区打开具有给定命名空间的非易失性存储
//传参:
// 1.namespace_name: 要打开的命名空间的名称
// 2.open_mode: 权限(NVS_READONLY只读、NVS_READWRITE读写)
// 3.out_handle: 返回句柄
//返回值:
// ESP_OK 打开成功
esp_err_t nvs_open(const char * namespace_name,
nvs_open_mode_t open_mode,
nvs_handle_t * out_handle)
3.数据读取
//函数作用:从命名空间中读取单个数据
//传参:
// 1.handle: 空间的句柄
// 2.key: 键名
// 3.out_value: 指向输出的指针
//返回值:
// ESP_OK 读取成功
esp_err_t nvs_get_i8 (nvs_handle_t handle, const char* key, int8_t* out_value);
esp_err_t nvs_get_u8 (nvs_handle_t handle, const char* key, uint8_t* out_value);
esp_err_t nvs_get_i16 (nvs_handle_t handle, const char* key, int16_t* out_value);
esp_err_t nvs_get_u16 (nvs_handle_t handle, const char* key, uint16_t* out_value);
esp_err_t nvs_get_i32 (nvs_handle_t handle, const char* key, int32_t* out_value);
esp_err_t nvs_get_u32 (nvs_handle_t handle, const char* key, uint32_t* out_value);
esp_err_t nvs_get_i64 (nvs_handle_t handle, const char* key, int64_t* out_value);
esp_err_t nvs_get_u64 (nvs_handle_t handle, const char* key, uint64_t* out_value);
//函数作用:从命名空间中读取字符串
//传参:
// 1.handle: 空间的句柄
// 2.key: 键名
// 3.out_value: 指向输出的指针
// 4.length: out_value的长度
//返回值:
// ESP_OK 读取成功
esp_err_t nvs_get_str ( nvs_handle_t handle,
const char* key,
char* out_value,
size_t* length);
4.数据写入
//函数作用:向命名空间中写入单个数据
//传参:
// 1.handle: 空间的句柄
// 2.key: 键名
// 3.value: 写入的数据
//返回值:
// ESP_OK 写入成功
esp_err_t nvs_set_i8 (nvs_handle_t handle, const char* key, int8_t value);
esp_err_t nvs_set_u8 (nvs_handle_t handle, const char* key, uint8_t value);
esp_err_t nvs_set_i16 (nvs_handle_t handle, const char* key, int16_t value);
esp_err_t nvs_set_u16 (nvs_handle_t handle, const char* key, uint16_t value);
esp_err_t nvs_set_i32 (nvs_handle_t handle, const char* key, int32_t value);
esp_err_t nvs_set_u32 (nvs_handle_t handle, const char* key, uint32_t value);
esp_err_t nvs_set_i64 (nvs_handle_t handle, const char* key, int64_t value);
esp_err_t nvs_set_u64 (nvs_handle_t handle, const char* key, uint64_t value);
//函数作用:向命名空间中写入字符串
//传参:
// 1.handle: 空间的句柄
// 2.key: 键名
// 3.value: 字符串地址
//返回值:
// ESP_OK 写入成功
esp_err_t nvs_set_str (nvs_handle_t handle, const char* key, const char* value);
5.数据删除
//函数作用:删除整个空间的数据
esp_err_t nvs_erase_all(nvs_handle_t handle);
//函数作用:删除空间中某个key的数据
esp_err_t nvs_erase_key(nvs_handle_t handle, const char* key);
5.保存更改
//函数作用:保存更改的内容
//传参:
// 1.handle: 空间的句柄
//返回值:
// ESP_OK 保存成功
esp_err_t nvs_commit(nvs_handle_t c_handle)
6.关闭命名空间
//函数作用:关闭打开的空间
//传参:
// 1.handle: 空间的句柄
//返回值:
// ESP_OK 关闭成功
void nvs_close(nvs_handle_t handle)
二、示例代码
#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_system.h"
#include "nvs_flash.h"
#include "nvs.h"
nvs_handle my_handle; //nvs flash存储句柄 wifi
char *ssid_key="ssid_str"; //ssid 存储位置
char *pwd_key="pwd_str"; //pwd 存储位置
uint32_t flash_read_len=100; //读取长度
static char wifi_ssid_str[50]="redmi"; //ssid 读取后存放数组
static char wifi_pwd_str[100]="23456789"; //pwd 读取后存放数组
void app_main(void)
{
// 初始化 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();
}
//**********************************写**************************************//
nvs_open("hx_list", NVS_READWRITE, &my_handle);//打开
nvs_set_str (my_handle, ssid_key, wifi_ssid_str);//写入ssid&pwd
nvs_set_str (my_handle, pwd_key, wifi_pwd_str);
nvs_commit(my_handle);//保存
nvs_close(my_handle);//关闭
//**********************************读**************************************//
nvs_open("hx_list", NVS_READWRITE, &my_handle);//打开
nvs_get_str (my_handle, ssid_key, wifi_ssid_str, (size_t *)&flash_read_len);//读取
nvs_get_str (my_handle, pwd_key, wifi_pwd_str, (size_t *)&flash_read_len);
nvs_commit(my_handle);//提交,必须提交才能写入NVS
nvs_close(my_handle);//关闭
//**********************************删**************************************//
nvs_open("hx_list", NVS_READWRITE, &my_handle);//打开
nvs_erase_all(my_handle);//擦除
nvs_commit(my_handle);//保存
nvs_close(my_handle);//关闭
return;
}
注意:nvs_get_str读取数据时容易失败,重复读取两次并加延时可以避免
//读取 避免读取失败
nvs_get_str (my_handle, ssid_key, wifi_ssid_str, (size_t *)&flash_read_len);
sys_delay_ms(100);
nvs_get_str (my_handle, ssid_key, wifi_ssid_str, (size_t *)&flash_read_len);
sys_delay_ms(100);
nvs_get_str (my_handle, pwd_key, wifi_pwd_str, (size_t *)&flash_read_len);
sys_delay_ms(100);
nvs_get_str (my_handle, pwd_key, wifi_pwd_str, (size_t *)&flash_read_len);