【快速上手ESP32(基于ESP-IDFVSCode)】09-Flash存储

news2024/12/26 9:19:43

ESP32中的Flash

关于ESP32中的Flash,我们需要再回顾一下命名规则。

我用的是立创开发板设计的板子,芯片型号是ESP32S3R8N8,因此可以知道我这块板子有8MB的Flash,大家可以参照着命名规则看看自己有多大的Flash容量。

操作Flash

#include "nvs_flash.h"

我们可以使用NVS(非易失性存储)库来对Flash进行操作,以键值对的形式存储数据,使用NVS的话,我们可以把Flash当成是一个巨大的map(C++)或是dict(Python),因此我们需要保存的每一个数据都需要一个键,并且键名不能重复。

初始化&取消初始化

首先我们需要初始化。

esp_err_t nvs_flash_init(void)

不需要参数,直接执行这个函数即可。

当我们使用完NVS的时候,我们再取消初始化。

esp_err_t nvs_flash_deinit(void)

一样是不需要参数。

启用一片空间&释放

esp_err_t nvs_open(const char *namespace_name, nvs_open_mode_t open_mode, nvs_handle_t *out_handle)

参数一传入一个字符串表示是命名空间,这边的命名空间就是我们把Flash再分为多个空间,在不同的命名空间中可以使用相同的键名,比如说名字是space1的空间中可以有叫key的键名,而在叫space2的空间中同样可以有叫key的键名。我们之前说的不能用相同的键名是指在同一个命名空间中不能用相同的键名。命名空间也是为了减少我们键名冲突的概率。

参数二选择打开的模式,NVS_READWRITENVS_READONLY ,分别是读写和只读,我们就选择读写。

参数三是传出参数,把这块命名空间的句柄给我们传出来。

可以理解成我们打开一个文件,命名空间的名字就相当于文件名,既然我们打开了文件,那么也需要关闭文件。

void nvs_close(nvs_handle_t handle)

写入数据

上面完成之后我们就可以通过句柄来进行操作了。

首先先是写入数据。

可以写入的整数型可以有以下几种类型,i8就是int8的意思,就是有符号的8bit数据,u8就是无符号的8bit数据。下面一堆函数的作用以此类推。

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);

参数一就是句柄,参数二是键值,参数三是写入的值。

除了整数型,还可以写入字符串。

esp_err_t nvs_set_str(nvs_handle_t handle, const char *key, const char *value)

用法也是一样的,只是把整数值换成了字符串,写入的就是字符串了。

除了字符串还可以写入二进制值。

esp_err_t nvs_set_blob(nvs_handle_t handle, const char *key, const void *value, size_t length)

用法也是大差不差,不过最后要提供写入数据的长度。用这个函数可以写入自定义类型。

提交写入申请

esp_err_t nvs_commit(nvs_handle_t handle)

在我们写入数据之后并不保证我们真的就是写进Flash里面了(不过大部分情况是会在正常的时间内真正写入),我们需要提交,也就是使用了上面的函数之后,之前写的数据就会立刻真正的写入Flash,这是为了防止我们的程序突发意外,还没等到真正写入的时刻程序就跑飞了,因此我们最好就是在执行写操作之后就加上这个提交操作。

读出数据

我们能写什么类型的数据自然就能读出什么类型的数据。

函数的命名方式也可以让我们清晰的知道具体是读出什么类型的数据。

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);

esp_err_t nvs_get_str(nvs_handle_t handle, const char *key, char *out_value, size_t *length);

esp_err_t nvs_get_blob(nvs_handle_t handle, const char *key, void *out_value, size_t *length);

参数没什么可说的,就是提供键名然后是一个传出参数。

如果我们提供的键名是错误的,也就是在这个命名空间之内没有对应的键值对,那么返回值为ESP_ERR_NVS_NOT_FOUND

删除键值对

删除键值对有两种,一种是删除指定的键值对。

esp_err_t nvs_erase_key(nvs_handle_t handle, const char *key)

提供句柄和键名。

另一种是全部都删除了,也可以理解为清空当前这个命名空间。

esp_err_t nvs_erase_all(nvs_handle_t handle)

当然,上面的操作同样需要使用上面的提交函数才会是当场生效。

实战记录ESP32启动次数

#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "nvs_flash.h"

