esp32s3 NVS空间读写操作

esp32s3 NVS空间读写操作

非易失性存储 (NVS) 库主要用于在 flash 中存储键值格式的数据官网介绍

我简单理解就是存放一些简单的键值对。比如账号、密码之类的简单字符。用“键”来访问,反馈回来值。
demo参考示例写的,比较简单,补充如下。

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

#define NAME_SPACE_WIFI1 "wifi1"
#define NAME_SPACE_WIFI2 "wifi2"

#define NVS_SSID_KEY      "ssid"
#define NVS_PASSWORD_KEY  "password"

/*namespace:命名空间
    key:
    buf:内存地址
    maxlen:最大读取长度
*/
void nvs_blob_read(const char *namespace,const char *key,void *buf,int maxlen)
{
    nvs_handle_t nvs_handle;
    size_t length = 0;
    nvs_open(namespace,NVS_READONLY,&nvs_handle);
    nvs_get_blob(nvs_handle,key,NULL,&length); //outvalue参数为NULL,则只返回数据长度
    if(length>0 && length<maxlen)
    {
        nvs_get_blob(nvs_handle,key,buf,&length); //outvalue参数为NULL,则只返回数据长度
    }
    nvs_close(nvs_handle);
}

void app_main(void)
{
    nvs_handle_t nvs_handle1;
    nvs_handle_t nvs_handle2;

    esp_err_t ret = nvs_flash_init();
    if(ret != ESP_OK)
    {
        nvs_flash_erase();
        ESP_ERROR_CHECK(nvs_flash_init());
    }
    /*命名空间1操作 nvs写入*/
    nvs_open(NAME_SPACE_WIFI1,NVS_READWRITE,&nvs_handle1);
    nvs_set_blob(nvs_handle1,NVS_SSID_KEY,"mywifi_esp32",strlen("mywifi_esp32"));
    nvs_set_blob(nvs_handle1,NVS_PASSWORD_KEY,"12345678",strlen("12345678"));
    nvs_commit(nvs_handle1);    //立即写入nvs
    nvs_close(nvs_handle1);


    /*命名空间2操作 nvs写入 */
    nvs_open(NAME_SPACE_WIFI2,NVS_READWRITE,&nvs_handle2);
    nvs_set_blob(nvs_handle2,NVS_SSID_KEY,"helloworld",strlen("helloworld"));
    nvs_set_blob(nvs_handle2,NVS_PASSWORD_KEY,"87654321",strlen("87654321"));
    nvs_commit(nvs_handle2);    //立即写入nvs
    nvs_close(nvs_handle2);

    vTaskDelay(pdMS_TO_TICKS(1000)); 

    /*nvs读取*/
    char read_buffer[64];
    /*命名空间1中的键值对读取*/
    memset(read_buffer,0,sizeof(read_buffer));
    nvs_blob_read(NAME_SPACE_WIFI1,NVS_SSID_KEY,read_buffer,sizeof(read_buffer));
    ESP_LOGI("nvs","namespace:%s,key:%s -> value:%s",NAME_SPACE_WIFI1,NVS_SSID_KEY,read_buffer);

    memset(read_buffer,0,sizeof(read_buffer));
    nvs_blob_read(NAME_SPACE_WIFI1,NVS_PASSWORD_KEY,read_buffer,sizeof(read_buffer));
    ESP_LOGI("nvs","namespace:%s,key:%s -> value:%s",NAME_SPACE_WIFI1,NVS_PASSWORD_KEY,read_buffer);

    /*命名空间2中的键值对读取*/
    memset(read_buffer,0,sizeof(read_buffer));
    nvs_blob_read(NAME_SPACE_WIFI2,NVS_SSID_KEY,read_buffer,sizeof(read_buffer));
    ESP_LOGI("nvs","namespace:%s,key:%s -> value:%s",NAME_SPACE_WIFI2,NVS_SSID_KEY,read_buffer);

    memset(read_buffer,0,sizeof(read_buffer));
    nvs_blob_read(NAME_SPACE_WIFI2,NVS_PASSWORD_KEY,read_buffer,sizeof(read_buffer));
    ESP_LOGI("nvs","namespace:%s,key:%s -> value:%s",NAME_SPACE_WIFI2,NVS_PASSWORD_KEY,read_buffer);

    /*nvs读取*/
    // size_t length = 0;
    // nvs_open(NAME_SPACE_WIFI1,NVS_READONLY,&nvs_handle1);
    // nvs_get_blob(nvs_handle1,NVS_SSID_KEY,NULL,&length); //outvalue参数为NULL,则只返回数据长度
    // if(length>0)
    // {
    //     char* buffer = (char*)malloc(length + 1);
    //     nvs_get_blob(nvs_handle1,NVS_SSID_KEY,buffer,&length); //outvalue参数为NULL,则只返回数据长度
    // }
}
### 实现ESP32-S3 MicroPython SD卡读写操作ESP32-S3上使用MicroPython实现SD卡的读写功能,通常涉及配置硬件接口以及加载相应的库来管理文件系统。以下是详细的说明: #### 配置SPI总线连接 为了使ESP32-S3能够与SD卡通信,需通过SPI协议建立连接。具体来说,需要定义GPIO引脚分配并初始化SPI对象。 ```python from machine import SPI, Pin import os # 定义SPI参数 spi = SPI(1, baudrate=1000000, polarity=0, phase=0, firstbit=SPI.MSB, sck=Pin(6), mosi=Pin(7), miso=Pin(4)) # 使用HSPI (SPI1) cs = Pin(10, Pin.OUT) # CS引脚设置为低电平激活设备 ``` 上述代码片段展示了如何创建一个基于指定GPIO引脚的SPI实例[^1]。 #### 初始化SD卡模块 接着,利用`sdcard`库完成SD卡的实际挂载工作。如果目标板子支持该类存储介质,则可以继续如下操作: ```python try: from sdcard import SDCard except ImportError: raise SystemExit(&#39;The SDCard driver could not be found&#39;) sd = SDCard(spi, cs) os.mount(sd, &#39;/sd&#39;) # 将SD卡作为虚拟目录&#39;/sd&#39;挂载到操作系统中 print(&#39;Filesystem check:&#39;) print(os.listdir(&#39;/&#39;)) # 列出根路径下的所有项目 print(&#39;\nSD Card Content:&#39;) print(os.listdir(&#39;/sd&#39;)) # 显示已成功安装后的SD卡内容列表 ``` 此部分实现了对SD卡驱动程序的支持,并将其作为一个新的分区加入现有的文件结构里。 #### 文件操作示例 一旦完成了前期准备工作之后,就可以像对待常规本地文件那样处理位于SD卡上的数据了。下面给出了一些基本的例子用于演示常见的文件I/O活动: ##### 创建新文本文件并向其中写入字符串 ```python with open("/sd/example.txt", "w") as file: file.write("Hello ESP32-S3 with MicroPython!\r\n") ``` ##### 追加模式打开现有文件并将额外的信息附加进去 ```python with open("/sd/example.txt", "a") as file: file.write("This line is appended.\r\n") ``` ##### 从特定位置开始逐字节读取直到遇到EOF为止 ```python with open("/sd/example.txt", "r") as file: data = file.read() print(data) ``` 以上三个例子分别代表了三种典型的文件访问方式——覆盖式写入、追加写入以及顺序读取。 #### 注意事项 - 确认所使用的开发环境已经包含了必要的第三方扩展包(比如这里提到的`sdcard.py`),否则可能需要手动下载或者移植相应版本。 - 不同型号之间可能存在细微差异,请参照官方文档调整具体的管脚映射关系。 - 对于大容量传输场景建议适当降低频率以减少错误率;反之亦然,在追求效率前提下可尝试提高速率直至达到稳定状态即可停止进一步优化过程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值