В статье поговорим как работать с энергонезависимой памятью 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.





Абсолютно бесполезная статья.
Добрый день! Что у вас не получилось в этой статье?