Eeprom память что это

Обновлено: 04.07.2024

В данной статье речь пойдет об энергонезависимой памяти EEPROM (электрически стираемое программируемое постоянное запоминающее устройство). Как видно из названия EEPROM является разновидностью ПЗУ , важной особенностью которой является возможность перезаписывать хранимые в памяти значения (в отличие от FLASH-памяти) во время выполнения скетча и сохранять после отключения питания.

Энергонезависимая память EEPROM прекрасно подходит для хранения настроек работы устройства , которые были выбраны пользователем во время его работы и должны быть сохранены при отключении питания. Например, пользователь может задать определенную температуру, при которой микроконтроллер должен включить нагревательный элемент. Или определенную влажность почвы, при которой будет включен автополив. Определенную освещенность, при которой будет включено освещение и т.д. Так же в данной памяти можно логировать данные , получаемые от внешних датчиков и возникающие в процессе работы ошибки для последующей отладки.

В размещенной ниже таблице можно посмотреть сравнение различных типов памяти у микроконтроллеров серии ATtiny и микроконтроллера ATmega328 (основы Arduino UNO).

Сравнительная таблица объема памяти у различных микроконтроллеров Сравнительная таблица объема памяти у различных микроконтроллеров

Как видно из таблицы, размер EEPROM либо равен размеру памяти SRAM (оперативной памяти), либо даже меньше неё. И существенно меньше размера FLASH-памяти (памяти для хранения кода программы).

Работа с памятью EEPROM в среде Arduino UNO отличается от работы с памятью SRAM. При работе с оперативной памятью нам не нужно заботиться, где именно располагается значение переменной, к которой мы обращаемся. Т.к. на этапе компиляции программы под каждую переменную, в зависимости от ее размера, выделяется блок памяти, где и хранится значение переменной. Мы же извлекаем это значение или перезаписываем его, обращаясь к переменной по имени.

При работе с памятью EEPROM мы должны указывать непосредственно адрес байта, в котором храниться переменная . Учитывая, что переменные bool, char, byte – занимают 1 байт, переменные int, word - 2 байта, а переменные long, float – 4 байта.

Т.е. в память EEPROM ATtiny13 можно записать 64 значения переменной типа byte, 32 значения переменной типа int и 16 значений переменной типа long. При этом в качестве адреса ячейки памяти при записи и чтении мы указываем номер первого байта переменной.

Для работы с памятью EEPROM в среде Arduino IDE служит специальная библиотека EEPROM.h . В её примерах есть несколько скетчей, показывающих как работать с основными функциями библиотеки.

Основные функции библиотеки EEPROM.h.

EEPROM.length () - возвращает размер памяти EEPROM в байтах.

EEPROM.write (address, value) – записывает значение value величиной 1 байт (0-255) по адресу address (от 0 до EEPROM.length()).

EEPROM.read(address) – читает и возвращает байт данных, размещенной по адресу address.

EEPROM.update(address, value) – обновляет байт памяти (записывает новое значение), если новое значение отличается от текущего. Этот вариант записи значения переменной предпочтительнее, т.к. продлевает срок службы памяти, уменьшая число перезаписей.

EEPROM.put(address, data) – автоматически вычисляет размер и записывает данные любого типа по адресу address .

С помощью данной функции можно размещать в памяти переменные разных размеров.

Например, можно последовательно записывать в память переменные разной длины:

не забывая вычислять размер переменной в байтах и сдвигать начальный байт записи на данный размер:

Так же можно объединить значения переменных в массив или сами переменные в структуры и записывать с помощью функции EEPROM.put() массив или структуру целиком.

EEPROM.get(address, data) – считывает данные по адресу address и заносит их в указанную переменную data .

Естественно, что тип и размер данных, записанных с помощью функции EEPROM.put(), должен совпадать с типом и размером данных, читаемых функцией EEPROM.get(). В примерах библиотеки есть скетчи, иллюстрирующие работу этих функций.

Еще в библиотеке есть оператор EEPROM[] , который позволяет работать с памятью EEPROM как с массивом байтов.

byte val = EEPROM[0]; - т.е., получить значение из нулевой ячейки памяти EEPROM
EEPROM[0] = val; - и записать новое значение в нулевую ячейку памяти EEPROM

В следующей статье, я расскажу, как увеличить объем памяти EEPROM до 64 КБ . Это будет особенно актуально для микроконтроллеров с малым объемом всех типов памяти, таких как ATtiny .

