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