esp32-S3专题二:内存2之RTC内存、FLASH使用

承接上文,讲一下esp32上剩下的几个存储空间的用途

一、RTC存储器

esp32-S3分为有两个RTC存储器,是比较特别的SRAM存储器。RTC存储器在设备深度休眠时不掉电,一般比较多配合设备的深度休眠模式的业务场景使用。使能(一般默认使能) CONFIG_SOC_RTC_FAST_MEM_SUPPORTEDCONFIG_SOC_RTC_SLOW_MEM_SUPPORTED后,即可以通过定义变量,直接操作RTC内存。
在这里插入图片描述

(一)RTC 快速存储器,

8 KB 的 SRAM,可以在 Deep-sleep 模式下 RTC 启动时用于数据存储以及被主CPU 访问。除非禁用CONFIG_ESP_SYSTEM_ALLOW_RTC_FAST_MEM_AS_HEAP 选项,否则剩余的 RTC FAST memory 会被添加到堆中。该部分内存可以和 DRAM(数据 RAM) 互换使用,但是访问速度稍慢一点。
使用方式:

#include <esp_attr.h>

RTC_IRAM_ATTR uint32_t rtc_iram_data;
RTC_FAST_ATTR uint32_t rtc_fast_data;

(二) RTC 慢速存储器

也是为 8 KB 的 SRAM,可以在 Deep-sleep 模式下被协处理器访问。
使用方式:


#include <esp_attr.h>
//RTC_NOINIT_ATTR 属性宏可以用来将数据放入 RTC Slow memory。放入此类型存储器的值从深度睡眠模式中醒来后会保持值不变。
RTC_NOINIT_ATTR uint32_t rtc_data;

注:从架构上来说,存储在RTC慢速存储器存储的数据,除非模块掉电,否则不会丢失。就算系统调用软件esp_restart()重启也能保留。但实际使用中V4.4.0版本的架构,esp_restart()重启后偶尔也会发生数据丢失,不知道具体原因。

二、Flash

由于flash具有掉电不丢失特性,所有许多业务场景经常结合flash的使用。而esp32-s3上的用途比较多,主要分为3个方面。围绕flash进行分区,使用partitions.csv文件划分功能。具体配置:在 menuconfig 中选择了 “Custom partition table CSV”,手动编辑partitions.csv文件,可以分配片上flash的4-8M给不同的功能使用。下表一:
在这里插入图片描述

(一) NVS 表

通过esp_partition API 使用flash上分区定义的名字为nvs的区域空间,存储的方式类似哈希表,即索引和存储内容一 一对应,NVS区域大小则视具体业务在.csv文件中自行定义。
使用方式:

#include <stdio.h>
#include <string.h>
#include "sdkconfig.h"
#include "esp_log.h"
#include "nvs_flash.h"

#define NVS_NAME    "mesh_example"  //表名
static const char *NVS_INDEX="nvs_data";// 索引规矩16个字符内有效

//存数据
void setNvsData(uint32_t data){
	nvs_handle nvs_handle;
	nvs_open(NVS_NAME, NVS_READWRITE, &nvs_handle);
	nvs_set_u32(nvs_handle,NVS_INDEX, data);
	nvs_commit(nvs_handle);
	nvs_close(nvs_handle);
}

//读数据
void getNvsData(uint32_t data){
    nvs_handle nvs_handle;
    nvs_open(NVS_NAME, NVS_READWRITE, &nvs_handle);
    nvs_get_i32(nvs_handle, NVS_INDEX, &data);
    nvs_close(nvs_handle);
}

(二)程序和OTA分区

otadata,factory,ota_0,ota_1这4个分区是存储当前程序和ota下载新版本程序使用的功能,主要为上电后程序映射区和系统ota时使用,不展开讲解了。区域大小一般3-6M,视OTA场景而定,以后专题有机会可以讲讲。

(三)SPIFFS 文件系统

