В настоящее время флэш-память используется для хранения программного кода, а EEPROM (электрически стираемая постоянная память) используется для хранения постоянных данных. Еще около 30 лет назад, до появления Flash, EEPROM использовались для хранения программного кода.
На самом деле сначала было ROM (постоянное запоминающее устройство), затем PROM (программируемое ROM, только один раз), EPROM (PROM, стираемое ультрафиолетовым излучением), EEPROM и, наконец, Flash. ПЗУ по-прежнему используются для очень больших и недорогих приложений (например, говорящих поздравительных открыток).
Важное отличие от современных микроконтроллеров состоит в том, что вы, как правило, не можете выполнять код из EEPROM, и для программ неудобно хранить данные во флэш-памяти. (Данные хранятся во флэш-памяти, когда, например, вы используете ключевое слово «const» в объявлении данных или определяете строку, но это обрабатывается за кулисами компилятором и компоновщиком.)
Область EEPROM может использоваться для хранения конфигурации или других данных, которые вы хотите получить при перезагрузке, в том числе, если микроконтроллер потерял питание, а затем снова включился. Функционально вы можете думать о EEPROM как о очень маленьком жестком диске или SD-карте.
На микроконтроллерах без EEPROM возможно сохранение постоянных данных во флэш-памяти, но это становится трудным, поскольку микроконтроллеры не были специально разработаны для этого, и вам нужно найти специальное место, которое не будет мешать коду программы, и отложить это в сторону с компоновщиком. Кроме того, как упоминалось ниже, вы обычно можете обновить EEPROM во много раз больше, чем флэш-память.
Если вы делаете данные программы во флэш-памяти, это не означает, что вы можете получить доступ к данным как переменным в вашей C-программе, потому что нет способа сообщить компилятору, где эти переменные находятся в вашем коде (то есть вы не можете связать const переменная в этой области вспышки.) Таким образом, их чтение должно осуществляться через специальный набор регистров, которые используются для их записи. Обратите внимание, что это ограничение относится и к данным в EEPROM, поэтому оно не имеет преимуществ в этом отношении.
Чтобы запрограммировать флэш-память или EEPROM, сначала необходимо удалить блок памяти. Тогда это запрограммировано. Для флэш-записи, как правило, запись также выполняется за один раз. Для EEPROM это может быть сделано блоками или байтами за раз, в зависимости от микроконтроллера.
Как для флэш-памяти, так и для EEPROM, вы можете обновить их максимальное количество раз, прежде чем изнашивать память. Этот номер указан в техническом описании как минимальное гарантированное значение. Это обычно намного выше для EEPROM, чем для флэш-памяти. Для флеш-памяти я видел цифры до 1000. Для EEPROM я видел цифры до 1 000 000.
Одним из преимуществ EEPROM перед флэш-памятью является то, что вы можете стирать их намного чаще, чем вы можете стирать флэш-память.
«Самопрограммируемый в системе» означает, что микроконтроллер может обновлять собственную флэш-память во время работы. Эта функция обычно используется для обновления кода в поле. Хитрость заключается в том, что вам нужно оставить некоторый код в системе во время обновления основной программы, называемой загрузчиком. Эта схема используется в системе Arduino для программирования чипа.
Я добавлю еще немного информации к отличному ответу @tcrosley.
ATmega16 реализует архитектуру Гарварда , то есть топологию системы, в которой память данных отделена от памяти программ. Цитирую соответствующий абзац из таблицы данных Atmega16 (стр. 8):
Гарвардская архитектура обладает тем преимуществом, что между циклами выборки команд и циклами доступа к данным отсутствует конфликт шины, поскольку данные и инструкции не используют одну и ту же шину, как в обычной архитектуре вашего ПК.
Поэтому флэш-память используется в качестве памяти программ, тогда как память данных разделяется между SRAM (для временных данных, таких как стек вызовов функций и куча - если вы программируете на C, например), и EEPROM (для постоянного хранения) ,
источник