【ESP-IDF】介绍NVS

news2024/9/27 19:23:18

ESP-IDF是一款由乐鑫科技(Espressif Systems)开发的面向ESP32和ESP32-S系列芯片的开发框架,NVS(Non-Volatile Storage)是其中的一项功能。

NVS是一种用于在嵌入式系统中保存持久化数据的键值存储库。在ESP-IDF中,NVS提供了一种简单且有效的方法来在ESP32芯片上保存和读取配置信息、状态数据、用户设置等应用程序数据,以便在设备重新启动或断电后能够恢复状态。

NVS在ESP-IDF中具有以下特点和优点:

  1. 非易失性:NVS中的数据在芯片断电或重新启动后仍然保持不变,不会丢失,适合保存需要长期存储的数据。
  2. 键值对存储:NVS使用简单的键值对(Key-Value)结构来保存数据,方便进行读取和写入操作。
  3. 分区管理:NVS将数据存储在不同的分区中,可以根据需要创建多个独立的NVS分区,用于不同的数据类型或应用场景,实现数据隔离和管理。
  4. API丰富:ESP-IDF提供了丰富的NVS API,包括读取、写入、删除、遍历等操作,方便开发者进行数据的处理和管理。

学习和使用ESP-IDF中的NVS可以带来以下好处:

  1. 持久化数据存储:NVS允许开发者将配置信息、状态数据等持久化保存在芯片中,即使设备断电或重新启动,数据也能够得到保留,从而避免了数据丢失的情况。
  2. 简单高效的数据管理:NVS提供了简单易用的API,可以方便地进行数据的读取、写入、删除等操作,减少了开发复杂性和提高了代码效率。
  3. 数据隔离和管理:NVS支持多个分区的管理,可以将不同类型的数据存储在不同的分区中,实现数据隔离和管理,便于维护和升级。
  4. 节省存储空间:NVS采用了紧凑的键值对结构,可以高效地利用芯片内部的存储空间,避免了使用外部存储器的成本和复杂性。

因此,学习和使用ESP-IDF中的NVS可以帮助开发者在ESP32和ESP32-S系列芯片上实现持久化数据存储,并简化数据管理和提高应用程序的稳定性和效率。

如何使用NVS

简单来说,我们可以把nvs比喻成一个“U盘”,那接下来我们就开始对这个“U盘”进行操作吧!

接下来我们做一个简单的演示,代码如下:

#include <stdio.h>
#include "nvs_flash.h"
void app_main(void)
{
    // 对“U盘”进行初始化
    nvs_flash_init();

    char *bilibili_name_space = "BiliBili";
    nvs_handle_t bilibili_handle;
    // 创建一个句柄来打卡它
    nvs_open(bilibili_name_space, NVS_READWRITE, &bilibili_handle);

    // 创建初始变量counter_val记录ESP32重启次数
    uint32_t counter_val = 0;
    // 创建初始变量counter_val的key,可以将其比喻成文件名
    char *counter_key = "counter";
    // 查看是否存在counter_val(因为我们的counter_val是uint32_t类型,所以下面我们要用nvs_get_u32())
    nvs_get_u32(bilibili_handle, counter_key, &counter_val);
    counter_val = counter_val + 1;
    // 设置counter_val
    nvs_set_u32(bilibili_handle, counter_key, counter_val);
		// 提交执行
		nvs_commit(bilibili_handle);
    // 关闭窗口(句柄)
    nvs_close(bilibili_handle);
    // 退出“U盘”
    nvs_flash_deinit();
}

对于上述代码,我们可以这样形象的理解

