(ESP32学习10)内部存储的使用(Flash-EEPROM)

我们这一篇要使用ESP32的内部存储空间来实现掉电存储一些关键数据的功能,由于在ESP32上实现比STM32简单太多了,所以代码不长,驱动也是ESP32驱动库里面自带的,所以并不难

话不多说先上代码,大伙儿品品

其实很简单哈,核心就四个函数,申请空间函数,写入函数,保存函数,读取函数,我这里用一个IO读取其状态来代表读取还是写入状态(不知道IO操作的看我之前的博文),然后写入的值移植在0-100之间变化,所以你在更换状态之后就可以看到写模式最后写入的值,而且你关机重启,他仍然处于读取状态,读取的值任然是之前的值。

#include <EEPROM.h>

int num = 0;

void setup() {
  Serial.begin(115200);
  EEPROM.begin(4096);    //申请空间,传入参数为size,为需要读写的数据字节最大地址+1,取值1~4096;
  Serial.println("ESP 32 内部存储测试");
  pinMode(15, INPUT_PULLUP );
}

void loop() {
  delay(500);
  if(digitalRead(15) == 0)
  {
    num++;
    if(num == 100) num = 0;
    Serial.print("ESP 32 写入模式,写入:");
    Serial.println(num);
    //写数据,里面传入的参数为地址和写入的数据,8位,如果是很大的数可以分高低位存进去或者封装一些读取写入指定长度的函数,或者看后面的注意点里面有提到
    EEPROM.write(20, num);delay(1);  
    EEPROM.commit();delay(1);  //在写好所有的更改之后,保存更改的数据
  }
  else 
  {
    Serial.print("ESP 32 读取模式,取出数据:");
    Serial.println(EEPROM.read(20));  //读数据,里面填写的参数为地址,需要与上面的写入地址一样才可以正常读出上面我们写入的数据   
  }  

}

看看效果
在这里插入图片描述

说一些需要注意的地方

1.我们使用开辟的空间是从ESP32的FLASH中分配出来的
2.包含的那个头文件的库里面已经有一个EEPROM对象可以直接使用
3.默认的EEPROM对象大小为4096字节,用户操作地址为0~4095;
4.读取和写入有函数支持,但切忌写入的东西都写完后要用保存函数保存更改才会正式生效,保存函数为EEPROM.commit()或EEPROM.end()
5.空间的申请都是4字节的倍数,即使你申请23,系统内部也会给你改成24字节
6.ESP32的EEPROM只是从flash上申请一个扇区用,所以读写都只能按扇区(4096字节)来
7.这个东西存在的目的本就不是存什么大东西的哈,只是存一些关键的需要掉电存储的参数,所以建议大家不要改申请地址,一直用这个大小就好,如果大改小会导致一些原来的数据丢失哈
8.那么存一些字符串和很大的数怎么办呢?你可以封装一个专门用于存储读取字符串的函数,但是这个东西存字符串这种东西的应用不常见,那么存一些大的数怎么办呢,这个非常常见,因为我们是8位的,也就是0-255,如果太大或者是小数呢,我们可以分高低位存储,除以255和取余255分别为高低位,甚至分高中低三位都行,而小数呢,也很简单,比如我们可以放大1000倍取整然后高低位存进去,之后取出来还原,再除以1000,就可以得到0.001精度的小数保留,精度还可以再放大。
  • 12
    点赞
  • 99
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
对于ESP32F030,可以使用内部闪存来实现类似EEPROM的功能。以下是使用ESP-IDF的示例代码: ```c #include "esp_system.h" #include "nvs_flash.h" #include "nvs.h" #define EEPROM_NAMESPACE "eeprom" void eeprom_init() { esp_err_t err = nvs_flash_init(); if (err == ESP_ERR_NVS_NO_FREE_PAGES || err == ESP_ERR_NVS_NEW_VERSION_FOUND) { ESP_ERROR_CHECK(nvs_flash_erase()); err = nvs_flash_init(); } ESP_ERROR_CHECK(err); } void eeprom_write(uint16_t address, uint8_t data) { nvs_handle_t handle; ESP_ERROR_CHECK(nvs_open(EEPROM_NAMESPACE, NVS_READWRITE, &handle)); ESP_ERROR_CHECK(nvs_set_u8(handle, address, data)); ESP_ERROR_CHECK(nvs_commit(handle)); nvs_close(handle); } uint8_t eeprom_read(uint16_t address) { uint8_t data; nvs_handle_t handle; ESP_ERROR_CHECK(nvs_open(EEPROM_NAMESPACE, NVS_READONLY, &handle)); ESP_ERROR_CHECK(nvs_get_u8(handle, address, &data)); nvs_close(handle); return data; } void eeprom_erase_all() { nvs_flash_erase(); } void eeprom_erase(uint16_t address) { nvs_handle_t handle; ESP_ERROR_CHECK(nvs_open(EEPROM_NAMESPACE, NVS_READWRITE, &handle)); ESP_ERROR_CHECK(nvs_erase_key(handle, address)); ESP_ERROR_CHECK(nvs_commit(handle)); nvs_close(handle); } ``` 在初始化时,需要调用eeprom_init()函数。写入和读取数据的函数分别是eeprom_write()和eeprom_read()。擦除单个地址的函数是eeprom_erase(),擦除所有数据的函数是eeprom_erase_all()。 使用示例: ```c #include "eeprom.h" void app_main() { eeprom_init(); //写入数据 eeprom_write(0, 0x11); eeprom_write(1, 0x22); eeprom_write(2, 0x33); //读取数据 uint8_t data = eeprom_read(1); //擦除单个地址 eeprom_erase(1); //擦除所有数据 eeprom_erase_all(); } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值