Как работает стирание EEPROM?
Техническое описание ATmega328P содержит эту таблицу, которая описывает биты 4 и 5 EECR:
EEPM1 | EEPM0 | Время программирования | Операция |
---|---|---|---|
0 | 0 | 3,4 мс | Стереть и записать за одну операцию (атомарная операция) |
0 | 1 | 1,8 мс | Только стереть |
1 | 0 | 1,8 мс | Только запись |
В настоящее время я работаю над неблокирующим кодом для обработки EEPROM, и мне интересно, когда и как мне стереть EEPROM.
- Что делает стирание? Устанавливает ли он один байт в 0x0 или всю EEPROM?
- Должен ли я сначала стирать его всякий раз, когда я хочу записать байт?
- Если нет, то почему есть возможность стирать и писать отдельно?
- Как начать удаление?
Либо в техническом описании EEPROM недостаточно информации, либо я просто не нашел то, что искал. Я попытался использовать поисковую систему, но все результаты относятся либо к библиотеке Arduino EEPROM, либо к файлу <avr/eeprom.h>, оба из которых используют опрос вместо прерываний (и поэтому блокируют).
@glibg10b, 👍0
Обсуждение2 ответа
Лучший ответ:
Ответы на ваши вопросы приведены в техническом описании AVR ATMega328. .
Процедура стирания и записи внутренней EEPROM описана в главе 7.6 (Описание регистра).
- Операция стирания стирает 1 байт (при стирании ячейки EEPROM для нее устанавливаются все единицы, т. е. 0xff).
- На адрес EEPROM, который нужно стереть/запрограммировать, указывают регистры EEARL и EEARH. Значение, которое должно быть запрограммировано в этом адресе, устанавливается EEDR. Чтение значения из EEPROM возвращает значение в том же регистре EEDR.
- Перед записью нового значения в EEPROM старое значение должно быть стерто. Вы можете сделать это как два отдельных действия или как одно действие. Вы также можете оставить ячейку депрограммированной (стертой), просто удалив ее и не программируя снова.
- Вы инициируете стирание адреса EEPROM, на который указывает EEARH/EEARL, установив EEPM1 на 1, EEPM0 на 0 и установив EEPE на 1, чтобы начать операцию стирания. Установка EEPM1 и EEPM0 на 0 приведет к стиранию и программированию нового байта за одну операцию.
Что касается записи в EEPROM без блокировки, вы можете установить (неблокирующий) таймер на продолжительность операции записи, стирания или стирания/записи. По даташиту эти операции занимают соответственно 1,8, 1,8 и 3,4 мс. Просто убедитесь, что ваш код не обращается к EEPROM во время выполнения этих операций.
Вы также можете (не блокируя) периодически опрашивать бит EEPE до тех пор, пока он не будет очищен, сигнализируя о завершении операции.
Наиболее элегантным способом, по моему мнению, является использование флага EERIE, установив для него значение 1, что позволит ATmega генерировать прерывание по завершении операции EEPROM.
Если новое значение устанавливает биты в 0, которые равны 1 в старом значении, стирание не требуется. Например, вы можете записать 0x55 в ячейку, содержащую 0xD7, без необходимости стирать ячейку перед этим., @the busybee
@thebusybee, правда, обычно вы можете изменить незапрограммированный («1») бит EEPROM на запрограммированный («0») бит, не стирая ячейку. Изменение битов с 0 на 1 снова требует стирания ячейки. Это не уникально для ATmega328, но работает для многих/большинства EEPROM., @StarCat
Я переключился на FRAM, 32K x 8 можно получить всего за несколько $$$, как правило, за вычетом импортных плат Arduino. Это так быстро, как Arduino может получить к нему доступ, как для чтения, так и для записи. Вы можете использовать I2C или SPI в зависимости от того, какое устройство вы покупаете. Для него есть несколько очень хороших библиотек, упрощающих его использование. Он энергонезависим, т.е. не теряет информацию при отключении питания. Он будет поддерживать в диапазоне триллионов циклов памяти без задержки при записи или чтении, поэтому без блокировки. Всего несколько дополнительных циклов процессора из-за накладных расходов SPI или I2C. Если у вас уже есть код для внешней EEPROM, он должен работать как есть, но в нем будет ненужная задержка.
Хотя ваш ответ интересен, это немного похоже на то, что вы отвечаете человеку, у которого проблемы с его Ford, говоря ему, что Cadillac работает лучше., @Nick Gammon
- Заменить предохранители Arduino Uno (может ли Arduino Uno заменить свои собственные предохранители?)
- Arduino EEPROM сохраняет старые данные после прошивки новой программой
- Запустить код один раз после программирования
- Использование Arduino Nano для программирования (как ISP) автономного 328p
- Можно ли загружать и запускать код из EEPROM во время загрузки?
- о том, как разделить один внешний последовательный EEprom с помощью двух микроконтроллеров?
- Как преобразовать мою настройку Arduino в настройку PIC?
- Таймер 1 «Установить на сравнение совпадений» в обычном режиме — не работает
* «в таблице данных довольно мало информации» * Хм, может быть, ссылка на таблицу данных, которую вы используете, потому что я помню, что на эти вещи * даны * ответы в ней, если только вы, возможно, не получили «резюме», а не "полный" техпаспорт. Также есть примечания об использовании AVR EEPROM., @timemage
«Я пытался использовать поисковую систему, но все результаты либо касаются EEPROM Arduino»... не ищите «arduino eeprom»... не ищите ни одно из этих слов., @jsotola