Защита памяти eeprom

RDC2-0026, USB программатор FLASH и EEPROM памяти. STM32F042F6P6

То, что у вас уже есть, вы можете удалить в корзине.

USB-программатор предназначен для записи и чтения микросхем памяти серий 24хх, 25хх, 93хх, 95хх. На плате установлена панель для микросхем в корпусе DIP-8, предусмотрены посадочные места для микросхем в корпусах SOIC-8 и SOIC-16 (для серии 25хх). Все необходимые для работы с микросхемами сигналы выведены на разъемы.

Для записи микросхем памяти необходимы файлы формата .bin. или .Hex сформированного программой SigmaStudio. Для преобразования файлов из других форматов рекомендуется использовать утилиту SRecord.

Характеристики

поддерживаемые серии микросхем памяти: 24хх, 25хх, 93хх, 95ххподдерживаемые корпуса: DIP-8, SOIC-8, SOIC-16 (для серии 25хх) максимальная тактовая частота: 24хх – 1 МГц; 25хх / 95хх – 24 МГц; 93хх – 2 МГцнапряжение питания микросхем памяти: 3,3 Вформат файла для записи / чтения: .binчтение / запись регистра состояния микросхем памяти

хранение шаблонов микросхем памяти в формате .txt

Микросхема памяти

Для работы с микросхемой памяти необходимо выбрать тип памяти, объем, размер страницы, организацию (для микросхем Microwire), тактовую частоту и способ подключения микросхемы к программатору.

Для удобства параметры микросхем памяти можно сохранять (кнопка «Сохранить») как шаблоны в формате . txt. При выборе шаблона (кнопка «Выбрать») загружаются предустановленные в нем параметры микросхемы.

Действия

Проверить подключение

Выполняется подключение к микросхеме памяти. Недоступно для памяти Microwire. Для памяти SPI FLASH выполняется команда «0x9F – чтение ID».

Стереть

Выполняется стирание содержимого микросхемы памяти. Для памяти SPI FLASH выполняется команда «0xC7 – chip erase». Для остальных типов памяти выполняется запись всего объема значением 0хFF. Все данные стираются без возможности восстановления.

Внимание! Перед стиранием SPI-микросхем памяти необходимо убедиться, что в микросхеме не установлена зашита от записи. Эта информация содержится в регистре состояния микросхемы

Проверить на чистоту

Выполняется проверка микросхемы памяти на содержание данных.

Записать

Выполняется запись микросхемы памяти данными из выбранного файла. Если размер файла меньше объема памяти микросхемы, оставшаяся часть памяти будет стерта (заполнена значением 0xFF).

Если размер файла больше объема памяти микросхемы, будет выполнена запись объема данных, равного объему памяти микросхемы.
Для действия «Записать» доступна опция «Проверить после записи».

Если она выбрана, после записи будет выполнено чтение микросхемы памяти и сравнение ее содержимого с указанным для записи файлом.

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

Внимание! Для памяти SPI FLASH перед записью необходимо выполнить стирание

Прочитать

Выполняется чтение памяти микросхемы и запись прочитанных данных в указанный файл. Если указанный файл не существует, выполняется создание нового файла с указанным именем. Если указанный файл существует, выполняется его замена новым файлом.

Для действия «Прочитать» доступна опция «Сравнить с». Если она выбрана, после чтения будет выполнено сравнение содержимого микросхемы памяти с указанным файлом.

Если размер указанного файла не равен объему памяти микросхемы, сравнение будет выполнено до последнего адреса меньшего объема.

Запись и чтение регистра состояния

Действия «Запись» и «Чтение» регистра состояния доступны для SPI-микросхем памяти и выполняются для одного байта регистра состояния.

Если регистр состояния микросхемы памяти имеет размер более одного байта, запись и чтение будут выполняться только для первого байта.

При этом во время записи возможно обнуление остальных байтов регистра состояния (подробную информацию необходимо смотреть в описании на конкретную микросхему).

Чтобы прочитать регистр состояния, в области «Регистр состояния» нажмите «Чтение». В поле напротив кнопки «Чтение» отобразится прочитанное значение в десятичном виде.

Чтобы выполнить запись регистра состояния, в области «Регистр состояния» в поле напротив кнопки «Запись» введите новое значение в десятичном виде и нажмите «Запись».

При записи регистра состояния содержимое поля, соответствующего действию «Чтение», удаляется.

Файл SigmaStudio