void app_main(void){
    vTaskDelay(3000/portTICK_PERIOD_MS);                                //烧录的时候会先短暂地运行,为了不影响效果这里加个延时
    
    if(nvs_flash_init()==ESP_OK)    printf("nvs init success\r\n");     //初始化NVS

    nvs_handle_t nh;
    nvs_open("test",NVS_READWRITE,&nh);                                //打开"test"

    uint16_t count=0;

    if(nvs_get_u16(nh,"count",&count)==ESP_ERR_NVS_NOT_FOUND){          //读取count值
        printf("first count\r\n");
    }else{
        printf("count is %d\r\n",count);
    }

    nvs_set_u16(nh,"count",++count);                                    //++之后再写入Flash里面
    nvs_commit(nh);                                                     //提交

    nvs_close(nh);
    nvs_flash_deinit();

    while(1){
        vTaskDelay(10/portTICK_PERIOD_MS);
    }
}

当我们第一次运行的时候由于没有写入,因此会打印出first count,并且写入0+1。

当我们按下复位之后可以发现读出的数据确实是每次加一的。

 

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

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

相关文章

学习STM32第十七天

备份域详解 一、简介 在参考手册的电源控制章节&#xff0c;提到了备份域&#xff0c;BKPR是在RTC外设中用到&#xff0c;包含20个备份数据寄存器&#xff08;80字节&#xff09;&#xff0c;备份域包括4KB的备份SRAM&#xff0c;以32位、16位或8位模式寻址&#xff0c;在VBAT…

0.什么是C++(专栏前言)

目录 1.什么是C 2.C的发展史 3.C的重要性 应用&#xff1a; 4.如何学习C 5.关于本专栏 1.什么是C 20世纪80年代&#xff0c;计算机界提出oop(object oriented programming:面向对象&#xff09;思想&#xff0c;支持面向对象的程序设计应运而生。 1982年&#xff0c;本…

去雾笔记-知识蒸馏

知识蒸馏&#xff08;Knowledge distillation&#xff09;是一种模型压缩技术&#xff0c;旨在将一个复杂的模型&#xff08;通常称为“教师模型”&#xff09;的知识转移给一个较简单的模型&#xff08;通常称为“学生模型”&#xff09;&#xff0c;以降低模型的计算复杂度和…

针对窗口数量多导致窗口大小显示受限制的问题,使用滚动条控制窗口

建议&#xff1a;首先观察结果展示&#xff0c;判断是否可以满足你的需求。 目录 1. 问题分析 2. 解决方案 2.1 界面设计 2.2 生成代码 2.3 源码实现 3. 结果展示 1. 问题分析 项目需要显示的窗口数量颇多&#xff0c;主界面中&#xff0c;如果一次性显示全部窗口&#x…

财务管理困扰外贸公司?软件解决方案大揭秘!

本文将探讨外贸公司在财务管理中遇到的难题&#xff0c;提出可能性的解决方案&#xff0c;并概述理想的外贸财务管理软件应具备哪些必备功能。 一、外贸公司财务管理难题 1、交易币种多样化 如何准确记录不同货币的财务活动&#xff0c;是外贸公司必须面对的问题。外贸公司的…

密钥密码学(一)

原文&#xff1a;annas-archive.org/md5/b5abcf9a07e32fc6f42b907f001224a1 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 前言 序言 从秘密解码环到政府政策声明&#xff0c;隐藏和发现信息的挑战长期以来一直吸引着智慧。密码学是一个引人入胜的主题&#xff0c;…

HMAC: Introduction, History, and Applications

title: HMAC&#xff1a;Introduction History and Applications date: 2024/4/22 18:46:28 updated: 2024/4/22 18:46:28 tags: HMAC哈希消息认证安全协议数据完整性身份验证密钥管理 第一章&#xff1a;介绍 1. 什么是Hash-based Message Authentication Code (HMAC)&#…

出海不出局 | 小游戏引爆高线市场,新竞争态势下的应用出海攻略

出海小游戏&#xff0c;出息了&#xff01; 根据 Sensor Tower 近期发布的“2024 年 3 月中国手游收入 TOP30”榜单&#xff0c;出海小游戏在榜单中成了亮眼的存在。 其中&#xff0c;《菇勇者传说》3 月海外收入环比增长 63%&#xff0c;斩获出海手游收入增长冠军&#xff0c…

LMDeploy 量化部署 LLM-VLM 实践——作业

LMDeploy 量化部署 LLM-VLM 实践——作业 一、 基础作业1.1、配置 LMDeploy 运行环境1.2、以命令行方式与 InternLM2-Chat-1.8B 模型对话 二、进阶作业2.1、设置 KV Cache 最大占用比例为0.4&#xff0c;开启 W4A16 量化&#xff0c;以命令行方式与模型对话2.1.1、初始显存占用…

