AFON // радиотехник affonya@mail.ru
← Радиотехника

EEPROM и Flash микроконтроллера

Энергонезависимая память МК: EEPROM для настроек и данных, ресурс перезаписи и износ, самопрограммирование Flash и бутлоадер — как хранить данные и не «убить» память.

Память микроконтроллера

В микроконтроллере три вида памяти, и их важно не путать: Flash хранит программу, RAM — переменные (стирается при выключении), EEPROM — небольшая энергонезависимая область для настроек и данных, переживающих отключение питания. Эта статья — о том, как пользоваться энергонезависимой памятью: EEPROM и самопрограммированием Flash.

EEPROM: хранение настроек

EEPROM позволяет побайтно читать и записывать данные, сохраняющиеся без питания: калибровки, счётчики, пользовательские настройки, серийные номера. Доступ — через регистры (адрес, данные, управление) или готовые функции библиотеки (например, eeprom_read_byte/eeprom_write_byte в avr-libc).

#include <avr/eeprom.h>
uint8_t v = eeprom_read_byte((uint8_t*)0);   // чтение
eeprom_write_byte((uint8_t*)0, 42);          // запись

Ресурс записи и износ

У EEPROM (и Flash) ограниченный ресурс циклов перезаписи — обычно около 100 000 для EEPROM и меньше для Flash. Запись к тому же медленнее чтения. Отсюда правила:

  • не писать в цикле без нужды;
  • писать только при реальном изменении данных;
  • для частых записей применять выравнивание износа (wear leveling) — распределять записи по разным ячейкам.

Самопрограммирование Flash и бутлоадер

Многие МК умеют записывать собственную Flash в работе (self-programming). На этом основан бутлоадер — небольшая программа, позволяющая обновлять прошивку без программатора (через UART, USB, «по воздуху»). Именно бутлоадер делает возможной загрузку скетчей в Arduino по USB. Часть Flash также используют как дополнительное энергонезависимое хранилище данных.

Частые вопросы

Чем EEPROM отличается от Flash?

Flash хранит программу и стирается/пишется блоками, EEPROM — данные, доступные побайтно, с большим ресурсом перезаписи. EEPROM удобна для настроек, Flash — для кода и крупных массивов.

Почему нельзя постоянно писать в EEPROM?

Ресурс ограничен (~100 000 циклов на ячейку). Частая запись в одну ячейку быстро её изнашивает. Пишите только при изменении данных и распределяйте записи по адресам.

Итоги

Энергонезависимая память МК — EEPROM для настроек и данных, Flash для программы (с возможностью самопрограммирования и бутлоадера). Главное ограничение — конечный ресурс перезаписи: пишите редко, только при изменениях и с выравниванием износа при частых записях.

Смотрите также: AVR на C · Arduino и бутлоадер · PIC · Intel HEX.