Almacenamiento Persistente en la Memoria Flash
En esta sección, exploraremos el uso del entorno de desarrollo y el SDK para trabajar con la memoria persistente en dispositivos con ESP32.
¿Qué es la Memoria Persistente?
La memoria persistente permite almacenar datos de forma permanente, es decir, los datos se conservan incluso si el dispositivo se apaga o pierde energía.
📌 Ejemplos de uso: ✅ Mantener configuraciones tras un reinicio.
✅ Actualizar software sin perder datos previos.
✅ Almacenar credenciales de Wi-Fi para evitar ingresarlas manualmente en cada reinicio.
Ahora, veamos cómo implementarlo en código.
1. Configuración del Entorno
Para trabajar con la memoria persistente en ESP32, utilizaremos Visual Studio Code y agregaremos las siguientes librerías:
#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "nvs_flash.h"
#include "nvs.h"
📌 Librerías utilizadas:
- freertos/FreeRTOS.h → Necesaria para manejar tareas en ESP32.
- nvs_flash.h → Permite el control de la memoria flash.
- nvs.h → Contiene funciones para gestionar la memoria persistente (NVS = Non-Volatile Storage).
2. Inicialización de la Memoria Flash
Para utilizar la memoria NVS, primero debemos inicializarla con:
esp_err_t err = nvs_flash_init();
printf("NVS Init!\n");
printf((err != ESP_OK) ? "Failed\n" : "Done\n");
📌 ¿Qué hace nvs_flash_init()?
✅ Verifica que la memoria flash esté conectada.
✅ Asegura que todas las direcciones necesarias están disponibles.
✅ Devuelve un código de error en caso de problemas.
3. Creación de una Partición en Memoria
Para mejorar la organización de los datos, crearemos una partición en memoria.
📌 Ejemplo de uso:
- Un segmento para configuración de Wi-Fi.
- Otro segmento para datos de usuario o aplicación.
Para acceder a una partición de memoria, usamos:
nvs_handle_t my_storage;
err = nvs_open("storage", NVS_READWRITE, &my_storage);
printf("NVS Open\n");
printf((err != ESP_OK) ? "Failed\n" : "Done\n");
4. Escribir Datos en la Memoria Flash
Ahora almacenaremos un número entero (int32_t) en la memoria persistente.
err = nvs_set_i32(my_storage, "number", 10);
printf("NVS Set\n");
printf((err != ESP_OK) ? "Failed\n" : "Done\n");
📌 ¿Qué hace este código? ✅ Almacena el número 10 en la memoria flash.
✅ Asigna la clave "number" para identificarlo.
✅ Verifica si la operación se realizó correctamente.
5. Guardar los Datos de Forma Permanente
En algunas implementaciones, la memoria flash no almacena los datos inmediatamente. Para garantizar que se guarden, usamos:
err = nvs_commit(my_storage);
printf("NVS Commit\n");
printf((err != ESP_OK) ? "Failed\n" : "Done\n");
📌 ¿Qué hace nvs_commit()? ✅ Confirma que los datos queden almacenados de forma permanente.
6. Leer los Datos desde la Memoria Flash
Ahora, recuperaremos el número almacenado:
int32_t number;
err = nvs_get_i32(my_storage, "number", &number);
printf("NVS Get\n");
printf((err != ESP_OK) ? "Failed\n" : "Done\n");
printf("El valor recuperado es: %d\n", number);
📌 ¿Qué hace este código? ✅ Recupera el valor guardado con la clave "number".
✅ Lo almacena en la variable number.
✅ Imprime el valor en la consola.
7. Cerrar la Memoria NVS
Para liberar los recursos, cerramos la memoria:
nvs_close(my_storage);
printf("End\n");
📌 ¿Por qué es importante? ✅ Los dispositivos con ESP32 tienen memoria y procesamiento limitados.
✅ Liberar memoria mejora la eficiencia y previene fugas de recursos.