За счет того, что скорость чтения данных из памяти EEPROM очень велика, мы можем использовать внешнюю память EEPROM как дополнительную оперативную память, либо хранить в ней достаточно объемные массивы данных. Например, шрифты для работы с LED-матицами и LCD-дисплеями. В статье " Создание анимации для LED матрицы 16x16 адресных светодиодов ", мы хранили массив изображения с помощью ключевого слова PROGMEM во FLASH-памяти (из-за нехватки оперативной памяти). Подключив внешнюю EEPROM память, изображения и шрифты можно будет хранить во внешней памяти , оставив FLASH-память исключительно для того, для чего она и предназначена, т.е. для хранения прошивки микроконтроллера.

Спасибо, что дочитали до конца! Если статья понравилась, нажмите, пожалуйста, соответствующую кнопку. Если интересна тематика электроники и различных электронных самоделок, подписывайтесь на канал. До встречи в новых статьях!


Тип Чтение из программы Запись из программы Очистка при перезагрузке
Flash Да, PROGMEM Можно, но сложно Нет
SRAM Да Да Да
EEPROM Да Да Нет

EEPROM представляет собой область памяти, состоящую из элементарных ячеек с размером в один байт (как SRAM). Объём EEPROM разный у разных моделей МК:

  • ATmega328 (Arduino UNO, Nano, Pro Mini): 1 кБ
  • ATmega2560 (Arduino Mega): 4 кБ
  • ATtiny85 (Digispark): 512 Б

Важный момент: все ячейки имеют значение по умолчанию (у нового чипа) 255.

Скорость работы с EEPROM (время не зависит от частоты системного клока):

Возможны искажения при записи данных в EEPROM при слишком низком VCC (напряжении питания), настоятельно рекомендуется использовать BOD или вручную мониторить напряжение перед записью.

При использовании внутреннего тактового генератора на 8 МГц, его отклонение не должно быть выше 10% (7.2-8.8 МГц), иначе запись в EEPROM или FLASH скорее всего будет производиться с ошибками. Соответственно все разгоны внутреннего клока недопустимы при записи EEPROM или FLASH.

Библиотека avr/eeprom.h

Запись:

Обновление:

Макросы:

Рассмотрим простой пример, в котором происходит запись и чтение единичных типов данных в разные ячейки:

Точно так же можно хранить массивы:

Ну и напоследок, запись и чтение блока через EEMEM. Адрес придётся преобразовать в (const void*) вручную:

Библиотека EEPROM.h

В отличие от avr/eeprom.h у нас нет отдельных инструментов для работы с конкретными типами данных, отличными от byte, и сделать write/update/read для float/long/int мы не можем. Но зато у нас есть всеядный put/get, который очень удобно использовать! Также можем пользоваться тем, что нам даёт avr/eeprom.h, которая подключается автоматически с EEPROM.h. Рассмотрим пример с чтением/записью байтов:

Логика работы с адресами такая же, как в предыдущем пункте урока! Обратите внимание на работу с EEPROM как с массивом, можно читать, писать, сравнивать, и даже использовать составные операторы, например EEPROM[0] += 10 , но это работает только для элементарных ячеек, байтов. Теперь посмотрим, как работает put/get:

Гораздо удобнее чем write_block и read_block, не правда ли? Put и get сами преобразовывают типы и сами считают размер блока данных, использовать их очень приятно. Они работают как с массивами, так и со структурами.

EEPROM.h + avr/eeprom.h

Ну и конечно же, можно использовать одновременно все преимущества обеих библиотек, например автоматическую адресацию EEMEM и put/get. Рассмотрим на предыдущем примере, вместо ручного задания адресов используем EEMEM, но величину придётся привести к целочисленному типу, сначала взяв от него адрес, т.е. (int)&адрес_еемем

С возможностями библиотек разобрались, перейдём к практике.

Реальный пример

Рассмотрим пример, в котором происходит следующее: две кнопки управляют яркостью светодиода, подключенного к ШИМ пину. Установленная яркость сохраняется в EEPROM, т.е. при перезапуске устройства будет включена яркость, установленная последний раз. Для опроса кнопок используется библиотека GyverButton. Для начала посмотрите на первоначальную программу, где установленная яркость не сохраняется. Программу можно чуть оптимизировать, но это не является целью данного урока.

  • Подключить библиотеку EEPROM.h
  • При запуске: чтение яркости из EEPROM и включение светодиода
  • При клике: запись актуального значения в EEPROM

Полезные трюки

Инициализация

  1. Чтение из EEPROM в переменную
  2. Использование переменной по назначению

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

Теперь при первом запуске мы получим инициализацию нужных ячеек. Если нужно переинициализировать EEPROM, например в случае добавления новых данных, достаточно изменить наш ключ на любое другое значение в пределах одного байта (0-254). Я пишу именно до 254, потому что 255 является значением ячейки по умолчанию и наш трюк не сработает.

Скорость

Как я писал выше, скорость работы с EEPROM составляет:

