AVRDUDE: как прошить AVR из командной строки
AVRDUDE записывает и читает память микроконтроллеров AVR: флеш, EEPROM, фьюзы и биты защиты. Её вызывает Arduino IDE, когда загружает скетч, и её же используют с программаторами USBasp, Arduino as ISP и AVRISP mkII. Разбираем ключи командной строки, готовые команды для плат Arduino и программаторов и то, что означают частые сообщения об ошибках.
Обновлено Редакция GAW
AVRDUDE (AVR Downloader Uploader) — открытая программа командной строки для записи и чтения памяти микроконтроллеров AVR. Она работает с флеш-памятью программ, EEPROM, фьюзами и битами защиты и понимает почти все программаторы AVR: ISP-программаторы USBasp, USBtinyISP, AVRISP mkII, STK500 и Arduino as ISP, отладчики Atmel-ICE, PICkit 4 и 5, MPLAB SNAP, загрузчики плат Arduino, а также интерфейсы UPDI, TPI, PDI, JTAG, debugWIRE и высоковольтное программирование. Arduino IDE вызывает именно avrdude, когда загружает скетч в плату на AVR. Текущая версия на момент написания — 8.3 от 11 сентября 2026 года, лицензия GPL 2.
Установка
Готовые сборки лежат на странице релизов проекта на GitHub: для Windows (x86, x64 и ARM64), Linux (x86, x64, ARM64 и ARMv6 для Raspberry Pi) и macOS. Архив достаточно распаковать: в Windows программа ищет файл описаний программаторов и микроконтроллеров avrdude.conf и файл пользовательских настроек avrdude.rc в той же папке, где лежит avrdude.exe. В Linux и macOS личные настройки хранятся в ~/.config/avrdude/avrdude.rc (или в старом ~/.avrduderc).
В Linux USB-программаторы по умолчанию доступны только администратору. Чтобы работать без sudo, нужно правило udev: avrdude сама печатает подходящее для выбранного программатора по команде avrdude -c usbasp/u вместе с инструкцией, куда его положить. После установки правила программатор надо отключить и подключить снова.
Из чего состоит команда
Типичная команда записи прошивки:
avrdude -p m328p -c usbasp -U flash:w:firmware.hex:i
| Ключ | Что задаёт | Пример |
|---|---|---|
-p | микроконтроллер: короткий код или полное имя | -p m328p, -p t85, -p atmega2560 |
-c | программатор или загрузчик | -c usbasp, -c arduino, -c arduino_as_isp |
-P | порт подключения | -P COM3, -P /dev/ttyUSB0, -P usb |
-b | скорость последовательного порта | -b 115200 |
-B | частота или период тактов ISP, JTAG, PDI, TPI, UPDI | -B 125kHz, -B 8 (8 мкс) |
-U | операция с памятью | -U flash:w:firmware.hex:i |
-e | стереть кристалл перед работой | |
-D | не стирать флеш автоматически | нужен для загрузчика wiring |
-V | не проверять записанное | |
-v | подробный вывод; -vv — ещё подробнее | |
-F | продолжить, несмотря на неверную сигнатуру | использовать с осторожностью |
Список известных микроконтроллеров печатает avrdude -p ?, программаторов — avrdude -c ?. Если указать и программатор, и ? вместо микроконтроллера, avrdude покажет только те микроконтроллеры, с которыми этот программатор умеет работать, и через какие интерфейсы. Порты, к которым сейчас подключены последовательные адаптеры, показывает avrdude -P ?s.
Ключ -U: что и куда записать
Аргумент -U состоит из четырёх полей через двоеточие: память : операция : файл : формат.
- Память —
flash,eeprom,lfuse,hfuse,efuse,lock,signatureи другие области микроконтроллера; список памяти конкретного кристалла показывает командаpartв терминальном режиме (-t). С версии 8.0 можно указать несколько областей через запятую, напримерflash,eeprom. - Операция —
w(записать из файла),r(прочитать в файл),v(сравнить память с файлом). - Файл — имя файла; дефис
-при чтении означает вывод на экран. - Формат —
i(Intel HEX),s(Motorola S-Record),r(двоичный образ),e(ELF, только для записи),m(значения прямо в командной строке),h,d,o,b(список чисел в шестнадцатеричной, десятичной, восьмеричной или двоичной записи),a(определить автоматически, только для входных файлов).
Без формата avrdude определяет формат входного файла сама, а прочитанную память одной области сохраняет как двоичный образ. Сокращение -U firmware.hex означает то же, что -U flash:w:firmware.hex:a.
Перед записью флеш-памяти классических AVR avrdude сама выполняет полное стирание кристалла: оно стирает и EEPROM, если её не защищает фьюз EESAVE. Ключ -D отключает автоматическое стирание. У микроконтроллеров с UPDI и у ATxmega стирание идёт постранично, и страницы, которые не затронуты прошивкой, сохраняют старое содержимое.
Готовые команды
Платы Arduino через загрузчик
Протокол и скорость загрузки для плат Arduino заданы в файле boards.txt ядра Arduino AVR; распиновка самих плат — на страницах Arduino Uno, Nano и Mega 2560. Плата подключается по USB, загрузчик должен быть записан.
| Плата | Протокол (-c) | Скорость (-b) | Особенность |
|---|---|---|---|
| Uno | arduino | 115 200 | |
| Nano с ATmega328P | arduino | 115 200 | новый загрузчик |
| Nano, старый загрузчик | arduino | 57 600 | в Arduino IDE — «ATmega328P (Old Bootloader)» |
| Mega 2560 | wiring | 115 200 | нужен -D: загрузчик не умеет стирать кристалл целиком |
| Leonardo (ATmega32U4) | avr109 | 57 600 | перед загрузкой — «касание» порта на 1200 бит/с, ключ -r |
# Arduino Uno: Windows — COM3, Linux — /dev/ttyACM0
avrdude -p m328p -c arduino -P COM3 -b 115200 -U flash:w:sketch.hex:i
# Arduino Mega 2560
avrdude -p m2560 -c wiring -P /dev/ttyACM0 -b 115200 -D -U flash:w:sketch.hex:i
# Arduino Leonardo: -r открывает порт на 1200 бит/с и запускает загрузчик
avrdude -p m32u4 -c avr109 -P /dev/ttyACM0 -b 57600 -r -U flash:w:sketch.hex:i
Загрузчик Arduino не умеет записывать фьюзы и биты защиты: для этого нужен программатор, подключённый к разъёму ISP.
Программатор USBasp
# записать прошивку
avrdude -c usbasp -p t85 -U flash:w:firmware.hex:i
# то же на пониженной частоте — для нового кристалла с тактовой частотой 1 МГц
avrdude -c usbasp -p t85 -B 125kHz -U flash:w:firmware.hex:i
Порт для USBasp указывать не нужно: avrdude находит его по идентификаторам USB. Если подключено несколько USBasp, нужный выбирается ключом -P usb:<серийный номер>.
Arduino как программатор (Arduino as ISP)
Плата Arduino с примером ArduinoISP становится ISP-программатором: она подключается к целевому микроконтроллеру линиями SPI и выводом RESET. В avrdude для неё есть программатор arduino_as_isp со скоростью 19 200 бит/с — те же параметры (протокол stk500v1, 19 200 бит/с) записаны для «Arduino as ISP» в файле programmers.txt ядра Arduino.
avrdude -c arduino_as_isp -P COM4 -p t85 -U flash:w:firmware.hex:i
Расположение выводов на разъёме ISP — в справочнике «Разъём ISP для AVR».
Фьюзы
# прочитать три фьюза ATmega328P и показать в HEX
avrdude -c usbasp -p m328p -U lfuse:r:-:h -U hfuse:r:-:h -U efuse:r:-:h
# записать фьюзы, как их ставит Arduino IDE при записи загрузчика Uno
avrdude -c usbasp -p m328p -U lfuse:w:0xFF:m -U hfuse:w:0xDE:m -U efuse:w:0xFD:m
Значения low 0xFF, high 0xDE и extended 0xFD для Uno взяты из boards.txt: внешний кварц, загрузчик на 256 слов, детектор питания на 2,7 В. Прежде чем записывать фьюзы, проверьте каждый бит в калькуляторе фьюзов AVR: ошибка в источнике тактов или запрограммированный бит RSTDISBL могут лишить доступа к микроконтроллеру через ISP.
Чтение прошивки и EEPROM
avrdude -c usbasp -p m328p -U flash:r:backup.hex:i -U eeprom:r:eeprom.hex:i
При чтении флеш-памяти avrdude отбрасывает байты 0xFF в конце — это незаписанная память, — поэтому файл может оказаться короче объёма флеш-памяти. Ключ -A оставляет их. Прочитать память, закрытую битами защиты, нельзя; снять защиту, как правило, можно только полным стиранием -e, а вместе с ним стирается и прошивка.
Частые ошибки
attempt 1 of 10: not in sync: resp=0x00— загрузчик или Arduino as ISP не отвечает: не тот порт или скорость, плата не сбросилась, нет загрузчика, порт занят монитором порта.programmer is not responding— программатор с протоколом STK500 молчит: та же проверка порта и скорости.initialization failed (rc = -1)— программатор не вошёл в режим программирования: соединения, питание платы, частота ISP.initialization failed (rc = -2)— по подсказке самой avrdude, частота ISP слишком высока для микроконтроллера.invalid device signature,expected signature for ATmega328P is 1E 95 0F— если прочитаны 00 00 00 или FF FF FF, связи с кристаллом нет; если другое значение, подключён не тот микроконтроллер, что указан в-p.cannot find USB device with vid=0x16c0 pid=0x5dc— USBasp не найден: не подключён, нет драйвера в Windows или прав на устройство в Linux.cannot set sck period; please check for usbasp firmware update— USBasp не принял команду установки частоты ISP; сообщение советует обновить прошивку программатора.
Частота ISP. Тактовый сигнал ISP должен быть медленнее четверти тактовой частоты микроконтроллера. Микроконтроллеры AVR с завода обычно работают от внутреннего генератора на частоте от 1 до 1,6 МГц, и для 1 МГц частота ISP должна быть ниже 250 кГц. Многие программаторы по умолчанию тактируют ISP с периодом 1 мкс — это рассчитано на микроконтроллер с тактовой частотой от 4 МГц. Если прошивка снизила тактовую частоту делителем CLKPR или фьюзы переключили микроконтроллер на кварц 32 кГц, предел ещё ниже. Руководство avrdude советует в таких случаях один раз стереть кристалл на низкой частоте (-B с большим периодом и -e), а затем работать на обычной.
Неверная сигнатура. Сигнатура — три байта, которые записаны в микроконтроллере на заводе. По ним avrdude проверяет, что подключён именно тот кристалл, который указан в -p. Сигнатуры всех AVR есть на страницах раздела AVR и в калькуляторе фьюзов. Ключ -F отключает проверку, но пользоваться им стоит, только если причина расхождения понятна.
Фьюз DWEN. Если включён режим отладки debugWIRE, вывод RESET занят отладкой, и обычный ISP не работает. Руководство avrdude описывает два выхода: высоковольтное программирование или отладчик с debugWIRE (JTAG ICE mkII, AVR Dragon), который временно выключает этот режим, после чего фьюз DWEN можно стереть по ISP.
Частые вопросы
Как прошить hex-файл в Arduino Uno через avrdude?
Плата должна быть подключена по USB, а загрузчик — на месте. Команда: avrdude -p m328p -c arduino -P COM3 -b 115200 -U flash:w:sketch.hex:i, где вместо COM3 — порт платы (в Linux /dev/ttyACM0 или /dev/ttyUSB0). Скорость 115 200 бит/с и протокол arduino взяты из boards.txt ядра Arduino. Для Nano со старым загрузчиком нужна скорость 57 600 бит/с, для Mega 2560 — протокол wiring.
Как прочитать фьюзы через avrdude?
Командой с операцией r и выводом в консоль: avrdude -c usbasp -p m328p -U lfuse:r:-:h -U hfuse:r:-:h -U efuse:r:-:h. Дефис вместо имени файла — вывод на экран, формат h — шестнадцатеричные числа с префиксом 0x. Значения можно вставить в калькулятор фьюзов и посмотреть, что означает каждый бит.
Что значит «not in sync: resp=0x00»?
Это сообщение протокола STK500 v1, который используют загрузчик Arduino и Arduino as ISP: avrdude отправила запрос синхронизации и не получила ответа. Частые причины — не тот порт или скорость (у Nano со старым загрузчиком 57 600 бит/с), выбрана не та плата, нет загрузчика или плата не сбросилась перед загрузкой, порт занят другой программой.
Почему avrdude пишет «initialization failed, rc = -1»?
Программатор не смог войти в режим программирования. Сама avrdude подсказывает проверить соединения и снизить частоту ключом -B, например -B 125kHz: частота ISP должна быть меньше четверти тактовой частоты микроконтроллера. У нового кристалла с внутренним генератором 1 МГц предел — 250 кГц. Ещё причины — нет питания у платы, перепутаны выводы разъёма ISP, вывод RESET занят (фьюз DWEN или RSTDISBL).
Можно ли использовать ключ -F?
Только когда точно известно, почему не совпала сигнатура. -F отключает проверку сигнатуры и позволяет продолжить после неудачной инициализации, но причина ошибки — плохой контакт, не тот микроконтроллер, неверная частота — от этого не исчезает, и запись может пойти в чип, которого вы не ожидали.
Источники
- AVRDUDE 8.3. Страница руководства avrdude(1), репозиторий avrdudes/avrdude — поддерживаемые программаторы и загрузчики, ключи -p, -c, -P, -b, -B, -C, -D, -e, -F, -i, -r, -U, -v, -V, -x, форматы файлов и операции -U, расположение файлов настроек
- AVRDUDE 8.3. Руководство пользователя (src/doc/avrdude.texi) — примеры командных строк, права на USB-устройства в Linux (правила udev), файлы настроек в Windows, раздел Troubleshooting: частота ISP и тактовая частота МК, фьюз DWEN, несколько программаторов одного типа
- AVRDUDE 8.3. avrdude.conf.in, main.c, stk500.c, usbasp.c — идентификаторы программаторов и микроконтроллеров (arduino_as_isp — 19 200 бит/с, usbasp, usbtiny, avrisp2, m328p, t85), тексты сообщений об ошибках и их подсказки
- AVRDUDE. Releases: AVRDUDE v8.3, 11 сентября 2026 — готовые сборки для Windows (x86, x64, ARM64), Linux (x86, x64, ARM64, ARMv6) и macOS
- Arduino. ArduinoCore-avr: boards.txt и programmers.txt (коммит 11b9130) — протокол и скорость загрузки плат Uno, Nano (новый и старый загрузчик), Mega 2560, Leonardo; фьюзы загрузчика Uno; настройки программаторов Arduino as ISP (stk500v1, 19 200 бит/с) и USBasp
Нашли ошибку?
Смотрите также
- Фьюзы AVRБиты фьюзов, заводские значения и avrdude
- AVR ISP, UPDI и TPIISP 6 и 10 pin, USBasp, UPDI и TPI
- AVRATmega, ATtiny, AVR Dx/Ex: семейства, прошивка, инструменты
- ATmega328PРаспиновка, фьюзы, Optiboot, периферия, питание, схема и код на C
- ПрограммыСАПР плат, симуляторы схем, среды и утилиты прошивки МК
- SPISCLK, MOSI, MISO, CS, режимы 0–3, daisy chain, частота, SPI в AVR