NVS入门(基于ESP-IDF)

主要参考资料:
B站Up主 孤独的二进制《ESP32 存储篇 NVS 非易失性存储库》
ESP-IDF开发指南>API参考>非易失性存储: https://docs.espressif.com/projects/esp-idf/zh_CN/v5.1/esp32s3/api-reference/storage/nvs_flash.html

目录

  • 概述
  • NVS使用(以Wi-Fi账号密码为例)
    • 打开NVS
    • 存储数据
    • 读取数据
    • 关闭NVS
  • 迭代器
  • 获取状态信息

概述

怎么理解NVS(非易失性存储库)?其实可以把它与我们的电脑磁盘做类比。
在这里插入图片描述

进一步拆解NVS,我们在分区表中可以看到NVS只有24K的空间,每个NVS有很多的4096B的Page,每个Page又是由32B的Entry组成。
这个Entry就是一个最小单位,即使你只存int8一个字节,也要消耗一个Entry。
一个Entry里会包括15B的key和value,以及CRC验证,因此NVS适合存储int类,而不是string或者Blob二进制。
在这里插入图片描述

NVS使用(以Wi-Fi账号密码为例)

打开NVS

nvs_flash_init();

//打开时需要输入一个命名空间 、状态和一个句柄
char* namespace ="namespace";
nvs_handle_t handle;
nvs_open(namespace, NVS_READWRITE, handle);

存储数据

//定义一个结构体存储账号密码
typedef struct{
	char ssid[50];
	char password[50];
}ap_t;
ap_t aps_set;

//将准备好的账号密码复制进来
strcpy(aps_set.ssid,"wifi_ssid");
strcpy(aps_set.ssid,"wifi_password");

//往NVS存储数据,这个API需要输入handle、key、value和大小
nvs_set_blob(handel, "ap", aps_set, sizeof(aps_set));

读取数据

//定义一个结构体存储账号密码
typedef struct{
	char ssid[50];
	char password[50];
}ap_t;
ap_t aps_set;

//从NVS获取数据,这个API需要输入handle、key、value和大小的指针
size_t length = sizeof(aps_set);
nvs_get_blob(handel, "ap", aps_set, &length );

关闭NVS

//关闭时需要输入一个句柄
nvs_close(handle);
nvs_flash_deinit();

迭代器

迭代器简单说就是可以罗列出所有键值对

这是它的一些API
在这里插入图片描述
这是使用的一个案例

// Example of listing all the key-value pairs of any type under specified partition and namespace
 nvs_iterator_t it = NULL;
 esp_err_t res = nvs_entry_find(<nvs_partition_name>, <namespace>, NVS_TYPE_ANY, &it);
 while(res == ESP_OK) {
     nvs_entry_info_t info;
     nvs_entry_info(it, &info); // Can omit error check if parameters are guaranteed to be non-NULL
     printf("key '%s', type '%d' \n", info.key, info.type);
     res = nvs_entry_next(&it);
 }
 nvs_release_iterator(it);

获取状态信息

可以查看有多少Entry和空余Entry,案例如下

// Example of nvs_get_stats() to get the number of used entries and free entries:
nvs_stats_t nvs_stats;
nvs_get_stats(NULL, &nvs_stats);
printf("Count: UsedEntries = (%d), FreeEntries = (%d), AllEntries = (%d)\n",
       nvs_stats.used_entries, nvs_stats.free_entries, nvs_stats.total_entries);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/322522.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

get_reg_by_offset函数

get_reg_by_offset函数如下&#xff1a; 在建立了寄存器模型后&#xff0c;可以直接通过层次引用的方式访问寄存器&#xff1a; rm.invert.read(...); 但是出于某些原因&#xff0c;如果依然要使用地址来访问寄存器模型&#xff0c;那么此时可以使用get_reg_by_offset函数通过…

部署一款开源的交互审计系统—Next Terminal

博客地址 部署一款开源的交互审计系统—Next Terminal-雪饼 (xue6ing.cn)https://xue6ing.cn/archives/bu-shu-yi-kuan-kai-yuan-de-jiao-hu-shen-ji-xi-tong--next-terminal Next Terminal是什么&#xff1f; Next Terminal是一个开源的交互审计系统&#xff0c;具有以下主…

Linux(适合开发人员参考)

Linux的概述 先了解Unix Unix是一个强大的多用户、多任务操作系统。于1969年在AT&T的贝尔实验室开发。UNIX的商标权由国际开放标准组织&#xff08;The Open Group&#xff09;所拥有。UNIX操作系统是商业版&#xff0c;需要收费&#xff0c;价格比Microsoft Windows正版…

移动端开发进阶之蓝牙通讯(一)

移动端开发进阶之蓝牙通讯&#xff08;一&#xff09; 移动端进阶之蓝牙通讯需要综合考虑蓝牙版本选择、协议栈使用、服务匹配、设备连接、安全性和硬件支持等方面。 一、蓝牙版本选择 根据实际需求和应用场景选择合适的蓝牙版本&#xff1b; 1.0&#xff0c;1M/s。 2.0EDR…

细说JavaScript函数(JavaScript函数详解)

函数的作用就是封装一段JavaScript代码&#xff0c;让开发者可以通古简单的方式使用这段代码 一、函数的分类 在几乎所有的编程语言中&#xff0c;都有函数这一概念&#xff0c;并且没中语言本身都继承了丰富的函数&#xff0c;这类函数被称为系统函数或者内置函数&#xff0…

vue:使用【3.0】:条件模块

一、条件层级效果图 二、代码 <template><ContentWrap><!-- 添加条件分支:level1 --><div class"btnBox" v-if"isEdit"><el-button type"primary" click"add">添加条件分支</el-button></div…