При большом желании можно использовать ячейку вместо переменной, т.е. выше мы с вами рассматривали пример, в котором EEPROM читался в переменную в программе, и дальнейшая работа происходила уже с ней. При сильной нехватке оперативной памяти можно читать значение напрямую из EEPROM, ведь это занимает ничтожно мало времени. А вот с записью всё гораздо хуже, там целых 3.3 мс. Например так:

Для изменения значения придётся прочитать ячейку, выполнить нужные операции, и снова в неё записать. Ещё один удобный хак: можно ввести макросы на чтение и запись определённых значений, например:

Получим удобные макросы, с которыми писать код будет чуть быстрее и удобнее, т.е. строка SET_MODE(3) запишет 3 в ячейку 0

Уменьшение износа

Посмотрим на всё том же примере:

    Ёмкий конденсатор по питанию микроконтроллера, позволяющий сохранить работу МК после отключения питания на время, достаточное для записи в EEPROM (

Вариантов уменьшения износа ячеек EEPROM можно придумать много, уникально под свою ситуацию. Есть даже библиотеки готовые, например EEPROMWearLevel. Есть очень интересная статья на Хабре, там рассмотрено ещё несколько хороших алгоритмов и даны ссылки на ещё большее их количество.

Видео


Забросил я уроки для начинающих, сегодня поговорим о EEPROM — энергонезависимой памяти.

Эта память одно из главных составляющих в функционале поделок на микроконтроллерах, любой начинающий микроконтроллерщик подходит к этапу освоения этой энергонезависимой памяти. Оно и ежу понятно, что сохранять настройки очень часто надо, нужно и без этого нельзя.

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

Объявляется еепром так же как и переменная, работают с еепром так же как с переменной, кроме некоторых но. Пример (Code Vision AVR):

unsigned char a; // объявляем беззнаковую переменную размером 8 бит
unsigned char eeprom eea; // объявляем "переменную" в еепром такого же типа, этого достаточно, всю остальную работу делает компилятор.

Переменную я обозвал в кавычках, ибо с ней можно обращаться как с обычной переменной, а в остальном она ведет себя по другому:

1. — значение хранимое в ЕЕПРОМ по умолчанию равно максимально возможному числу, в нашем случае после объявления в eea лежит число 255 или оно же 0xFF или оно же 0b11111111.
2- количество циклов стирания-записи у памяти ЕЕПРОМ относительно мало, поэтому нужно максимально ограничивать число записей в алгоритме программы.

3. Память ЕЕПРОМ самый тормозной тип данных, это нужно учитывать. Особенно при записи в ЕЕПРОМ. Можно получить каку, например, запихнув обработку еепром в прерываниях. В особо ответственных моментах можно использовать флаги состояния памяти ЕЕПРОМ, бывает очень полезно.

После обявления еепром и переменной я делаю команду присвоения числа из еепром в переменную, до начала основного цикла и как правило до начала работы прерываний:

После этого я верчу как хочу эту переменную, пишу в нее, читаю, используя ее в алгоритме и в нужный момент, когда нужно сохранить делаю так, чтоб данные закатились из этой переменной обратно в ЕЕПРОМ единожды:

Вот пример куска кода записи в ЕЕПРОМ:

unsigned char a; // объявляем беззнаковую переменную размером 8 бит
unsigned char eeprom eea; // объявляем еепром такого же типа,
unsigned char trig; // объявляем переменную, которая будет помнить, что кнопка нажата.

Далее идет основанная часть программы void main(void), в ней :

a=eea; // загоняем данные в с еепром в переменную

Далее идет главный цикл while(1) и в теле цикла:

if(key==1) // если кнопка настройки нажата, то:

trig=1; // включаем триггер, который запоминает, что кнопка нажата
a*b+b^2 ; //тут что то делаем нужное, когда кнопка нажата
>
else // если кнопка отжата

LED=1 ; //тут что то делаем нужное, когда кнопка отжата
if(trig) //если кнопка отжата и триггер включен, то:

eea=a; // пишем переменную а в еепром
trig=0; // сбрасываем триггер
>
>

Запись в ЕЕПРОМ срабатывает по отжатию кнопки единожды, когда триггер равен единице.


EEPROM (также E 2 PROM ) обозначает электрически стираемую программируемую постоянную память и представляет собой тип энергонезависимой памяти, используемой в компьютерах, интегрированных в микроконтроллеры для смарт-карт и удаленных систем без ключа , а также других электронных устройств для хранения относительно небольших объемов данные, позволяя стирать и перепрограммировать отдельные байты.

EEPROM организованы как массивы транзисторов с плавающим затвором . EEPROM можно программировать и стирать внутри схемы, применяя специальные программные сигналы. Первоначально EEPROM были ограничены однобайтовыми операциями, что делало их медленнее, но современные EEPROM допускают многобайтовые операции со страницами. EEPROM имеет ограниченный срок службы для стирания и перепрограммирования, теперь он достигает миллиона операций в современных EEPROM. В EEPROM, которая часто перепрограммируется, срок службы EEPROM является важным аспектом проектирования.

Флэш-память - это тип EEPROM, разработанный для обеспечения высокой скорости и высокой плотности за счет больших блоков стирания (обычно 512 байт или больше) и ограниченного количества циклов записи (часто 10 000). Между ними нет четкой границы, но термин «EEPROM» обычно используется для описания энергонезависимой памяти с небольшими блоками стирания (размером всего один байт) и длительным сроком службы (обычно 1 000 000 циклов). Многие микроконтроллеры включают в себя как флэш-память для прошивки , так и небольшую EEPROM для параметров и истории.

По состоянию на 2020 год флеш-память стоит намного меньше, чем байтово-программируемая EEPROM, и является доминирующим типом памяти там, где системе требуется значительный объем энергонезависимой твердотельной памяти . Однако EEPROM по-прежнему используются в приложениях, которым требуется только небольшой объем памяти, например, при последовательном обнаружении присутствия .

СОДЕРЖАНИЕ

История

В начале 1970-х годов различные компании и организации выполняли некоторые исследования, изобретения и разработки электрически перепрограммируемой энергонезависимой памяти . В 1971 году ранние исследования доклад был представлен на 3 - й Конференции по твердотельными устройствами , Токио в Японии Ясуо Таруи, Yutaka Hayashi и Кийоко Нагаи в электротехнической лаборатории ; Японский национальный исследовательский институт. Они изготовили устройство EEPROM в 1972 году и продолжали это исследование более 10 лет. Эти статьи неоднократно цитировались в более поздних статьях и патентах.

Одна из их исследований включают в себя Моноса ( металл - оксид - нитрид -oxide- полупроводник ) технологию, которая использовала Renesas Electronics " флэш - память интегрированы в однокристальных микроконтроллерах .

В 1972 году Фудзио Масуока из Toshiba, который также известен как изобретатель флеш-памяти, изобрел тип электрически перепрограммируемой энергонезависимой памяти . Большинство крупных производителей полупроводников, таких как Toshiba , Sanyo (позже ON Semiconductor ), IBM , Intel , NEC (позже Renesas Electronics ), Philips (позже NXP Semiconductors ), Siemens (позже Infineon Technologies ), Honeywell (позже , Atmel ), Texas Instruments до 1977 года изучала, изобретала и производила некоторые электрически перепрограммируемые энергонезависимые устройства.

Теоретической основой этих устройств является инжекция горячего носителя Avalanche . Но в целом программируемая память, включая EPROM, начала 1970-х годов имела проблемы с надежностью и долговечностью, такие как периоды хранения данных и количество циклов стирания / записи.

В феврале 1977 года Элияху Харари из Hughes Aircraft Company изобрел новую технологию EEPROM, использующую туннелирование Фаулера-Нордхейма через тонкий слой диоксида кремния между плавающим затвором и пластиной . Хьюз продолжил производство этих новых устройств EEPROM. Но в этом патенте цитируется изобретение NEC EEPROM®.

В мае 1977 года Fairchild и Siemens обнародовали важный результат исследования . Они использовали структуру SONOS ( поликремний - оксинитрид - нитрид - оксид - кремний ) с толщиной диоксида кремния менее 30 Å и структуру SIMOS ( MOS с многослойной инжекцией ), соответственно, для использования туннельной инжекции горячих носителей Фаулера-Нордхейма .

Примерно с 1976 по 1978 год команда Intel, включая Джорджа Перлегоса, сделала несколько изобретений, чтобы улучшить технологию туннелирования E 2 PROM. В 1978 году они разработали устройство Intel 2816 с битом 16K (2K слов × 8) с тонким слоем диоксида кремния , который составлял менее 200 Å . В 1980 г. эта структура была публично представлена ​​как FLOTOX ; оксид туннеля с плавающим затвором . Структура FLOTOX повысила надежность циклов стирания / записи на байт до 10 000 раз. Но этому устройству требовалось дополнительное напряжение смещения 20–22 В PP для стирания байта, за исключением операций чтения 5 В. В 1981 году Перлегос и двое других участников покинули Intel, чтобы сформировать Seeq Technology , которая использовала накачки заряда на устройстве для подачи высокого напряжения, необходимого для программирования E 2 PROM. В 1984 году Perlogos покинул Seeq Technology, чтобы основать Atmel , затем Seeq Technology была приобретена Atmel.

Читайте также: