Очистка EEPROM
Я пытаюсь очистить EEPROM и использую этот код:
#include <EEPROM.h>
void setup()
{
// записываем 0 во все 4096 байт EEPROM
for (int i = 0; i < 4096; i++)
EEPROM.write(i, 0);
delay(9999999);
}
void loop()
{
}
Я не вижу в этом проблемы, но это неэффективно. Я что-то упустил?
@acpilot, 👍1
Обсуждение2 ответа
Лучший ответ:
Учебное пособие здесь очень ясно описывает, как очистить содержимое EEPROM Atmel. Я вижу только 2 основных отличия. Учебник определяет размер EEPROM с помощью вызова функции. Наверное, намного безопаснее. И нет никакого вызова функции delay().
Обучение включает в себя включение светодиода по окончании. И @Edgar Bonet прав в том, что стирание EEPROM (изменение каждого плавающего затвора в чипе) требует времени. И у вас нет возможности узнать, когда в вашем коде будет завершена очистка EEPROM.
Возможно, вы принудительно останавливаете свой код до его завершения. В этом случае может показаться, что EEPROM не полностью очищен.
Спасибо всем за помощь. Вот что я в итоге использовал (ESP8266 1.0 12E с Arduino IDE):
#include <EEPROM.h>
#include <ESP8266WiFi.h>
void setup()
{
Serial.begin(115200);
EEPROM.begin(512);
delay(5000);
Serial.println("clearing EEPROM...");
// записываем 0 в первые 1000 байт EEPROM
for (int i = 0; i < 1000; ++i) {
EEPROM.write(i, -1);
}
EEPROM.commit();
delay(5000);
Serial.println("Reading EEPROM ssid");
String esid;
for (int i = 0; i < 64; ++i)
{
esid += char(EEPROM.read(i));
}
Serial.print("SSID: ");
Serial.println(esid);
Serial.println("Reading EEPROM pass");
String epass = "";
for (int i = 64; i < 128; ++i)
{
epass += char(EEPROM.read(i));
}
Serial.print("PASS: ");
Serial.println(epass);
}
void loop()
{
}
Возможно, он получился длиннее, чем должен быть, но я взял материал из других набросков, над которыми работал, и предпочитаю функциональность форме. Это записывает «-1» в первые 1000 байтов, а затем печатает первые 128 байтов. Поскольку меня интересуют только первые 50 байт или около того, этого было достаточно для моих нужд.
- Использование EEPROM для записи значения счетчика
- Чтение и запись в EEPROM
- Почему мой массив char пуст
- Что не так с тем, как я записываю и/или считываю адреса EEPROM?
- Как изменить переменную/скетч с помощью графического интерфейса
- Что не так с моим EEPROM?
- Страница EEPROM вращается при записи на нее
- C++ против языка Arduino?
из памяти, вам нужно
EEPROM.commit();
или, возможно,EEPROM.end();
после записи, @Jaromanda XАааааа! Конечно! Спасибо. Такие глупости сводят меня с ума., @acpilot
Хотя это МОЖЕТ быть только на ESP8266, судя по примерам скетчей., @Jaromanda X
Что вы имеете в виду под "неэффективным"? EEPROM не очищается? Или только некоторые есть? Если да, то откуда вы знаете? Какой Ардуино у тебя?, @Nick Gammon
Неэффективно, чтобы eeprom не был стерт. Ничего не изменилось после того, как я запустил этот скетч. Я сохранил «TEST01» в eeprom, и он все еще был там после того, как я попытался его стереть., @acpilot
Обратите внимание, что пустая EEPROM состоит из единиц, а не из нулей. Вместо этого напишите
-1
., @Ignacio Vazquez-AbramsЯ придираюсь, но... когда вы
EEPROM.write()
, вы на самом деле стираете ячейку EEPROM, **затем** записываете в нее новое значение. Это занимает 3,4 мс, независимо от записанного значения. Вы можете выполнить операцию только стирания, которая занимает всего 1,8 мс. Однако похоже, что это невозможно сделать с библиотекой Arduino EEPROM, и даже не с <avr/eeprom.h> из avr-libc. Вам нужно будет получить прямой доступ к адресу EEPROM и управляющим регистрам, как указано в таблице данных MCU., @Edgar BonetСпасибо за этот скетч, он отлично работает для меня. Я добавил две строки, чтобы включить светодиод после завершения скетча., @Rob