Arduino esp8266 очистить

kentaylor/EraseEsp8266Flash

Use Git or checkout with SVN using the web URL.

Work fast with our official CLI. Learn more.

Launching GitHub Desktop

If nothing happens, download GitHub Desktop and try again.

Launching GitHub Desktop

If nothing happens, download GitHub Desktop and try again.

Launching Xcode

If nothing happens, download Xcode and try again.

Launching Visual Studio Code

Your codespace will open once ready.

There was a problem preparing your codespace, please try again.

Latest commit

Git stats

Files

Failed to load latest commit information.

README.md

It is possible to write data into flash that will cause an ESP8266 to fail to connect to WiFi even after new code is uploaded using the Arduino SDK, LUA or over the air programming which could be considered as bricking the device. This simple sketch is for recovering the bricked ESP8266 device by erasing all of the flash memory and thus removing the corrupted data.

Subsequent program uploads will then work fine using the Arduino IDE and over the air programming after the first Arduino upload.

How To Use This Sketch

This sketch is unusual in that after it runs once the ESP8266 will do nothing until it has been flashed again with another sketch. This is because this sketch completely erases the flash, including erasing itself. It runs from RAM so is able to continue after being erased until it completes. It is best run with the Arduino serial monitor open to observe the progress of the erasure including any failed erasure, which may occur with damaged flash. It is possible to wear out flash if it has been written too many times. Usually this occurs when flash writes are repeated in a tight program loop.

The sketch will run immediately after upload, completely erase the flash then crash, leaving the device unbootable. When the Arduino IDE uploads a new sketch it will also upload all of the necesary supporting firmware for the ESP8366 to function normally.

Why Is This Sketch Useful?

There are some parts of flash where data resides that is preserved when a new program is uploaded. In particular WiFi configuration data is retained. If this data becomes corrupted it will not be overwritten and remain faulty.

What Causes Flash Corruption?