Для записи в микросхему памяти файла .hex SigmaStudio выберите опцию «Файл SigmaStudio». В этом случае программа позволит выбрать файлы E2Prom.Hex При нажатии кнопки записать налету преобразует их в формат .bin и запишет в выбранную микросхему памяти.

Источник: https://www.chipdip.ru/product/rdc2-0026

EEPROM. Avrdude. Снова про работу с контроллерами

CraVeg
Загрузка

12.05.16

17032

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

Дело в том, что не для всех очевиден тот факт, что EEPROM не прошивается при компиляции и заливки прошивки из Arduino IDE. То есть, это означает, что абсолютно ничего в EEPROM не заливается, когда прошивка заливается из IDE.

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

Но раз уж возник вопрос, то почему бы его не «разжевать». Давайте пройдёмся по порядку.Что такое EEPROM и зачем вести о нём речь?EEPROM — (Electrically Erasable Programmable Read-Only Memory) область энергонезависимой памяти микроконтроллера, в которую можно записать и прочитать информацию.

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

Как 3D принтер использует EEPROM?

Рассмотрим на примере Marlin'а. В Marlin Firmware «из коробки» EEPROM не используется. Параметры конфигуратора (Configuration.h), которые включают возможность его использования, по умолчанию, закомментированы.

#define EEPROM_SETTINGS

#define EEPROM_CHITCHATЕсли включено использование EEPROM, то принтер может хранить и использовать следующие настройки (подсмотрено у буржуев):

  • Количество шагов на миллиметр
  • Максимальная/минимальная скорость подачи [мм/с]
  • Максимальное ускорение [мм/с^2]
  • Ускорение
  • Ускорение при ретракте
  • Настройки PID
  • Отступ домашней позиции
  • Минимальная скорость подачи во время перемещения [мм/с]
  • Минимальное время участка [мс]
  • Максимальный скачок скорости по осям X-Y [мм/с]
  • Максимальный скачок скорости по оси Z [мм/с]

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

  • Store memory
  • Load memory
  • Restore Failsafe

Так же, можно использовать GCode для работы напрямую (через Pronterface).

  • Сохраняет текущие настройки в EEPROM до следующего запуска или выполнения команды M501.
  • Читает настройки из EEPROM.
  • Сбрасывает настройки на значения по-умолчанию, прописанные в Configurations.h. Если выполнить после неё M500, в EEPROM будут занесены значения по-умолчанию.
  • Выводит текущие настройки – ''Те, что записаны в EEPROM.''

О EEPROM в Repitier firmware можно почитать .

Как считать и записать данные в EEPROM?

Аналогично, описанному в , методу бэкапа прошивки, используя ключ -U. Только в данном случае после него будет указатель на то, что считывать нужно EEPROM.
Этой командой производится чтение данных EEPROM'а в файл «printer_eeprom.eep». В случае успеха, на экране вы увидите примерно следующее.Запись тоже не представляет из себя ничего сложного и выполняется аналогичной командой, которая отличается только тем, что в ключе -U стоит не «r», а «w».
В случае успеха, на экране вы увидите примерно следующее сообщение.Как и зачем стирать EEPROM?Для начала,- «зачем это делать?». Стирать EEPROM нужно в том случае, если предыдущая прошивка тоже его использовала, и в памяти мог остаться мусор. Где-то я уже натыкался на людей с проблемами, что после перехода с одной прошивки на другую (с Marlin на Repitier ЕМНИП), у них принтер начинал вести себя, скажем так, «творчески». Это связанно с тем, что разные прошивки хранят свои данные под разными адресами. И при попытке читать данные из неверного адреса начинается свистопляска.

Затереть EEPROM можно только программно из прошивки, но для этого придётся — на время залить в контроллер специальный скетч. Подробно об этом можно прочитать в .

Если же стирается EEPROM не в Arduino плате, а в каком-то абстрактном контроллере, то код скетча нужно будет изменить с учётом размера EEPROM в конкретном контроллере на плате. Для этого нужно будет поменять условие окончания в цикле «For». Например, для ATmega328, у которой 1kb памяти EEPROM, цикл будет выглядеть так:Вывод.

Источник: http://3Dtoday.ru/blogs/craveg/eeprom-avrdude-again-about-working-with-controllers/

Flash память STM32

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

Перейдя на контроллеры STM32 я с удивлением обнаружил, что такой памяти у них просто нет! Но как потом оказалось, существует аж целых две альтернативы такой памяти. Первая — использовать backup домен.

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

А сейчас мы рассмотрим второй способ энергонезависимого хранения пользовательских данных — flash память контроллера.

Да-да, та самая память в которой хранится написанная вами прошивка. Флеш памяти у STM32 полно, и зачастую остаются неиспользованные пару  килобайт, так почему бы не заюзать их. Если верить даташиту на STM32F100RBT6B, то производитель гарантирует как минимум 10000 циклов перезаписи.

На мой взгляд, если требуется запись данных не чаще пары раз в день, то можно смело использовать. Для записи во флеш используется FPEC (Flash program and erase controller) или по-нашему контроллер записи и стирания флеш памяти.

Flash память делится на два блока — Main memory и Information block. Первый блок это собественно сама память в которую записывается прошивка и с которой мы будем сегодня работать. А что касается Information block, то он содержит в себе два раздела: System memory и Option Bytes.

В первом зашит загрузчик который позволяет прошивать контроллер через UART, удалить или как-то модифицировать его нельзя. Раздел Option Bytes — хранит информацию о защите основной памяти, можно включить защиту от чтения и/или записи. Сам же блок основной памяти поделен на страницы: одна страница — 1 килобайт.

Соответственно если у моего STM32F100RBT6B 128 кБайт памяти, то имеем 128 страниц.  Все вышесказанное видно на рисунке ниже:

 

Как известно, у STM32 единое адресное пространство (от 0x00000000 до 0xFFFFFFFF) вообще для всего, тут будут и регистры, и оперативная памяти и флеш память (адрес которой начинается с 0x08000000). Прочитать флеш память программно можно при помощи вызова функции показанной ниже:

uint32_t flash_read(uint32_t address) { return (*(__IO uint32_t*) address);
}

Что же касается записи, то тут все чуть сложнее. Нельзя просто так взять и записать что-то в флеш, нужно сначала разрешить это в специальном регистре FPEC. Запись может производится по любому адресу флеш памяти по 4 байта, причем сначала пишутся два младших байта потом два страших.

Так же имеется один нюанс об который я по началу сломал голову — перед записью память должна быть стёрта! Показателем стёртости считается наличие всех битов установленных в единицу ибо когда что-то записывается в память, то во время записи биты могут быть только сброшены, но не установлены (см пример ниже):

Операция Результат
Стирание памяти. Все биты установлены в 1 11111111 11111111 11111111 11111111
Занулим младший байт 11111111 11111111 11111111 00000000
Занулим старший байт, а младший снова устновим в 1 00000000 11111111 11111111 00000000

Стирается память не побайтно, а целыми страницами и это большое неудобство. Ради модификации одного байта из 50 хранимых, нам придётся читать все 50 байт, вносить изменения, стирать страницу и обратно записывать измененные данные.

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

Как уже было сказано выше, прежде чем что-то писать в память или стирать её — нужно снять блокировку, а после окончания записи/стирания установить её обратно (рекомендуется). Для этого нужно последовательно записать в регистр FLASH_KEYR два числа: 0x45670123 и 0xCDEF89AB.

если записать другие — то блокировку будет невозможно снять до перезагрузки контроллера.  Для того чтоб дать понять контроллеру записи/стирания чего мы от него хотим, используется регистр FLASH_CR:

Все остальные биты кроме тех, что не отмечены зеленым предназначены для настройки прерываний и управлением записью/стиранием области Option bytes и мной не использовались. Назначение выделенных бит следующее:

PG — пока этот бит установлен нам разрешено писать во флеш

PER — Бит стирания страницы. Чтоб определить какую страницу мы будем стирать — используется регистр FLASH_AR.  Достаточно записать в него любой адрес из диапазона принадлежащего нужной странице. 
MER — Бит стирания ВСЕХ страниц. Самоуничтожение прошивки, работает.

STRT — Запуск выбранной операции (стирание страницы, всех страниц или любая выбранная другими битами этого регистра). 

LOCK — Записывая сюда единицу мы блокируем доступ на запись во флеш память.

Последний регистр который нам потребуется это FLASH_SR:

В этом регистре нас интересует всего один бит — BSY. Если он единичка, то с памятью сейчас выполняются какие-то действия (запись или стирание) и начинать новую операцию записи пока нельзя. Что касается остальных битов, то они устанавливаются при ошибки записи и при её завершении. Приступим к практике, и начнем с чего попроще — с разблокировки. Функция предельно проста: 

#define FLASH_KEY1 ((uint32_t)0x45670123)
#define FLASH_KEY2 ((uint32_t)0xCDEF89AB)
void flash_unlock(void) { FLASH->KEYR = FLASH_KEY1; FLASH->KEYR = FLASH_KEY2;
}
Значения FLASH_KEY1 и FLASH_KEY2 взяты из вот этого мануала от ST, рекомендую ознакомится с ним. Думаю что тут комментарии особо не нужны. Код функции которая устанавливает блокировку выглядит так:
void flash_lock() { FLASH->CR |= FLASH_CR_LOCK;
}

Следующие функции предназначены для стирания флеш памяти. Разумеется перед их вызовом нужно сначала разблокировать её при помощи вышеописанной функции:

//Функция возврщает true когда можно стирать или писать память.
uint8_t flash_ready(void) { return !(FLASH->SR & FLASH_SR_BSY);
} //Функция стирает ВСЕ страницы. При её вызове прошивка самоуничтожается void flash_erase_all_pages(void) { FLASH->CR |= FLASH_CR_MER; //Устанавливаем бит стирания ВСЕХ страниц FLASH->CR |= FLASH_CR_STRT; //Начать стирание while(!flash_ready()) // Ожидание готовности.. Хотя оно уже наверное ни к чему здесь… ; FLASH->CR &= FLASH_CR_MER;
} //Функция стирает одну страницу. В качестве адреса можно использовать любой
//принадлежащий диапазону адресов той странице которую нужно очистить.
void flash_erase_page(uint32_t address) { FLASH->CR|= FLASH_CR_PER; //Устанавливаем бит стирания одной страницы FLASH->AR = address; // Задаем её адрес FLASH->CR|= FLASH_CR_STRT; // Запускаем стирание while(!flash_ready()) ; //Ждем пока страница сотрется. FLASH->CR&= ~FLASH_CR_PER; //Сбрасываем бит обратно
}

Ну и наконец функция записи во флеш, записываются 4 байта данных по заданному адресу:

void flash_write(uint32_t address,uint32_t data) { FLASH->CR |= FLASH_CR_PG; //Разрешаем программирование флеша while(!flash_ready()) //Ожидаем готовности флеша к записи ; *(__IO uint16_t*)address = (uint16_t)data; //Пишем младшие 2 бата while(!flash_ready()) ; address+=2; data>>=16; *(__IO uint16_t*)address = (uint16_t)data; //Пишем старшие 2 байта while(!flash_ready()) ; FLASH->CR &= ~(FLASH_CR_PG); //Запрещаем программирование флеша
}

Не лишним будет сказать, что использовать запись надо с осторожностью, я бы порекомендовал писать в последнюю страницу памяти, уж там-то наверняка ничего важного нет. При условии, что у вас не очень большая прошивка, конечно же.

Для того чтоб проверить и наглядно показать как работают эти функции, я написал небольшую демонстрационную программу. Она может прочитать страницу и вывести её содержимое через UART, может записать в страницу тестовые данные или полностью стереть содержимое страницы.

Выбор режима так же осуществляется через UART. Короче интуитивно понятный интерфейс 🙂 Просто подключите USB-UART преобразователь к STM32VL Discovery, а конкретнее к UART1 (PA10 — RxD, PA9 — TxD).

Терминал нужно настроить на скорость 9600, 1 стоп бит, 8 бит данных, без проверки четности. Вот например я пробую прочитать нулевую страницу флеш памяти:

А теперь попробуем прочитать ту же самую страницу, но уже при помощи утилиты ST-Link. Как видно, результат один и тот же: 

Это дает нам основание полагать, что все считывается правильно. Теперь попробуем записать в 127-ю страницу некоторые тестовые данные и потом прочитать их:

Весь мой быдлокод реализующий данный функционал можно скачать тут, а комментарии оставить чуть ниже. Спасибо что дочитали до конца 😉

Источник: http://easystm32.ru/for-beginners/38-flash-stm32

EEROM память данных PIC18XXXX

Страница 1 из 2

В качестве примера,  можно рассмотреть конструкцию «Генератор кодов Морзе»,  где данный программный прием работает для сохранения пользовательских настроек (сохраняются скорость и тональность генератора). За счет применения EEPROM памяти данных отпадает необходимость в настройке параметров генератора, при  включении микроконтроллера.

Объем памяти данных  в семействе микроконтроллеров PIC18XXXX  в основном не велик и составляет 256 байт. На самом деле это не так и мало и вполне достаточно для большинства приложений  .

Опять же,  если взять тот же генератор кодов Морзе, то в нем используется всего три байта памяти.

 В случае необходимости можно подобрать МК  с большим объемом, к примеру PIC18F2525,  где EEPROM память ровняется  1024 байтам.

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

Это:

  • EECON1 — регистр управления.
  • EECON2 — физ. не риализован,используется в операциях  записи в EEPROM .
  • EEDATA  — байт данных для записи/чтения.
  • EEADR    — байт адреса EEPROM.

Чтение из EEPROM памяти данных.

Для чтения байта из EEPROM памяти данных  необходимо записать   адрес выбранной ячейки  в регистр EEADR, сбросить бит EEPGD  ( EECON1,7) и установить в «1» бит RD (EECON1,0) и в следующем машинном цикле значение выбранной ячейки будет дуступно в регистре EEDATA, которое для удобства (не обязательно) копируем в  регистр W.

ПП чтения байта из EEPROM памяти данных.

movlw .4 ; = Выбираем ячейку с адресом 04h movwf EEADR ; (пример, можно другой адрес)= call R_EEPROM ; Вызываем ПП результат в W ;———————————— ; Читаем байт из EEPROM ;———————————— R_EEPROM bcf EECON1,EEPGD ; Работа с EEPROM. bcf EECON1,CFGS ; Обращение к EEPROM памяти программ bsf EECON1,RD ; Инициализация чтения. movf EEDATA,W ; Считывание байта, из выбранной ячейки. return ; Возврат из ПП.

Запись в  EEPROM память данных.     

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

После окончания записи бит WR регистра EECON1 аппаратно сбрасывается в «0», а флаг прерывания EEIF регистра PIR2 (смотреть статью  «Прерывания в семействе PIC18 xxxx») устанавливается в «1».

В случае привлечения  флага для проверки завершения цикла записи, его по окончанию записи необходимо сбросить в «0», т.к. флаг сбрасывается программно.

Для записи  в  EEPROM памяти данных  необходимо сделать следующее:

  • записать   адрес выбранной ячейки  в регистр EEADR.
  • записать данные   в регистр EEDATA .
  •  выбрать работать с  EEPROM памяти данных, сбросом в «0» (EECON1,7).
  • установить бит WREN (EECON1,2) в «1» (разрешить запись).
  • запретить прерывания
  • выполнить обязательную последовательность команд.
  • установить бит WR (EECON1,1) для начала записи
  • разрешить прерывание
  • ожидать завершения цикла записи
  • запретить запись сбросом WREN (EECON1,2)

ПП записи байта в EEPROM память данных.

movlw .4 ; =адрес ячейки в EEPROM movwf EEADR ; (выбран для примера, может быть любой другой)= movlw .7 ; = данные для записи в EEPROM movwf EEDATA ; (выбран для примера)= call W_EEPROM ; результат в EEPROM….. в EEPROM по адресу 04h ;———————————— ;Запись байта данных в EEPROM ;———————————— W_EEPROM    bcf       EECON1,EEPGD ; Работа с EEPROM. bcf EECON1,CFGS ; Обращение к EEPROM памяти программ             bsf        EECON1,WREN ; Разрешение записи.             bcf         INTCON,GIE ; Запрет прерывания                          movlw             0x55 ; =Обязательная             movwf           EECON2 ;  последовательность             movlw             0xAA ;  команд             movwf           EECON2 ;  записи.=             bsf          EECON1,WR ; Инициализация записи.             bsf         INTCON,GIE ; Разрешение прерывания             btfsc        EECON1,WR ; Запись завершена?             goto              $-.2 ; Нет.Ждем.             bcf        EECON1,WREN ; Запрещение записи.             return                 ; Возврат из ПП.

Видеоурок по теме….

Источник: https://chipmk.ru/index.php/razdely/30-radiokanal

Программирование микроконтроллеров: еепром — drive2

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

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

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

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

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

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

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

Вот поучительная история про то, как фирма BLAUPUNKT лоханулась и проигнорировала второй пункт: www.audi.org.ua/materials/2954.html

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

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

a=eea;

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

eea=a;

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

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; // сбрасываем триггер
   }
}

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

Источник: https://www.drive2.ru/b/1299334/

Ссылка на основную публикацию