Очистка 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()
{
}

Я не вижу в этом проблемы, но это неэффективно. Я что-то упустил?

, 👍1

Обсуждение

из памяти, вам нужно 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


2 ответа


Лучший ответ:

2

Учебное пособие здесь очень ясно описывает, как очистить содержимое EEPROM Atmel. Я вижу только 2 основных отличия. Учебник определяет размер EEPROM с помощью вызова функции. Наверное, намного безопаснее. И нет никакого вызова функции delay().

Обучение включает в себя включение светодиода по окончании. И @Edgar Bonet прав в том, что стирание EEPROM (изменение каждого плавающего затвора в чипе) требует времени. И у вас нет возможности узнать, когда в вашем коде будет завершена очистка EEPROM.

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

,

0

Спасибо всем за помощь. Вот что я в итоге использовал (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 байт или около того, этого было достаточно для моих нужд.

,