SPIFFS 是一个官方开发的片上flash 设备的嵌入式文件系统,支持磨损均衡、文件系统一致性检查等功能。对应的是表一中的storage分区,区域大小视具体业务自行定义。特点:使用fopen、fclose等标准C文件接口进行文件标准操作。

使用方式:

#include <stdio.h>
#include <string.h>
#include "sdkconfig.h"
#include "fat_flash.h"

//挂载点
#define FLASH_MOUNT_POINT "/spiflash"

static wl_handle_t wlHandle = WL_INVALID_HANDLE;
int mountFlashInit(void){
	int ret=0;
    const esp_vfs_fat_mount_config_t mount_config = {
        .max_files = 5,
        .format_if_mount_failed = true,
        .allocation_unit_size = CONFIG_WL_SECTOR_SIZE
    };
    esp_err_t err = esp_vfs_fat_spiflash_mount(FLASH_MOUNT_POINT, "storage", &mount_config, &wlHandle);
    if (err != ESP_OK) {
        ESP_LOGE(TAG, "mount flash  fail:%s", esp_err_to_name(err));
        return -1;
    }
    ESP_LOGI(TAG, "mount flash  suceess");
     return ret;
}

// 写文件
void writeFile()
{
	FILE * ini ;
	if ((ini=fopen("/spiflash/sys/text.txt", "w"))==NULL) {
		ESP_LOGW(TAG, "iniparser: cannot %s\n",g_file_path);
	}
	fprintf(ini, "test123456\n" "\n");
	fprintf(ini, "\n");
	fclose(ini);
}

三、总结

使用合理使用片内SRAM、PSRAM、RTC存储器、Flash存储器,可以在各种场景下对业务数据进行存储

名称使用方式轻度休眠深度休眠esp_restar()掉电
片内SRAM程序定义数据保留丢失丢失丢失
PSRAM主动申请:malloc保留(可配置)丢失丢失丢失
RTCRTC RTC_NOINIT_ATTR保留保留丢失丢失
FLASHNVS或者文件系统保留保留保留保留

这次esp-s3的内存专题的分享到处结束,以后其他专题可能会开始给大家讲讲各种外设的用法,觉得有帮助可以点个赞,谢谢大家。

参考:

https://docs.espressif.com/projects/esp-idf/zh_CN/latest/esp32s3/api-guides/memory-types.html#iram-ram
https://www.espressif.com.cn/sites/default/files/documentation/esp32-s3_technical_reference_manual_cn.pdf
https://blog.csdn.net/qq_41741344/article/details/116380816

  • 4
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
ESP32内部RTC (Real-Time Clock) 是一种用于精准计时和日期记录的硬件。RTC在不依赖外部环境的情况下,可以提供准确的时间和日期信息。 使用ESP32内部RTC,首先我们需要初始化RTC模块。我们可以通过调用Arduino库中的函数来完成初始化。初始化后,RTC将开始自我维护并计时。 一旦初始化完成,我们可以使用ESP32内部RTC进行以下操作: 1. 获取时间:我们可以使用RTC功能来获取当前的年份、月份、日期、小时、分钟和秒钟。这些信息可以用于各种应用,如记录日志、时间同步等。 2. 设置时间:除了获取时间外,我们还可以使用RTC功能来设置模块的时间值。我们可以手动设置年份、月份、日期、小时、分钟和秒钟,以便与外部时间源进行同步。 3. 闹钟功能:ESP32内部RTC还支持闹钟功能。我们可以设置闹钟,当时间达到指定的时间时,触发一个中断或执行一系列操作。 4. 低功耗:RTC模块在大多数时间处于低功耗模式,以节约能量。这对于需要长时间运行的应用程序非常有用。 值得注意的是,ESP32内部RTC并不是高精度的计时器。它受到一些系统因素的影响,例如温度和电压变化。因此,在对时间要求非常高的应用中,可能需要使用外部的高精度时钟模块。 总的来说,ESP32内部RTC为我们提供了一种简便实用的计时和日期记录解决方案。它可以用于各种应用场景,包括数据日志、时间同步、闹钟等。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

水厂小白@

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值