Как постоянно считывать/записывать переменные на Arduino Due (без EEPROM/shield)?

Я относительно новичок в Arduino и в настоящее время пишу некоторый код для управления релейной платой. Время включения / выключения указывается пользователем во время выполнения и должно сохраняться постоянно (EEPROM или flash) в случае отключения питания.

В моем Uno я работал с библиотекой EEPROMex, и это сработало хорошо. Теперь у меня есть Due, у которого нет EEPROM, и я изо всех сил пытаюсь постоянно сохранять переменные. В частности, я не знаю, как получить доступ к тому, что я ранее записал во флэш-память. В приведенном ниже примере содержимое test[], очевидно, перезаписывается при каждом перезапуске.

PROGMEM int test[] = {1, 2, 3, 123, 23};

void test()
{
  Serial.println((long)test);
  for (int i = 0; i < 5; i++)
  {
    Serial.println(test[i]++);
  }
}

Я заметил, что адрес не меняется при повторных запусках, поэтому я попробовал чтение / запись за пределами индекса 4. Это запредельное чтение / запись сработало, я думаю, поскольку я все равно больше ничего не храню. Интересно, что даже эта память, которая находится вне массива, перезаписывается при включении питания.

Итак: как мне постоянно сохранять входные данные (переменные) в unser на Arduino due без использования каких-либо экранов?

, 👍4

Обсуждение

Вам не нужен целый экран для EEPROM. Всего 4 или 5 проводов и DIP-чип EEPROM., @Gerben


3 ответа


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

2

Я действительно надеюсь, что кто-то знает по-другому, но я совершенно уверен, что ответ заключается в том, что вы не можете напрямую сохранять данные времени выполнения обратно на плату Arduino Due. Я сам изучал это и нашел только ответы, в которых говорилось: "подключите внешний EEPROM" или что-то подобное. Хотя кажется, что должна быть техническая возможность записи в неиспользуемые (или предварительно зарезервированные) области памяти программы, я подозреваю, что для этого процессор должен быть переведен в специальный режим, что, скорее всего, возможно только из загрузчика при прошивке на него новой программы.

Я решил использовать чипы FRAM для хранения данных. Ссылка на мой. Их сложно подключить - единственные, которые я нашел, были в упаковках для поверхностного монтажа (хотя некоторые магазины для хобби продают их смонтированными на маленьких платах с выводами), но они очень дешевые, очень долговечные (на них можно писать много раз, прежде чем они изнашиваются), работают при высокие скорости, и вы можете читать / записывать отдельные байты из / в них. Другие микросхемы хранения часто требуют, чтобы вы записывали целые "страницы" данных за один раз, что может означать чтение существующих данных, их изменение, а затем запись обратно.

Дополнительные комментарии: В вашем первоначальном вопросе вы указываете, что содержимое вашего массива, расположенного в PROGMEM, должно быть восстановлено при перезапуске. Я не думаю, что это так. Это наводит на мысль, что содержимое хранится в другом месте и существует код для его перезаписи, однако может случиться так, что они будут скопированы в рабочую оперативную память, что будет означать, что макрос PROGMEM фактически ничего не делает с Due - что вполне может быть так.

Измените свой код, чтобы изменить одно из значений массива (в пределах массива!), А затем снова выведите его значение после его изменения. Если напечатанное значение изменилось, то это означает, что PROGMEM на самом деле не выполняет то, что он должен делать в Due, что было бы настоящим позором.

,

[Адафрут](https://www.adafruit.com/index.php?main_page=adasearch&q=FRAM%20breakout ) продает FRAM на разделительной плате, с которой намного легче иметь дело, когда все остальное сквозное. Кроме того, FRAM безумно быстры по сравнению с EEPROM., @JRobert

SAM3X8E также имеет резервный домен (несколько резервных регистров, RTC), но его источник питания замкнут на основной шине 3V3 на плате DUE, поэтому простого способа добавить батарею нет., @KIIV


1

Без внешнего устройства вы не сможете хранить данные постоянно. Так что, возможно, это будет не полный щит, но вам придется ЧТО-то добавить. В зависимости от того, сколько данных вам нужно, вы можете использовать компоненты, которые имеют EEPROM в качестве дополнительной функции. Например, как объяснено здесь, модуль DS1337 RTC имеет 56 запасных байт EEPROM ^ H ^ H ^ H ^ H ^ H ^ H энергонезависимой оперативной памяти. Я знаю, это, конечно, немного, НО этого может быть достаточно для ваших нужд, в зависимости от того, сколько вам нужно хранить.

И, конечно же, он предоставляет вам возможности DateTime, которые могут пригодиться.

Помимо этого, на небольшой плате установлены микросхемы EEPROM с DIP-переключателями для установки адреса I2C, который был бы очень дискретным и мог бы хранить большой объем данных. Посмотрите, например, на это.

,

Технически память DS1337 называется не EEPROM, а оперативной памятью с батарейным питанием. Вы можете злоупотреблять разделами аварийных сигналов, чтобы получить дополнительные 7 байт :-). Я использовал этот трюк на DS3231, у которого нет никакой "свободной памяти"., @Gerben

Ты прав. В техническом описании указано "56-байтовая энергонезависимая (NV) оперативная память с батарейным питанием для хранения данных". Ловкий трюк, который вы проделали, злоупотребив разделом сигнализации ;-), @dda


2

Эта библиотека под названием DueFlashStorage была создана Sebnil и находится в инструменте базы данных библиотеки Arduino!

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

Для моего приложения это работает, но для других приложений это может быть не то, что вы хотите!

Нажмите здесь, чтобы перейти на GitHub к нему под названием DueFlashStorage

,