Перейти к содержанию

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)Особенность
Unoarduino115 200
Nano с ATmega328Parduino115 200новый загрузчик
Nano, старый загрузчикarduino57 600в Arduino IDE — «ATmega328P (Old Bootloader)»
Mega 2560wiring115 200нужен -D: загрузчик не умеет стирать кристалл целиком
Leonardo (ATmega32U4)avr10957 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 отключает проверку сигнатуры и позволяет продолжить после неудачной инициализации, но причина ошибки — плохой контакт, не тот микроконтроллер, неверная частота — от этого не исчезает, и запись может пойти в чип, которого вы не ожидали.

Источники

  1. AVRDUDE 8.3. Страница руководства avrdude(1), репозиторий avrdudes/avrdude — поддерживаемые программаторы и загрузчики, ключи -p, -c, -P, -b, -B, -C, -D, -e, -F, -i, -r, -U, -v, -V, -x, форматы файлов и операции -U, расположение файлов настроек
  2. AVRDUDE 8.3. Руководство пользователя (src/doc/avrdude.texi) — примеры командных строк, права на USB-устройства в Linux (правила udev), файлы настроек в Windows, раздел Troubleshooting: частота ISP и тактовая частота МК, фьюз DWEN, несколько программаторов одного типа
  3. AVRDUDE 8.3. avrdude.conf.in, main.c, stk500.c, usbasp.c — идентификаторы программаторов и микроконтроллеров (arduino_as_isp — 19 200 бит/с, usbasp, usbtiny, avrisp2, m328p, t85), тексты сообщений об ошибках и их подсказки
  4. AVRDUDE. Releases: AVRDUDE v8.3, 11 сентября 2026 — готовые сборки для Windows (x86, x64, ARM64), Linux (x86, x64, ARM64, ARMv6) и macOS
  5. Arduino. ArduinoCore-avr: boards.txt и programmers.txt (коммит 11b9130) — протокол и скорость загрузки плат Uno, Nano (новый и старый загрузчик), Mega 2560, Leonardo; фьюзы загрузчика Uno; настройки программаторов Arduino as ISP (stk500v1, 19 200 бит/с) и USBasp

Нашли ошибку?