• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

различает ли esp8266 подачу питания и reset

eremey

New member
собственно вопрос в заголовке.
есть ли какой способ различить эти две ситуации запуска ?
 

pvvx

Активный участник сообщества
У ESP8266 нету BOR или он неисправен. В ESP32 с BOR тоже глюки...
 

nikolz

Well-known member
собственно вопрос в заголовке.
есть ли какой способ различить эти две ситуации запуска ?
ESP8266
функция SDK system_get_rst_info
-------------------
enum rst_reason {
REASON_DEFAULT_RST = 0, // обычный запуск при включении питания
REASON_WDT_RESET = 1, // сброс аппаратного сторожевого таймера
// сброс исключения, статус GPIO не изменится
ПРИЧИНА_EXCEPTION_RST = 2,
// сброс программного обеспечения watch dog, статус GPIO не изменится
ПРИЧИНА_SOFT_WDT_RST = 3,
// перезапуск программного обеспечения , system_restart , статус GPIO не
изменится
ПРИЧИНА_SOFT_RESTART = 4,
REASON_DEEP_SLEEP_AWAKE= 5, // пробуждение от глубокого сна
REASON_EXT_SYS_RST = 6, // сброс внешней системы
};

структура rst_info {
uint32 причина; // перечисление rst_reason
uint32 оправдание;
uint32 epc1; // адрес, по которому
произошла ошибка
uint32 epc2;
uint32 epc3;
uint32 excvaddr;
uint32 depc;
};
 

pvvx

Активный участник сообщества
ESP8266
функция SDK system_get_rst_info
Это чтение записанного значения из RTC памяти. Записывается программно перед рестартом, а не при включении или ...
При включении питания там random и никто не знает источника пробуждения - был ли RESET или нет. :p
 

nikolz

Well-known member
Это чтение записанного значения из RTC памяти. Записывается программно перед рестартом, а не при включении или ...
При включении питания там random и никто не знает источника пробуждения - был ли RESET или нет. :p
Использовал этот параметр при выходе из сна и включении и рестарте.
Все соответствовало документации.
 

eremey

New member
Воспользовался getResetReason().
Но давало и по кнопке сброса и по подаче питания один и тот же ответ External system.
Добавил решение, предложенное забугорными энтузиастами-
подвесить 1мкф на CH_PD.
Теперь при подаче питания долгожданный Power On.
Eще раз всем СПАСИБО за участие !
 

nikolz

Well-known member
Воспользовался getResetReason().
Но давало и по кнопке сброса и по подаче питания один и тот же ответ External system.
Добавил решение, предложенное забугорными энтузиастами-
подвесить 1мкф на CH_PD.
Теперь при подаче питания долгожданный Power On.
Eще раз всем СПАСИБО за участие !
еще Вы можете использовать тот факт, что при включении питания память RTC очищается, а в других случаях нет.
Вы можете сами туда записывать информацию
Например я записывал параметры установленной связи с сервером и при выходе из сна использовал их чтобы быстро восстановить соединение.
В итоге вместо 1-4 секунд на соединение уходит 0.1 секунда.
 

eremey

New member
И что даст знание о источнике сброса?
ну зачем-то разработчики разработали такой механизм...
по мне ,так удобно решать вопрос инициализировать или нет определенные параметры.

еще Вы можете использовать тот факт, что при включении питания память RTC очищается
это интересное предложение, но вот
При включении питания там random
 

pvvx

Активный участник сообщества
Я спросил, вам зачем оно.
В основном, чтобы знать - было ли отключение питания для холодной инициализации периферии.
Если был аппаратный RST и он заведен на периферию - аналогично.
А так же для понятия, что счет времени сильно нарушен, была замена АКБ и т.д..
 

pvvx

Активный участник сообщества
При некоторых комбинациях событий перезагрузки нет четкого определения причины. RTC RAM может быть переписана кодом вылета по ошибке, а может и нет. Если провал по питанию мал для сброса памяти RTC, то он не мал для ядра CPU. А ответ, к примеру, будет - мы вышли из DEEP-SLEEP :p Код вылета по ошибке возникает и при частичном провале питания и тут итог - кто быстрее успеет переписать код в RTC памяти :)
Ранее и была дикая ошибка (она и жива до сих пор)- при входе в DEEP-SLEEP отключается Flash в sleep, а проц дает команду в RTC и работает в IRAM. Но RTC имеет тактирование в дцать мкс и проц успевает выполнить команду ret из процедуры в IRAM и летит в отключенную Flash, вызывая ошибку (рандом - какой сложится код на шине) и иногда успевает записать в RTC код сброса по Ошибке, а не DEEP-SLEEP. И при старте SDK куча ветвлений, т.к. программерам не понятно, почему такая нестабильность :) Такие программеры в вашей любимой фирме.