YOLOv8改进 | 细节涨点篇 | UNetv2提出的一种SDI多层次特征融合模块(分割高效涨点)

一、本文介绍 本问给大家带来的改进机制是UNetv2提出的一种多层次特征融合模块(SDI)其是一种用于替换Concat操作的模块,SDI模块的主要思想是通过整合编码器生成的层级特征图来增强图像中的语义信息和细节信息。该方法已在多个公开的医学图像分割数据集上进行了验证,包括皮…

HANA:传参,游标(Cursor)应用,FOR循环,解决存储表内存溢出的问题

作者 idan lian 如需转载备注出处 1.应用场景 最近项目上用HANA开发的比较多&#xff0c;之前我是bw用的比较多&#xff0c;就不会有这种问题。我们这个项目很多都是开发的计算视图&#xff0c;但最近做acdoca的逻辑时&#xff0c;计算视图在生产环境执行的时候报错&#xf…

阿里巴巴分拆业务板块,中台架构已经死了吗?

阿里巴巴集团董事会主席兼首席执行官张勇发布全员信&#xff0c;宣布启动“16N”组织变革。在阿里巴巴集团之下&#xff0c;将设立阿里云智能、淘宝天猫商业、本地生活、菜鸟、国际数字商业、大文娱等六大业务集团和多家业务公司。 业务集团和业务公司分别成立董事会&#xff…

基于电源完整性的一些PCB设计建议

基于电源完整性的一些PCB设计建议 1. 尽量减少电源和地通路之间的环路电感&#xff0c;在相邻的层上分配电源和接地面时&#xff0c;使用尽可能薄的电介质&#xff1b; 2. 通过在平面之间使用尽可能高的介电常数来获得平面之间的最低阻抗&#xff0c;与尽可能薄的介电常数设计…

深入理解 Flink(七)Flink Slot 管理详解

1.JobMaster 注册成功之后开始调度 JobMaster 中封装了一个 DefaultScheduler&#xff0c;在 DefaultScheduler.startSchedulingInternal() 方法中生成 ExecutionGraph 以执行调度。 2.Flink 的资源管理机制 资源调度的大体流程如下&#xff1a; a.TaskExecutor 注册 Reg…

从CISC到RISC-V:揭开指令集的面纱

对于大多数同学来说&#xff0c;计算机或智能手机的运行似乎就像魔法一样神奇。你可能知道它们内部都是一些复杂的电子组件&#xff0c;比如CPU、内存等等&#xff0c;但这些组件是如何协同工作&#xff0c;让我们可以在电脑上打字&#xff0c;或者在手机上看视频呢&#xff1f…

matplotlib绘制动态瀑布图

绘制瀑布图思路&#xff1a;遍历指定文件目录下所有的csv文件&#xff0c;每读一个文件&#xff0c;取文件前20行数据进行保存&#xff0c;如果超过规定的行数300行&#xff0c;将最旧的数据删除&#xff0c;仅保留300行数据进行展示。 网上找的大部分绘制瀑布图的代码&#x…

ssh远程登录协议 搞定远程访问控制

远程管理linux系统基本上都要使用到ssh&#xff0c;原因很简单&#xff1a;telnet、FTP等传输方式是以明文传送用户认证信息&#xff0c;本质上是不安全的&#xff0c;存在被网络窃听的危险。SSH&#xff08;Secure Shell&#xff09;目前较可靠&#xff0c;是专为远程登录会话…

走迷宫(c语言)

前言&#xff1a; 制作一个迷宫游戏是一个有趣的编程挑战。首先&#xff0c;我们需要设计一个二维数组来表示迷宫的布局&#xff0c;其中每个元素代表迷宫中的一个格子。我们可以使用不同的值来表示空格、墙壁和起点/终点。接下来&#xff0c;我们需生成迷宫。在生成迷宫的过程…

智能手表喇叭无气孔导致老化播放后没声音

智能音箱喇叭老化播放后没声音 智能手表要做防水&#xff0c;在外壳上打了防水胶&#xff0c;结果出现播放突然没声音的现象&#xff0e; 原因 一直播放&#xff0c;设备温度升高&#xff0c;因为做了防水密闭导致喇叭腔体气压异常&#xff0c;导致播放没声音&#xff0e; …

nginx入门学习

nginx简介 nginx 是什么?用来干嘛的 通俗解释&#xff1a;客户端向服务器请求时&#xff0c;提供让多个服务器一起处理请求的东西 是一个反向代理服务器&#xff0c;能够提供负载均衡&#xff0c;和进行反向代理的功能 正向代理&反向代理 客户端向代理服务器请求&#…

短剧分销系统,助力短剧市场发展,实现短剧收益

近几年来&#xff0c;我国短剧兴起&#xff0c;在经过几年的蓄力后迎来了爆发期&#xff0c;短剧市场规模一路狂飙&#xff01;短剧拥有节奏快、剧情“爽”的优势&#xff0c;成功占领了各大观众的碎片化时间&#xff0c;短剧已经成为了影视行业的新力量&#xff0c;也成为了当…

微服务概述之微服务特性

前言 既然系统采用了微服务架构&#xff0c;就需要了解一些微服务的特性&#xff0c;这样在进行微服务开发时&#xff0c;脑海中才会有一些指导方向。微服务具有以下特性。 1. 服务组件化 组件是独立、可替换、可升级的软件的单元。将整体应用拆分成独立的服务组件后&#xff…

嵌入式软件开发对硬件知识的掌握要求要多高?

嵌入式软件开发对硬件知识的掌握要求要多高&#xff1f; 在开始前我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「嵌入式的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff0…