nvs_store.c

ESP32-H2 · Fichier : nvs_store.c · Langage : C · Usage : Conserver des données en mémoire flash NVS

La partition NVS est la mémoire de survie d'ESP-IDF : paires radio, clés Wi-Fi, ID Matter y vivent en paires clé-valeur avec usure répartie. Ce sketch y persiste un compteur de démarrages et lit une chaîne.

Matériel requis

Une carte ESP32-H2 (RISC-V 96 MHz, radio IEEE 802.15.4 uniquement — pas de Wi-Fi) type DevKitM-1, alimentée par USB. Aucun : la flash du module suffit (partition nvs créée par idf.py).

Branchement

Aucun câblage. Console USB-Serial/JTAG pour voir les logs à chaque redémarrage.

Fonctionnement

nvs_flash_init monte la partition (erase automatique si vierge), nvs_open ouvre le namespace « config », set_i32+commit garantissent l'écriture. nvs_get_str passe NULL pour la taille et renvoie ESP_ERR_NVS_NOT_FOUND si absent. Programmez avec ESP-IDF (idf.py set-target esp32h2) ; le port USB-Serial/JTAG (GPIO26/27) sert de console et de port de flash. Maintenez Boot + Reset pour le mode download si besoin.

Pour aller plus loin

Rangez-y les réglages de votre nœud (canal 802.15.4, seuils capteur) et un factory-reset via nvs_flash_erase().

nvs_store.c

// nvs_store.c — compteur persistant dans la partition NVS.
#include <string.h>
#include "nvs_flash.h"
#include "nvs.h"
#include "esp_log.h"

static const char *TAG = "nvs";

void app_main(void)
{
    esp_err_t err = nvs_flash_init();          // partition « nvs » du partition table
    if (err == ESP_ERR_NVS_NO_FREE_PAGES || err == ESP_ERR_NVS_NEW_VERSION_FOUND) {
        ESP_ERROR_CHECK(nvs_flash_erase());    // efface seulement au 1er flash
        err = nvs_flash_init();
    }
    ESP_ERROR_CHECK(err);

    nvs_handle_t h;
    ESP_ERROR_CHECK(nvs_open("config", NVS_READWRITE, &h));

    int32_t n = 0;
    nvs_get_i32(h, "compteur", &n);            // 0 si absent
    n++;
    ESP_ERROR_CHECK(nvs_set_i32(h, "compteur", n));
    ESP_ERROR_CHECK(nvs_commit(h));            // ecriture physique
    ESP_LOGI(TAG, "demarrage n°%d persiste", (int)n);

    char wifi[32] = "inconnu";
    if (nvs_get_str(h, "reseau", wifi, NULL) == ESP_OK)
        ESP_LOGI(TAG, "reseau memorise : %s", wifi);
    nvs_close(h);

    while (1) vTaskDelay(pdMS_TO_TICKS(1000));
}

← Retour à la fiche