交通公路气象站:监测公路沿线气象

TH-GQX8交通公路气象站是一种专门用于监测公路沿线气象状况的设备系统。它通常由分布在公路沿线的若干个自动气象站联网组成&#xff0c;主要任务是实时监测和记录多种气象数据&#xff0c;为交通管理部门和驾驶员提供准确的路况信息。这些气象数据包括气温、湿度、风速、风向、…

【Linux】权限(shell运行原理、概念,Linux权限)

&#x1f308;个人主页&#xff1a;秦jh__https://blog.csdn.net/qinjh_?spm1010.2135.3001.5343&#x1f525; 系列专栏&#xff1a;https://blog.csdn.net/qinjh_/category_12625432.html 目录 shell命令以及运行原理 创建和删除用户 创建新普通用户 删除用户 Linux权…

毕设学习:联邦学习梯度聚合加密算法

原本的加密算法大致思路&#xff1a;各个客户端上传梯度时进行加密&#xff0c;服务端直接用有扰乱的梯度当成真梯度来计算&#xff0c;这样一来谁也不知道谁是真梯度 为了避免原本的算法的一些问题&#xff0c;本文提出了加密-解密结构&#xff0c;并证明了这种结构带来的误差…

视频编码芯片软硬件实现的一些总结(1)

C-Model硬件架构设计的算法模型 视频编码芯片硬件实现时一般都会重新设计一个C-Model&#xff0c;接下来简单介绍下什么是C-Model&#xff0c;怎么设计硬件友好的C_Model。 实现视频编码的软件编码器&#xff08;比如x264/x265&#xff09;,其主要目的是提升CPU执行效率&#x…

java中多线程的创建方式及常用的方法

目录 概述 继承Thread类&#xff1a; 实现Runnable接口&#xff1a; 实现Callable接口&#xff1a; 示例代码 继承Thread类示例 实现Runnable接口示例 实现Callable接口示例 调用三种线程测试示例 线程常用的成员方法 概述 常见的创建线程的方式包括&#xff1a;继承…

vue整合Echarts

首先打开网址https://echarts.apache.org/examples/zh/index.html 进入Echars官网找到自己想要的图形我这里选择的是柱形图 点开完整代码直接cv大法 下载Echars的npm npm install echarts 在vue里面挂在个div 导入相关包 写个方法 就是cv过来的 然后改成后端传过来的值…

跨语言大模型最新综述

节前&#xff0c;我们星球组织了一场算法岗技术&面试讨论会&#xff0c;邀请了一些互联网大厂朋友、参加社招和校招面试的同学&#xff0c;针对算法岗技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备、面试常考点分享等热门话题进行了深入的讨论。 汇总…

家用洗地机哪款好用?目前口碑最好的家用洗地机

随着科技的不断发展&#xff0c;洗地机已经成为家庭中不可或缺的智能清洁电器。它们能够帮助我们轻松地完成地面清洁工作&#xff0c;节省时间和精力。但是&#xff0c;面对市场上琳琅满目的洗地机品牌&#xff0c;我们该如何选择呢&#xff1f;本文将为您介绍洗地机的挑选指南…

WEB攻防-ASP安全-ASP后门植入连接

windows2003环境搭建&#xff0c;可参考上一篇WEB攻防-ASP安全-MDB下载-CSDN博客 将aspcms解压到C:\inetpub\wwwroot,创建网站并赋予internet来宾用户权限 配置启用父路径和主页指向 上一篇文章提到&#xff0c;数据库文件后缀为asp、asa会被执行解析&#xff0c;所以当进行访…

vue实现光标插入模板和删除指定模板内容

需求&#xff1a; 文本可插入模板文字&#xff1b;同时在“%虚拟机名称%”后一个%删除,会将“%虚拟机名称%”选中删除 以下代码可以直接复制使用&#xff1a; <template><div><div><b>需求&#xff1a;</b> <br> 文本可插入模板文字&am…

AI大模型日报#0422:深扒「全球TOP 10大模型团队」、扎克伯格 Llama 3访谈

导读&#xff1a; 欢迎阅读《AI大模型日报》&#xff0c;内容基于Python爬虫和LLM自动生成。目前采用“文心一言”生成了每条资讯的摘要。 标题: 文本生成8K、360度全景世界&#xff01;Model 3重磅发布 摘要: Blockade Labs发布了新模型Model 3&#xff0c;相比Model 2&#…