You can write anywhere you wish into flash so any user program could potentially corrupt the flash but it is unlikely. A [ bug in the ESP core library ] (esp8266/Arduino#1997) has been the sole cause for me.

While I’ve had frequent flash corruptions the effects are random. Calling WiFi.begin(SSID, Password) with a different SSID or password to those already in non volatile memory or calling WiFi.begin() should not be done while it is trying to connect to a network and calling at other times may cause corruption also. It will usually be OK but sometimes will corrupt memory, depending, I suspect, on what stage it is up to in the connection process. Once it has failed, rebooting will usually be enough to connect again to WiFi. Rewriting the WiFi credentials can usually stop problems with future WiFi connections.

Will My ESP8266 Device Suffer Bricking?

Probably not, as the [bug causing the problem ] (esp8266/Arduino#1997 been fixed.

As well this bug only occasionally caused WiFi connectivity to permanently fail which probably explains why it existed so long before it was correctly identified. Once identified it was quickly fixed. Some of us have found this bug extremely frustrating due to the difficulty in trying to deal with failure modes that were not repeatable.

Some Of The Frustration

Looking through the issues reported and code revisions in WiFi manager I can see discussion of the same problems I was having and efforts to fix them. Specifically:-

  • There has been an attempt to fix a problem identified as an [«auto connect racing issue»] ( https://github.com/tzapu/WiFiManager/commit/b99487785d2c8319df1223b204e1bba2b321f3f3) by not calling WiFi.begin under some circumstances. This fix has a side effect identified in issue 141 that «WiFiManager will not connect to a newly selected access point if a connection to another access point already exists.»
  • Issue [149] (tzapu/WiFiManager#149) Problem is a side effect of trying to manage WiFi connectivity in code.
  • Issue 147 I think this issue is occuring because WiFi.begin was called when it wasn’t required. There is a probability it will fail every time it is called but when deep sleep is used with frequent wakeups the cumulative probability of failure becomes high. Tzapu said he had seen the same problem once.
  • Issue 143 Looks like it may be same issue as issue 149 but its not clear from the information provided.
  • Issue 102 Arises when WiFi.begin called when already connected.
  • Issue71 Assumes that WiFi.begin is required when it isn’t.

About

A short Arduino sketch to erase all of the flash memory in an ESP8266 device. This is useful for fixing corrupted memory.

Источник

ESP8266. Начало работы, особенности

В этом уроке поговорим о микроконтроллере ESP8266 и платах на его основе. Как с ними работать и чем они отличаются от Arduino на базе МК AVR. ESP8266 – китайский микроконтроллер за 2 доллара с большим объемом памяти и WiFi связью на борту. Официальная документация:

Купить на Aliexpress

Дёшево купить Wemos Mini можно тут: ссылка, ссылка, ссылка. Рекомендуется брать версию как слева на картинке выше, на базе полного чипа ESP-12.

Уроки по работе с esp8266

Конкретные уроки по работе с платой и WiFi библиотеками публикуются на сайте набора GyverKIT, так как уроки на этом сайте являются общими по программированию Arduino, без углубления в сторонние библиотеки.

Характеристики

  • Напряжение питания: 3.3V (2.5-3.6V)
  • Ток потребления: 300 мА при запуске и передаче данных, 35 мА во время работы, 80 мА в режиме точки доступа
  • Максимальный ток пина – 12 мА.
  • Flash память (память программы): 1 МБ
  • Flash память (файловое хранилище): 1-16 МБ в зависимости от модификации
  • EEPROM память: до 4 кБ
  • SRAM память: 82 кБ
  • Частота ядра: 80/160 МГц
  • GPIO: 11 пинов
  • ШИМ: 10 пинов
  • Прерывания: 10 пинов
  • АЦП: 1 пин
  • I2C: 1 штука (программный, пины можно назначить любые)
  • I2S: 1 штука
  • SPI: 1 штука
  • UART: 1.5 штуки
  • WiFi связь

Начало работы

Для работы с платами на основе esp8266 нужно установить ядро и драйвер.

  • Идём в Файл/Настройки/Дополнительные ссылки для менеджера плат. Вставляем ссылку https://arduino.esp8266.com/stable/package_esp8266com_index.json.
  • Инструменты/Плата/Менеджер плат…, ищем в поиске esp8266 и устанавливаем. В списке плат появится семейство плат на базе esp8266.
  • На большинстве плат стоит USB конвертер CH340, как на всех китайских Ардуинах. Если вы ещё не устанавливали драйвер – читать здесь.

Настройки платы

Для работы с любой платой (даже самодельной) можно выбрать пункт Generic esp8266, будет доступен полный набор настроек. Для работы с Wemos Mini выбираем LOLIN Wemos D1 R2 mini. Настроек станет меньше, а к пинам платы можно будет обращаться в программе по их подписям на плате (Dn). Основные настройки:

  • Upload speed: скорость загрузки прошивки. Можно смело поднимать до 921600.
  • CPU Frequency: частота тактирования процессора. Для большинства задач хватит стандартных 80 МГц. На 160 МГц будет работать шустрее, но могут быть сбои.
  • Flash Size: распределение памяти, настройка имеет вид xMB (FS:xMB OTA:

xKB). Размер памяти под программу не меняется – это всегда 1 МБ.

  • Первое число: полный объём микросхемы памяти (в основном 4MB, на Wemos и NodeMCU стоят такие).
  • Второе число: объём под файловое хранилище.
  • Третье число: объём под OTA (обновление по воздуху) – всегда меньше 1 МБ.
  • Что выбрать? У Wemos самый ходовой – первый вариант: 4MB (FS:2MB OTA:

1019KB).

  • Flash mode: режим загрузки во Flash память.
    • DOUT: медленный, но совместим со всеми модификациями esp8266.
    • QIO: более быстрый, но будет работать не на всех чипах.
  • Erase Flash: режим очистки памяти.
    • Only Sketch: стереть только программу.
    • Sketch + WiFi Settings: стереть программу и настройки WiFi (логин-пароль последнего подключения и т.д.).
    • All Flash Contents: полностью очистить память.
  • Порт: к какому порту подключена плата.
  • Нумерация пинов

    У самого чипа esp8266 все выводы пронумерованы цифрами. На распиновке они подписаны как GPIOn, где n – номер. На плате (NodeMCU, Wemos Mini) пины подписаны как Dn и эти номера не совпадают с номерами GPIO! При работе например с Wemos можно использовать как нумерацию выводов GPIO ( digitalWrite(5, LOW) ), так и D-нумерацию пинов на плате ( digitalWrite(D1, LOW) ) – если выбрана плата Wemos. Новички очень часто в этом путаются, будьте внимательны. Также GPIO1 и GPIO3 подписаны на плате как TX и RX, по этим названиям к ним тоже можно обращаться ( digitalWrite(TX, LOW) ).

    Особенности пинов

    У esp8266 много системных пинов, с которыми нужно быть очень внимательным.

    • К целому ряду пинов подключена внешняя Flash память, в общем случае их использовать нельзя (если очень нужно – ищите информацию). На плате NodeMCU визуально гораздо больше пинов, чем на Wemos Mini, но по факту “безопасных” для использования пинов там ровно столько же.
    • С оставшимися пинами тоже не всё гладко: некоторые из них требуют наличия определенного логического уровня на момент включения микроконтроллера (подача питания, перезагрузка), иначе esp не запустится. Вот распиновка с этими пинами и нужным уровнем сигнала при запуске:
    • На плате (NodeMCU, Wemos и других) эти пины уже подтянуты резисторами к нужному напряжению, поэтому нужно несколько раз подумать, что вы к ним подключаете и как оно повлияет на напряжение на пине. Например, можно подключить энкодер, он прижмёт системный пин к GND и esp не запустится.
    • На GPIO16/D0 нельзя подключать прерывания ( attachInterrupt() ) и включать ШИМ сигнал ( analogWrite() ).
    • Максимальный ток с GPIO – 12 мА.
    • Светодиод LED_BUILTIN находится на пине GPIO2 и его поведение инвертировано: при подаче LOW он включается и наоборот.
    • При старте контроллера почти все пины делают скачок до высокого уровня, подробнее – в этой статье. Единственными “спокойными” пинами являются D1 (GPIO5) и D2 (GPIO4). Если контроллер управляет напрямую какими-то железками (реле, транзистор, или является “кнопкой” для другого устройства), то лучше использовать именно эти пины!
      • На этих же пинах сидит I2C, но шину можно переназначить на любые другие пины через Wire.begin(sda, scl) .

    Особенности работы WiFi

    WiFi реализован синхронно, его обработчик должен постоянно вызываться во время работы программы не реже, чем каждые 20 мс (если WiFi используется в программе). Обработка WiFi происходит в следующих местах:

    • Автоматически в конце каждой итерации loop()
    • Внутри любого delay()
    • Внутри функции yield()

    Если у вас есть участки программы, которые долго выполняются, то нужно разместить вызовы yield() до и после тяжёлых блоков кода. Также в чужих скетчах можно встретить delay(0) , по сути это и есть yield() .

    По тем же причинам не рекомендуется использовать задержку delayMicroseconds() более чем на 20’000 мкс.

    Отличия от AVR Arduino

    min() и max()

    В ядре esp8266 функции min() и max() реализованы как функции, а не как макросы, поэтому должны использоваться с данными одного типа. Использование переменных разного типа приведёт к ошибке компиляции.

    В функции map(val, min, max, to min, to max) нет защиты от деления на 0, поэтому если min равен max – микроконтроллер зависнет и перезагрузится. Если min и max задаются какими-то внешними условиями – проверяйте их равенство вручную и исключайте вызов map() с такими аргументами.

    Типы данных

    • Тип int является синонимом long ( int32_t ) и занимает 4 байта. В AVR int это int16_t , то есть 2 байта.
    • Тип double имеет полную двойную точность – 8 байт. В AVR это 4 байта.
    • Указатель занимает 4 байта, так как область памяти тут 32-битная. В AVR – 2 байта.

    Функция analogRead()

    ESP8266 имеет крайне убогий одноканальный АЦП.

    • Сам АЦП в esp8266 может измерять напряжение в диапазоне 0.. 1.0V. На платах (NodeMCU, Wemos Mini) стоит делитель напряжения, который расширяет диапазон до более удобных 3.3V.
    • Частый вызов analogRead() замедляет работу WiFi. При вызовах чаще нескольких миллисекунд WiFi полностью перестаёт работать.
    • Результат analogRead() имеет кеширование до 5 мс, то есть полученные данные могут запаздывать на это время.
    • АЦП может использоваться для измерения напряжения питания МК: для этого нужно вызвать ADC_MODE(ADC_VCC); до void setup() , а само напряжение питания можно получить из ESP.getVcc() .

    Функция analogWrite()

    • Работает на всех пинах, кроме GPIO16.
    • Разрядность ШИМ по умолчанию 8 бит (0.. 255) на версиях ядра 3.x. На ранних версиях – 10 бит (0.. 1023). Скажем спасибо индусам за совместимость.
      • Разрядность можно настроить в analogWriteResolution(4. 16 бит) .
    • Частота ШИМ по умолчанию 1 кГц.
      • Частоту можно настроить в analogWriteFreq(100.. 40000 Гц) .
    • ШИМ реализован программно, поэтому на повышенной частоте и разрядности будет тормозить выполнение программы!

    Аппаратные прерывания

    • Настраиваются точно так же, через attachInterrupt() .
    • Работают на всех пинах, кроме GPIO16.
    • Функция-обработчик должна быть объявлена с атрибутом IRAM_ATTR :

    Либо с ICACHE_RAM_ATTR (на старых версиях ядра), вот так:

  • В обработчике нельзя использовать динамическое выделение и перераспределение памяти (new, malloc, realloc), соответственно менять String-строки тоже нельзя.
  • В прерывании нельзя использовать задержки.
  • Функция yield()

    В реализации esp8266 функция yield() выполняет другую задачу и использовать её как на AVR не получится. Скажем спасибо индусам за совместимость

    EEPROM

    EEPROM в esp8266 является эмуляцией из Flash памяти, поэтому мы можем выбрать нужный размер.

    • Перед началом работы нужно вызвать EEPROM.begin(4.. 4096) с указанием размера области памяти в байтах.
    • Для применения изменений в памяти нужно вызвать EEPROM.commit() .

    В остальном работа с библиотекой EEPROM.h ничем не отличается.

    Источник

    Adblock
    detector