Память в ESP32

ESP32 Wroom

В статье поговорим как работать с энергонезависимой памятью ESP32. Рассмотрим основные функции для чтения и записи данных. Весь код будет приведен для VS CODE + плагин PlatformIO IDE с использованием ESP-IDF библиотек.

Распределение памяти ESP32

Из данных на модуль ESP32 Можно узнать, что у микроконтроллера имеется несколько типов памяти RAM:

  • Встроенная память SRAM с объемом 520 килобайт. Она используется для хранения инструкция и собственно самой программы.
  • 8 кб быстрой памяти и 8 килобайт медленной памяти (эти два типа используются процессором и сопроцессорм).
  • 1 кбит памяти eFuse. Данная память используется для хранение мак адреса, идентификатора чипа, конфигурации чипа, а так же часть зарезервирована для клиентских приложений.
  • Внешняя flash память 4-16 Мб. 4 — мя мегабайтами памяти, модуль оснащается по умолчанию. Данная память подключается по QSPI и разделена на несколько разделов. Работа с ней и пойдет в данной статье.

SPI Flash память ESP32

Как было сказано выше, SPI Flash память ESP32 разделена не несколько разделов:

  • NVS: для хранения пользовательских данных.
  • 2 раздела приложений: для хранения пользовательских программ + возможность выполнять обновления встроенного ПО.
  • OTA OTAdata: используется для обновления встроенного ПО OTA (по воздуху).
  • SPIFFS: Файловая система SPI Flash для хранения файлов и управления ими.
  • CoreDump: для целей отладки и диагностики.

Мы будем работать с первым разделом NVS (Non-Volatile Memories).

Память в ESP32: Запись

Рассмотрим код ниже:

void write_to_EEPROM(char *value, uint32_t size)
{
    char *saveId;
    uint32_t sizeSave = (size);
    saveId = malloc(sizeSave);
    strcpy(saveId,value);
    nvs_handle_t my_handle;
    nvs_open("storage", NVS_READWRITE, &my_handle);
    nvs_set_str(my_handle, "ID", saveId);
    nvs_commit(my_handle);
    nvs_close(my_handle); 
    free(saveId);  
}

nvs_handle_t my_handle объявляем переменную структуры nvs_handle_t. Она требуется для передачи в функцию.

далее вызываем функцию nvs_open(«storage», NVS_READWRITE, &my_handle), где «storage» — раздел куда будем сохранять наши данные, NVS_READWRITE — атрибут доступа к разделу, указатель на структуру nvs_handle_t.

После этого отправляем данные, в нашем случае, строку на сохранение в память ESP32.

nvs_set_str(my_handle, «ID», saveId), где ID — метка по которой мы сможем найти наши данные в памяти, saveId — сами данные.

функция nvs_commit — записывает во флеш память любые изменения.

nvs_close — освобождаем наш дескриптор.

SPI Flash память ESP32: чтение

Чтение происходит по тому же алгоритму что и запись.

void read_to_EEPROM()
{
    nvs_handle_t my_handle;
    size_t nvs_required_size_id;
    nvs_open("storage", NVS_READWRITE, &my_handle);
    nvs_get_str(my_handle, "ID", NULL,&nvs_required_size_id);
    char nvs_ret_data_id[10];
    nvs_get_str(my_handle, "ID", (char *)&nvs_ret_data_id, &nvs_required_size_id);
    nvs_close(my_handle);                                   
}

Для чтения нам так же необходимо открыть наш раздел функцией nvs_open.

После этого вызвать функцию nvs_get_str(my_handle, «ID», NULL,&nvs_required_size_id), здесь мы вместо буфера для чтения указываем NULL. Если NULL то функция вернет в переменную nvs_required_size_id размер сохраненных данных под меткой ID.

Далее мы вновь вызываем функцию nvs_get_str, но уже указываем в какой буфер необходимо считать данные.

После этого освобождаем дескриптор.

ВНИМАНИЕ! Для работы с функциями NVS необходимо подключить библиотеку с помощью include -«nvs_flash.h»

ВАЖНО! Перед использованием функций NVS необходимо вызвать функцию инициализации:

     esp_err_t ret;
     // Initialize NVS.
     ret = nvs_flash_init();

Используйте полный список функция для изучения библиотеки NVS.

Все функции библиотеки NVS

Где купить

0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest
0 комментариев
Межтекстовые Отзывы
Посмотреть все комментарии