当我执行nvs_flash_init()的时候,相当于插入了“U盘”

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZMrB7AL4-1681699998241)(https://s3-us-west-2.amazonaws.com/secure.notion-static.com/709fae5b-853a-489d-9a0d-b0637de0090b/Untitled.png)]

当我执行nvs_open(bilibili_name_space , NVS_READWRITE, &bilibili_handle)时,相当于新建bilibili_name_space文件夹,并进入其中,其中这个文件夹是NVS_READWRITE即可读可写的,而bilibili_handle就相当于这个窗口,我接下来所有的操作都需要通过这个窗口(句柄)进行操作

在这里插入图片描述

在这里插入图片描述

当我运行nvs_get_u32(bilibili_handle, counter_key, &counter_val)时,其实就是相当于打开名字为:counter_key的文件,而文件内的值就是counter_val

nvs_set_u32(bilibili_handle, counter_key, counter_val)就是设置文件里的内容

在这里插入图片描述

nvs_commit(bilibili_handle),就是提交执行,nvs_close(bilibili_handle)就是关闭窗口(句柄),nvs_flash_deinit()就是退出“U盘”。

优化代码后:

#include <stdio.h>
#include "esp_log.h"
#include "nvs_flash.h"
void app_main(void)
{
    // 对“U盘”进行初始化
    nvs_flash_init();

    char *bilibili_name_space = "BiliBili";
    nvs_handle_t bilibili_handle;
    // 创建一个句柄来打卡它
    nvs_open(bilibili_name_space, NVS_READWRITE, &bilibili_handle);

    // 创建初始变量counter_val记录ESP32重启次数
    uint32_t counter_val = 0;
    // 创建初始变量counter_val的key,可以将其比喻成文件名
    char *counter_key = "counter";
    // 查看是否存在counter_val(因为我们的counter_val是uint32_t类型,所以下面我们要用nvs_get_u32())
    nvs_get_u32(bilibili_handle, counter_key, &counter_val);

    ESP_LOGI("NVS", "KEY:VALUE %s:%lu", counter_key, counter_val);

    // 设置counter_val
    nvs_set_u32(bilibili_handle, counter_key, ++counter_val);
		// 提交执行
		nvs_commit(bilibili_handle);
    // 关闭窗口(句柄)
    nvs_close(bilibili_handle);
    // 退出“U盘”
    nvs_flash_deinit();
}

接下来我们来测试一下这段代码:
可以看到,第1次为1,第2次为2,但是按理来说,第一次应该为0,第二次才是1,这是由于ESP-IDF太快了,在打印之前它就重启了一遍,所以才会被记录成1。

在这里插入图片描述

在这里插入图片描述

这里我们可以通过给几秒的延时来避免这种情况发生,如下:

在这里插入图片描述

这里我们重点注意一下这行代码:

nvs_set_u32(bilibili_handle, counter_key, ++counter_val);

在这里,++counter_val 是用于对 counter_val 变量进行自增操作。++ 运算符是 C 语言中的自增运算符,用于将变量的值加一,并返回加一后的结果。

在这段代码中,++counter_val 表示先将 counter_val 的值加一,然后将加一后的值作为参数传递给 nvs_set_u32() 函数。这样可以确保在将 counter_val 的值写入 NVS 存储之前,先对其进行自增操作,从而实现每次写入 NVS 存储时计数器的值增加一的效果。

需要注意的是,自增运算符有前缀形式和后缀形式,即 ++counter_valcounter_val++。前缀形式的 ++counter_val 先对变量进行自增操作,然后返回自增后的值;而后缀形式的 counter_val++ 先返回变量的值,然后再对变量进行自增操作。在这里使用前缀形式的 ++counter_val 是因为需要将自增后的值传递给 nvs_set_u32() 函数,而不是传递自增前的值。

如何把NVS删掉

直接把ESP格式化就好了

  1. 打开ESP-IDF Terminal

在这里插入图片描述

![\[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zKZ3JaD7-1681699998245)(https://s3-us-west-2.amazonaws.com/secure.notion-static.com/bb6652b7-0236-42c9-941b-4684efac74b0/Untitled.png)\]](https://img-blog.csdnimg.cn/09ca893cfdc045e789c03a51e555a72a.png)
  1. 输入idf.py erase-flash
    在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

虚拟化技术 — SR-IOV 单根 I/O 虚拟化

目录 文章目录 目录SR-IOVSR-IOV VEBSR-IOV VEPASR-IOV Multi-ChannelSR-IOV OvSSR-IOV 的应用使能 SR-IOV VFs挂在 VF 到 KVM 虚拟机中SR-IOV 的 NUMA 亲和性VF 的网络配置VFs Bonding SR-IOV 虚拟机的热迁移问题 SR-IOV 传统的 I/O 虚拟化方案需要 VMM 来捕获和模拟 VM 的 I…

400左右蓝牙耳机什么牌子音质好?400左右的无线蓝牙耳机推荐

过去几年苹果的AirPods深受大家欢迎&#xff0c;但要论最佳耳机&#xff0c;还要考虑佩戴类型&#xff0c;功能上又分降噪水平&#xff0c;甚至价格上也要实惠&#xff0c;毕竟对于不想太高预算来获得出色音质和舒适度的人来说&#xff0c;这也是他们心中的"最佳"产品…

Kubernetes那点事儿——调度策略

Kubernetes那点事儿——调度策略 前言一、静态Pod二、nodeSelector 节点选择器三、nodeName四、taint污点五、tolerations污点容忍六、容器资源限制七、nodeAffinity节点亲和性 前言 Kubernetes的强大之处离不开它的调度系统&#xff0c;它为Pod调度到某个Node上提供了多种方式…

Linux学习_设备树实现中断

Linux学习_设备树实现中断 中断层级结构设备树_中断控制器设备树_中断子节点驱动程序获取GPIO获取中断号申请中断中断处理函数 中断层级结构 就硬件而言&#xff0c;中断控制器指的就是GIC&#xff0c;但是实际在软件上&#xff0c;图中的GPIO等我们也称之为中断控制器。 外部…

[PyTorch]预训练权重的转换

众所周知&#xff0c;使用大量数据预训练后的骨干网络可以提升整个模型的泛化能力&#xff0c;而我们如果将网络的骨干网络替换后则不能直接使用原来的权重。这个项目的作用是在你替换骨干网络后可以将网络预训练权重一并“偷”过来。 下给结论&#xff1a;将DeeplabV3的骨干网…

详解 TCP(三次握手 + 四次挥手 + 滑动窗口 + 拥塞控制 + 和 UDP 做对比)

文章目录 1. TCP / IP五层模型和OSI七层模型1&#xff09;OSI七层模型2&#xff09;TCP/IP 五层模型 2. TCP和UDP1&#xff09; TCP首部结构2&#xff09;UDP首部结构3&#xff09;TCP和UDP的区别2.2 UDP和TCP对应的应用场景 3. TCP 建立连接时的三次握手1&#xff09;为什么需…

虚拟专用网VPN与网络地址转换NAT技术

1、专用网络或本地互联网 一方面现在随着个人电脑的增大&#xff0c;IP地址十分紧缺&#xff0c;所以如果为每一台电脑都分配个一个全球IP地址&#xff08;唯一的&#xff09;不太现实&#xff1b;另外一方面&#xff0c;很多机构&#xff08;比如大公司&#xff09;往往只需要…

阿里正式加入ChatGPT战局,“通义千问”上线后表现如何?

ChatGPT发布后&#xff0c;数月间全世界都对AI的能力有了新的认知。 ChatGPT掀起的战局&#xff0c;现在又多了一位选手了&#xff01; 阿里版类ChatGPT突然官宣正式对外开放企业邀测&#xff0c;由达摩院开发&#xff0c;名为“通义千问” 顾名思义&#xff0c;阿里正式加入Ch…

java实现钉钉自定义机器人发送消息

钉钉作为现在很多企业的移动办公平台&#xff0c;具有很多很强大的功能&#xff0c;可以帮助我们更加及时的发现问题&#xff0c;解决问题&#xff0c;今天我们做一个java实现钉钉自定义机器发送消息的功能。 首先&#xff0c;先放出官方文档地址&#xff1a;https://open.ding…

GIS在城市规划中的作用与应用

山海鲸可视化-GIS影像 简介 GIS&#xff08;地理信息系统&#xff09;是一种用于捕获、存储、管理、分析和显示地理空间数据的技术和工具。GIS可以用于各种领域&#xff0c;包括城市规划、土地管理、自然资源管理、公共安全、环境保护、气象预报、交通运输、农业、地质勘探、…

支持多模型数据分析探索的存算分离湖仓一体架构解析(上)

当企业需要建设独立的数据仓库系统来支撑BI和业务分析业务时&#xff0c;有了“数据湖数据仓库”的混合架构。但混合架构带来了更高的建设成本、管理成本和业务开发成本。随着大数据技术的发展&#xff0c;通过在数据湖层增加分布式事务、元数据管理、极致的SQL性能、SQL和数据…

Python实现哈里斯鹰优化算法(HHO)优化Catboost分类模型(CatBoostClassifier算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 2019年Heidari等人提出哈里斯鹰优化算法(Harris Hawk Optimization, HHO)&#xff0c;该算法有较强的全…

BI数据可视化报表模板分享,附免费下载方法

奥威BI软件上既有大量单张下载套用的BI数据可视化报表模板&#xff0c;又有以通用标准方案、行业通用方案为基础打造的标准化BI数据可视化报表模板套装&#xff0c;下载套用即可完成整个企业的BI数据可视化分析。这些BI数据可视化报表模板的效果如何&#xff0c;怎么下载&#…

Spring set注入专题

简单数据类型&#xff0c;来自BeanUtils&#xff0c;包含8种基本数据类型&#xff0c;8种包装类等 Temporal是java8之后的新特性&#xff0c;表示时区&#xff0c;时间等 Local为语言类 注入简单数据类型(包括String): 注意&#xff0c;property中不能使用ref&#xff0c;要使…

连接云服务器

前言&#xff1a;相信看到这篇文章的小伙伴都或多或少有一些编程基础&#xff0c;懂得一些linux的基本命令了吧&#xff0c;本篇文章将带领大家服务器如何部署一个使用django框架开发的一个网站进行云服务器端的部署。 文章使用到的的工具 Python&#xff1a;一种编程语言&…

精彩回顾|SOFA 五周年,Live Long and Prosper!

2023 年 4 月 15 日&#xff0c;SOFAStack 社区在北京市朝阳区 C work 举办了自己的第五个生日。在“Live Long and Prosper”的活动主题贯彻下&#xff0c;活动现场的开源技术探索氛围变得尤其浓厚。 SOFA 开源集市 在 SOFA 五周年的开源集市中&#xff0c;汇聚了 SOFAStack 的…

Transformer应用之构建聊天机器人(一)

一、概述 聊天机器人的基本功能是系统根据用户当前的输入语句&#xff0c;生成相应的语句并输出给用户&#xff0c;用户和聊天机器人之间的一问一答构成了一个utterance&#xff0c;多个utterance就构成了一段对话。目前流行的聊天机器人都是基于Transformer的架构来做的&…

FT2000+ openEuler 20.03 LTS SP3 yum install qemu手动创建虚拟机 图形界面安装openEuler 20.03系统

安装qemu yum install qemu -y 安装系统 创建虚拟硬盘 /usr/bin/qemu-img create -f qcow2 openEuler.qcow2 20g 挂载iso启动 /usr/bin/qemu-kvm -machine virt,accelkvm,usbon -cpu host -m 32G -smp 8,sockets1,cores8,threads1 -boot d -hda /home/yeqiang/qemu-virt…

python字符串模糊匹配,并计算匹配分数

一、thefuzz thefuzz包以前叫fuzzywuzzy&#xff0c;0.19版本开始改名为thefuzz&#xff0c;github地址&#xff1a; GitHub - seatgeek/thefuzz: Fuzzy String Matching in Python 可以通过命令pip install thefuzz安装此包。用法还是比较简单的: from thefuzz import fuz…

redis_exporter 结合prometheus 监控redis cluster集群

redis_exporter 结合prometheus 监控redis cluster集群 前提1&#xff1a;已经搭建好redis cluster集群前提2&#xff1a;已搭建好prometheus 1、下载redis_exporter wget https://github.com/oliver006/redis_exporter/releases/download/v1.50.0/redis_exporter-v1.50.0.l…