Я спросил, вам зачем оно.
Товарищь, следователь - Полный бардак короче. И если бы он был только в этих функциях, то это можно было бы как-то решить. Но оно всё такое в ESP...
 

pvvx

Активный участник сообщества
И это всё не удивительно, т.к. ESP8089 (это начальное и текущее название чипа ESP8266, прописанное на кристалле, не менявшегося с 2012 года) был разработан как адаптер WiFi по SPI/SDIO и не более. При старте в него грузится код в IRAM и адаптер WiFi работает...
 

pvvx

Активный участник сообщества
youtu.be
ESP8266 маркировка только на корпусе, а кристалл от ESP8089 2012 года.
1684876552469.png
И называние сайта должно быть ESP8089 :)
 

pvvx

Активный участник сообщества
CodeNameHawk - пропустили празднование десятилетия ESP в конце 2021 года. В первом месяце 2012 уже была выпущена документация на ESP8089...
На сайте уже пользователи, до даты рождения которых ESP8266 уже был. :)
 

nikolz

Well-known member
ну зачем-то разработчики разработали такой механизм...
по мне ,так удобно решать вопрос инициализировать или нет определенные параметры.


это интересное предложение, но вот
чтобы был ноль надо делать задержку CHIP_EN относительно подачи питания.
В старой документации был алгоритм данного процесса но найти не смог.
CHIP_EN -действует как сигнал RST.При включении если CHIP_EN=0, то он блокирует работу памяти на время переходных процессов
т е действует как сигнал сброса. Когда питание установилось и CHIP_EN=1 то память активна и в ней нули.
Я вообще использовал этот пин для включения и отключения ESP не отключая питания, так как включение источника питания требует порядка 60 ms на установление сигналов, а включение CHIP_EN требует примерно 0.2 ms.
Но это все было так давно.
------------------
Все что нашел:
1.4.2. Последовательность включения питания и сброс мощности
1.4.2.1. Последовательность включения питания
ESP8266EX использует системный источник питания напряжением 3,3 В. Микросхема должна быть активирована после
стабилизации напряжения на шинах питания. Это достигается за счет задержки активации CH_EN (Вывод 7) по
времени T после того, как будут подведены шины 3,3 В. Рекомендуемое время задержки (T) задается
параметром RC-схемы. Для ознакомления с конструкцией, пожалуйста, обратитесь к рисунку Схемы периферийного устройства ESPWROOM-02 в техническом описании ESP-WROOM-02.
1.4.2.2. Сброс настроек
Pin32 EXT_RSTB служит в качестве pin-кода сброса ESP8266EX. Этот вывод содержит внутренний подтягивающий резистор и активен на низком уровне. Чтобы избежать сбросов, вызванных внешними помехами, мы
рекомендуем вам сохранить трассировку печатной платы EXT_RSTB как можно короче и добавить
RC-цепь на выводе EXT_RSTB.
Pin7 CHIP_EN служит в качестве разрешающего pin-кода ESP8266EX. В этом случае ESP8266EX
выключается, когда этот вывод удерживается на низком уровне. Pin7 CHIP_EN также служит в качестве pin-кода сброса ESP8266EX. В
этом случае ESP8266EX перезагружается, когда входной уровень этого вывода становится ниже 0,6 В и длится
не менее 200 мкс.
Мы рекомендуем вам использовать CHIP_EN вместо EXT_RSTB для сброса чипа.
1.4.3. Вспышка
Демонстрационная вспышка, используемая на ESP8266EX, представляет собой SPI-вспышку с 2 МБ ПЗУ в SOP8 (208 мил)
пакет. Вывод 21 SD_CLK подключен к выводу flash CLK вместе с резистором 0402 при
последовательном подключении, что уменьшает ток привода и устраняет внешние прерывания.
Начальное сопротивление резистора составляет 200 Ом.
 
Сверху Снизу