Плата от прошлого проекта жила своей жизнью на полке: каждые двадцать секунд щёлкала реле и раз в минуту что-то печатала в порт — а мне нужно было отдать её ученику под новый курс. Вопрос «как стереть с платы всё» звучит естественнее всего в первые месяцы, и он же честно разоблачает устройство Arduino: кнопки «стереть» в среде нет и не надо. Перезапись — вот стирание: следующий Upload затирает flash целиком, и пустой скетч делает плату по-настоящему чистой за секунды записи.
Здесь разберу, что именно происходит при заливке с точки зрения старой прошивки, почему загрузчик и EEPROM переживают любую очистку, что делает пустой скетч на ESP32 и как за минуту убедиться, что плата действительно молчит. Механику самой заливки — кнопки, порт, автосброс — здесь не пересказываю: её разобрал урок про загрузку скетча, а чек-лист перед загрузкой соберёт ритуал в один список.
Как это устроено
Пустой скетч — это две пустые функции: setup() и loop() без единого оператора. «Проверить» собирает его за секунды, «Загрузить» записывает во flash. Запись идёт постранично, и в конец чипа ваш скетч не лезет: там живёт загрузчик — та самая полкилобайта у Uno из 32, которая встречает прошивку по UART. Стереть его случайной заливкой нельзя, восстановить при беде — можно через программатор, об этом писал урок про перезапись загрузчика.
Что выживает при очистке — второй вопрос, и ответ сюрпризом не бывает, если помнить карту памяти. Flash переписывается целиком новой прошивкой: старый скетч исчезает без остатка. EEPROM — отдельная память на 1024 байта у Uno — при обычной загрузке не трогается: пароли, калибровки и счётчики переживают пустой скетч, карта этой памяти разобрана в уроке про EEPROM. ОЗУ очищается сама при каждом старте — там жить долго нечему в принципе.
Проверка занимает десять секунд. После пустого скетча светодиод L молчит, в мониторе тишина, реле не щёлкает — плата делает ровно то, что написано в пустых setup и loop, то есть ничего. Хитрость, к которой я пришёл после пары спорных плат: заливать не совсем пустой скетч, а пустой с одной строкой — печатать «plata chista» раз в десять секунд. Тогда в мониторе видно разницу между «скетч пустой и плате нечего сказать» и «кабель не тот и монитору нечего показать».
// "Chistaya plata s majachkom zhizni": nichego ne delaet,// no odna stroka raz v 10 sekund razlichaet "chisto"// ot "kabel ne tot". Zalivka etogo sketcha stiraet staryj.unsigned long t = 0; void setup() { Serial.begin(9600); Serial.println("plata chista: setup i loop pusty");} void loop() { if (millis() - t > 10000) { t = millis(); Serial.println("zhiva, nichego ne delaet"); }} // Esli nuzhna ABSOLYUTNO tihaya plata - uberte oba pechati:// void setup() {} void loop() {}ESP32 — та же логика с одним отличием: у неё есть полная очистка мимо заливки. Команда esptool --chip esp32 --port COM5 erase_flash стирает flash целиком — вместе со скетчем, настройками сети и калибровками; плата после неё молчит по-настоящему, и при первом старте ROM-загрузчик всё равно выплюнет в порт служебный свист на 115200 — это норма, а не мусор. Стоит полная очистка не дороже заливки, но после неё плату надо прошивать заново: пустая ESP32 — это просто чип в ожидании.
Мнение на прощание: очистка — рутинная гигиена, а не крайняя мера. Плата перед передачей ученику, перед выездом на объект, перед чистым экспериментом «а что если дело не в коде» — везде я заливаю пустой скетч первым делом: две минуты, и старая прошивка исключена из подозреваемых. Чего очищение не делает — не чинит железо и не сбрасывает EEPROM: если реле щёлкало из-за проводки, пустой скетч лишь покажет это честнее. В симуляторе — плата со старой прошивкой и кнопка «залить пустой».
| Состояние платы | Что видно | Что делать |
|---|---|---|
| делает старое: мигает, щёлкает, печатает | старый скетч жив | залить пустой скетч с маячком |
| LED молчит, монитор тише | flash переписана, плата чиста | работать или отдавать |
| ESP32 после erase_flash свистит в порт | ROM-лог на 115200 — норма | прошивать заново |
| не шьётся и молчит совсем | подозрение на загрузчик | программатор и Burn Bootloader |
- 1. Почему в Arduino IDE нет кнопки «стереть плату»?
- 2. Что переживает заливку пустого скетча на Uno?
- 3. Зачем пустому скетчу одна строка печати раз в 10 секунд?
- 4. Чем esptool erase_flash отличается от заливки пустого скетча на ESP32?
- Кнопки «стереть» нет, потому что заливка и есть стирание: новый образ переписывает flash целиком.
- Загрузчик в конце flash и EEPROM на 1024 байта переживают любую обычную заливку.
- Пустой скетч с маячком раз в 10 секунд отличает чистую плату от проблемного кабеля.
- ESP32 умеет полный erase_flash: после него плата ждёт прошивку, ROM-свист в порту — норма.
- Полное стирание через программатор убивает и загрузчик: сначала Burn Bootloader, потом заливки.
Частые вопросы по теме урока
- Почему в Arduino IDE нет кнопки «стереть плату»?
- Каждый Upload пишет новый образ во flash постранично, и старый скетч исчезает без остатка. Пустой скетч — и есть команда «сделать чисто». потому что заливка перезаписывает flash целиком: новая прошивка и есть стирание
- Что переживает заливку пустого скетча на Uno?
- Загрузчик живёт в конце flash и не попадает под запись, EEPROM — отдельная память на 1024 байта, при обычной заливке её не трогают. загрузчик в конце flash и данные в EEPROM
- Зачем пустому скетчу одна строка печати раз в 10 секунд?
- Маячок жизни даёт монитору ответ: одна строка — плата чиста и жива; тишина при заливке и тишине — уже вопрос к кабелю и порту. чтобы отличить «плата чиста» от «кабель или порт ни при чём»
- Чем esptool erase_flash отличается от заливки пустого скетча на ESP32?
- Полная очистка мимо заливки: скетч, сеть, калибровки — всё уходит. После неё в порту виден ROM-свист на 115200 — норма первого старта. стирает flash целиком, включая настройки и калибровки: плату надо прошивать заново