ESP32上对flash的读取操作

2023-05-16

通过按键控制一个LED灯的亮和灭,每次重启时读上一次的状态

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

#include "driver/gpio.h"
#include "sdkconfig.h"

#define GPIO_LED_1 0
#define KEY_CONTROLL_1 18

void app_main()
{
    int32_t restart_counter = 0;
    // Initialize NVS
    esp_err_t err = nvs_flash_init();//int32类型unsignd int
    if (err == ESP_ERR_NVS_NO_FREE_PAGES || err == ESP_ERR_NVS_NEW_VERSION_FOUND) {// (ESP_ERR_NVS_BASE + 0x0d)一个地址
        // NVS partition was truncated and needs to be erased      NVS分区被截断并且需要被擦除
        // Retry nvs_flash_init重试
        ESP_ERROR_CHECK(nvs_flash_erase());//可用于检查错误代码的宏
        err = nvs_flash_init();
    }
    ESP_ERROR_CHECK( err );

    // Open
    printf("\n");
    printf("Opening Non-Volatile Storage (NVS) handle... ");
    nvs_handle_t my_handle;//unsigned int
    err = nvs_open("storage", NVS_READWRITE, &my_handle);//使用来自默认 NVS 分区的给定命名空间打开非易失性存储
    if (err != ESP_OK) {
        printf("Error (%s) opening NVS handle!\n", esp_err_to_name(err));//为 esp_err_t 错误代码返回字符串 此函数在预先生成的查找表中查找错误代码并返回其字符串表示。
    } else {
        printf("Done\n");

        // Read
        printf("Reading restart counter from NVS ... ");
        //    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));
        }

        /*// Write
        printf("Updating restart counter in NVS ... ");
       restart_counter++;
        err = nvs_set_i32(my_handle, "restart_counter", restart_counter);//为给定键设置值这一系列函数为键设置值,给定它的名字。注意在调用 nvs_commit 函数之前,不会更新实际存储。
        printf((err != ESP_OK) ? "Failed!\n" : "Done\n");

        // Commit written value.提交写入的值
        // After setting any values, nvs_commit() must be called to ensure changes are written设置任何值后,必须调用 nvs_commit() 以确保写入更改
        // to flash storage. Implementations may write to storage at other times,到闪存。 实现可能会在其他时间写入存储
        // but this is not guaranteed.
        printf("Committing updates in NVS ... ");
        err = nvs_commit(my_handle);//将任何挂起的更改写入非易失性存储设置任何值后,必须调用 nvs_commit() 以确保写入更改
        printf((err != ESP_OK) ? "Failed!\n" : "Done\n");

        // Close
        nvs_close(my_handle);//关闭存储句柄并释放所有分配的资源,* 一旦在句柄上调用此函数,就不应再使用该句柄。*/
    }

    printf("\n");

    // Restart module
    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();

     gpio_pad_select_gpio(GPIO_LED_1);
    /* Set the GPIO as a push/pull output */
    gpio_set_direction(GPIO_LED_1, GPIO_MODE_OUTPUT);
    gpio_pad_select_gpio(KEY_CONTROLL_1);
    gpio_set_direction(KEY_CONTROLL_1,GPIO_MODE_INPUT);
        while(1)
        {
            //gpio_set_level(GPIO_LED_1,restart_counter%2);
            //vTaskDelay(10);
            //printf("key level [%d]\n",gpio_get_level(KEY_CONTROLL_1));
            if(0==gpio_get_level(KEY_CONTROLL_1))
            {
                vTaskDelay(10);
                if(0==gpio_get_level(KEY_CONTROLL_1))
                {
                    restart_counter++;
                    if(restart_counter>=100)
                        restart_counter=0;
                    printf("Updating restart counter in NVS ... ");
                    err = nvs_set_i32(my_handle, "restart_counter", restart_counter);//为给定键设置值这一系列函数为键设置值,给定它的名字。注意在调用 nvs_commit 函数之前,不会更新实际存储。
                    printf((err != ESP_OK) ? "Failed!\n" : "Done\n");
                    printf("Committing updates in NVS ... ");
                    err = nvs_commit(my_handle);//将任何挂起的更改写入非易失性存储设置任何值后,必须调用 nvs_commit() 以确保写入更改
                    printf((err != ESP_OK) ? "Failed!\n" : "Done\n");
                }
                while(!gpio_get_level(KEY_CONTROLL_1))
                    vTaskDelay(10);
            }
                gpio_set_level(GPIO_LED_1,restart_counter%2);
                vTaskDelay(100);
        }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ESP32上对flash的读取操作 的相关文章

  • 使用selenium点击swf

    我正在尝试使用 Selenium IDE 单击 html 页面中的 swf DIV id 和 Embed id 的变化取决于时间戳 例如id FLASH 0 23458974594 我尝试过使用id FLASH 0 9 0 9 0 9 or
  • 使用 Actionscript 3 连接到数据库 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我正在寻找有关如何基于数据库在 Flash 中动态创建内容的建议 最初我想将数据库导出到 XML 文件并使用内置的 Actionscr
  • 禁用缓存 YouTube 视频

    当 YouTube 使 YouTube 视频与缓存一起使用时 YouTube 取得了相当大的成就 然而 这导致我的 ajax 网站出现问题 我想知道是否有办法禁用 YouTube 视频的缓存 特别是在 Internet Explorer 中
  • 如何从Flash/AS3找到用户Temp文件夹的路径?

    如何从 Flash AS3 找到用户临时文件夹的路径 例如 C Users lisnil AppData Local Temp 它需要在任何版本的 Windows 上运行 至少是 XP Vista 和 7 您无法通过 Flash 那样访问文
  • HTTPS 上的 SWFUpload 无法正常工作

    当目标 servlet 侦听 HTTPS 时 我在使用 SWFUpload 上传文件时遇到问题 在 HTTP 上它工作得很好 仅当使用 FireFox 或 Opera 时才会出现此问题 在 IE 上它工作正常 没有尝试过其他浏览器 EDIT
  • 在 Flash 对象上方显示图像

    我在这里面临着一个棘手的情况 这就是问题 我有一个 Flash 对象 我想在其上显示图像这些是我尝试过的技巧 1 玩转z index 没用 2 将wmode参数设置为透明 不透明 同样没有用 3 使用javascript并仅在页面加载后显示
  • 在android中加载swf文件时出现问题

    当我在 Android 模拟器中加载交互式 SWF 文件时遇到问题 我使用2 3 1 AVD 这是代码 package com androidpeople view import android app Activity import an
  • 如何保护swf文件不被反编译?

    我正在使用 Flex 框架从事重要项目 我想对我的算法和代码保密 是否有可能以某种方式保护 swf 文件不被反编译 我不希望有人使用 flash 反编译器提取我的代码 Thanks 这很简单 只需将其保存在您的 PC 上 不要将其放在网络上
  • 如何向 Flash Player 10.1 发出启动 flv 或 swf 的意图?

    我有一堆FLV视频文件存储在媒体服务器 我正在尝试让它们在 Flash 播放器中启动 一直在四处寻找但没有找到太多帮助 我已将 flv 文件下载到临时存储中 并尝试使用intent 这就是我的代码的样子 来自我在网上看到的 try URL
  • 推荐一个适用于 Flex 和 AIR 的 HTML 友好的 RichTextEditor? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 安全沙箱违规

    运行我的 Flash 应用程序时出现以下错误 违反安全沙箱 与 rtmp system ip live 的连接已停止 不允许从 file F Flash 工作 RTS RT vlab BIOTECH NEO 简单神经元的被动属性 vi 特征
  • 将数据/变量从 Visual Basic 表单传递到 Flash 对象

    我很确定这个问题可以在 stackOverflow 上的某个地方得到解答 但我对此没有选择 我有一个 VisualBasic 窗体 上面有一个按钮对象 我希望该按钮有一个 onClick 过程 以便单击它可以将变量或其他命令传递到另一个正在
  • VideoJs 在 Firefox 中的 Flash 回退问题

    我尝试将 videoJs 添加到我的网站来播放 MP4 文件 所有这些在 Chrome 中都能完美运行 但当我转到 Firefox 不支持 MP4 文件 时 Flash 播放器停留在黑屏上 按钮不执行任何操作 简单的问题 为什么 我不明白
  • ActionScript 3.0 中缺少运算符重载

    我在 ActionScript 中最怀念的事情之一是缺少运算符重载 特别是 我通过在我的类中添加 Compare 方法来解决这个问题 但这在很多情况下没有帮助 比如当你想使用内置字典之类的东西时 有没有好的方法来解决这个问题 Nope 但添
  • iPhone 上的 Flash(或 Silverlight)

    我对在 iPhone 上开发应用程序感兴趣 并且作为一名 NET 和 ActionScript 开发人员 我对 Objective C Cocoa Touch 编程的学习曲线有点害怕 我知道 Adob e 已经为 iPhone 准备好了 F
  • 如何在动作脚本 3 中设置/访问外部 swf 文件的动态文本字段?

    我正在处理一个 fla 文件 其中添加了一个 swf 文件 我如何在该 swf 文件的动态文本上设置文本 有没有直接设置文本的方法 我不想在 url 中作为参数传递 我试过这样 var rq URLRequest new URLReques
  • 正确地将 flash.utils.Dictionary 序列化为 SharedObject

    我的 Flex 项目中有一个名为 HashMap 的便利集合类 它本质上是 flash utils Dictionary 的包装器 带有一堆便利方法和添加的 同步的 ArrayCollection 以便我可以将 HashMap 传递给需要的
  • Flash 照片上传 - 从网络摄像头拍摄照片 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何通过命令行将Flash .fla编译为.swf? [复制]

    这个问题在这里已经有答案了 如何在基于 Windows 的操作系统上通过命令行将 Flash fla 文件编译为 swf 需要安装的命令行工具就可以了 谁能建议我该怎么做 以直接的方式 谢谢 您可以使用JSFL为 Flash IDE 编写脚
  • 我们可以在 Actionscript 中将编译后的 Haxe swf 的 SWC 用作普通库吗?

    我们可以在 Actionscript 中将编译后的 Haxe swf 的 SWC 用作普通库吗 我有一个从haxe代码编译的swf 我可以尝试将它编译成其他SWC 我想将它用作AS3中的lib 是否可以 如果是的话怎么办 是的 可以 性能提

随机推荐