Очищается ли SRAM при переводе Arduino в режим sleep_mode_pwr_down?

Вопрос

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

Для ясности я использую sleep_mode_pwr_down и запускаю прерывание с помощью сторожевого таймера на чипе ATMega328. См. этот пост для описания различных режимов сна: Каковы (или как использовать) опции энергосбережения Arduino для продления срока службы батареи?

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


Характеристики/Контекст:

Arduino Uno (чип ATMega328)

, 👍1

Обсуждение

Если нет, вы можете использовать внешний чип SRAM - который в любом случае обеспечит больше оперативной памяти, чем ATmega328. Вы можете найти их с помощью быстрого поиска в Google: например, SRAM 1Mbit. Ток в режиме ожидания значительно ниже 10 мкА., @MichaelT

Спасибо @MichaelT, судя по некоторым прототипам, которые я только что сделал, SRAM действительно не стирается (на основе динамической памяти в системе). Я планирую проверить это дальше, так как это кажется несколько неожиданным, но обновлю этот пост, если появятся какие-либо важные новости., @Triz


1 ответ


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

4

Обычно спящие режимы Atmega не стирают ОЗУ. Их память статична и пока подается напряжение (выше 2,7 В), данные сохраняются.

Однако это также зависит от того, как вы планируете выводить устройство из спящего режима. Если получен RESET, ОЗУ очищается и выполнение программы начинается с начала.

Если включенное прерывание происходит, когда MCU находится в спящем режиме, MCU просыпается. Затем MCU останавливается на четыре цикла в дополнение к времени запуска, выполняет процедуру прерывания и возобновляет выполнение с инструкции, следующей за SLEEP. Содержимое файла регистров и SRAM не изменяется, когда устройство просыпается из спящего режима.

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

,

Обратите внимание, что при сбросе RAM стирается программным обеспечением (кодом запуска libc), а не аппаратным обеспечением. Вы можете поместить данные в раздел «.noinit», если хотите сохранить их при сбросе., @Edgar Bonet