ESP32上对flash的读取操作

通过按键控制一个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);
        }
}
  • 1
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: ESP32 FLASH读写是通过SPI接口进行的,可以使用ESP-IDF提供的SPI Master驱动程序来实现。在使用SPI Master驱动程序之前,需要先初始化SPI总线和SPI设备。然后,可以使用spi_device_transmit函数来发送和接收数据。在写入FLASH时,需要先擦除FLASH扇区,然后再写入数据。在读取FLASH时,可以直接从FLASH读取数据。 ### 回答2: ESP32是一款强大的开发板,内置了丰富的存储空间,其中包括了FLASH存储器。FLASH存储器可以用来读取和写入数据。 在ESP32上进行FLASH读写操作需要使用ESP-IDF框架提供的API函数。主要的函数有`spi_flash_read`和`spi_flash_write`。 `spi_flash_read`函数用于从FLASH存储器中读取数据。它需要指定要读取的地址和数据缓冲区的大小。可以通过指定偏移量和大小来实现读取某个特定范围内的数据。 `spi_flash_write`函数用于向FLASH存储器中写入数据。它需要指定要写入的地址和数据缓冲区的大小。需要注意的是,写入操作会擦除目标地址上的数据,因此确保在执行写入操作之前备份数据是非常重要的。 读取和写入的地址是以字节为单位的。在使用这些函数之前,需要对SPI Flash进行初始化,这可以通过在代码中调用`esp_flash_init`函数来实现。 除了读取和写入数据之外,还可以使用`spi_flash_erase_sector`函数来擦除一个扇区的数据。它需要指定要擦除的扇区的地址。需要注意的是,扇区的大小通常为4KB。 总结起来,ESP32FLASH存储器可以通过`spi_flash_read`和`spi_flash_write`函数进行读写操作,还可以使用`spi_flash_erase_sector`函数进行扇区擦除操作。在使用这些函数之前需要对SPI Flash进行初始化。通过这些API函数,我们可以方便地在ESP32上进行FLASH读写操作。 ### 回答3: ESP32是一款集成式的芯片,它具备了内置的Flash存储器,用于存储程序和数据。Flash存储器被分为多个扇区,每个扇区都有自己的地址范围和大小。ESP32支持从Flash读取数据以及将数据写入Flash的功能。 要从Flash读取数据,我们通常需要先确定要读取的数据存储在哪个扇区中。然后,我们使用ESP32Flash读取命令,通过指定数据在该扇区中的偏移地址来读取数据。读取的数据可以存储在缓冲区中,用于后续的处理。 而要将数据写入Flash,则首先需要选择一个空闲的扇区来存储数据。然后,将要写入的数据存储在一个缓冲区中。最后,我们使用ESP32Flash编程命令,将缓冲区中的数据写入到选定的扇区中。 需要注意的是,写入Flash时会覆盖原有的数据。因此,在执行写入操作之前,我们应该先备份任何我们希望保留的数据。 除了基本的读写操作ESP32还提供了其他一些功能,例如擦除整个Flash存储器或者擦除特定扇区。这些功能可以在需要时使用。 总之,ESP32Flash读写功能为我们提供了一种方便的方式来访问和存储数据。通过合理地利用这些功能,我们可以在ESP32上开发出各种应用,从简单的数据存储到复杂的程序存储。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值