Avrdude верификация что это
Наверняка у Вас уже есть макетная плата на микроконтроллере AVR (скорее всего Arduino Uno на микроконтроллере ATmega328P или какая-нибудь аналогичная), и Вы хотите научиться её программировать, т. е. прошивать программу в память кристалла микроконтроллера. Есть множество различных способов, здесь будет рассмотрен вариант использования такого универсального инструмента как avrdude.
Avrdude это утилита командной строки, так что для её использования придется изучить её опции, которыми настраивается тип программатора, задается программируемый чип, файл прошивки и фьюзы. Поначалу это может показаться сложным, но если разобраться, то окажется, что командная строка это очень удобно, потому что предоставляет универсальный способ работы со многими средами программирования. Например, можно писать программы для AVR даже в среде Microsoft Visual Studio, запуская процесс компиляции с помощью команд makefile, и прошивать память микроконтроллера настройкой запуска внешней команды прямо из Visial Studio (подробнее см. [6]). Утилиту avrdude использует также среда программирования Arduino для прошивки памяти микроконтроллера платы через загрузчик UART.
[Где взять avrdude]
Ссылки для загрузки AVRDUDE лучше всего найти с помощью Google. Обычно avrdude.exe находится в пакете утилит разработчика WinAVR, также она входит в пакет среды разработки Arduino IDE. Поэтому скачайте и установите либо WinAVR, либо среду разработки Arduino. Как вариант, можете скачать архив [12], там найдете все необходимое для этой статьи, в том числе и утилиту avrdude.
Различные версии avrdude и PDF-документацию можно найти по ссылке http://download.savannah.gnu.org/releases/avrdude/.
[Запуск avrdude]
В операционной системе Windows требуется открыть окно интерпретатора команд cmd.exe. Для этого в Start Menu (кнопка ПУСК) выберите команду Run. (Выполнить. ), в окне приглашения введите cmd и кликните по кнопке OK.
В операционной системе MacOS X можете использовать программу Terminal для получения доступа к интерфейсу ввода команд. Программа Terminal находится в папке Utilites.
Теперь в окне терминала введите команду avrdude и нажмите Ender, в результате утилита avrdude выдаст подсказку в виде списка основных опций.
[Описание опций AVRDUDE]
Опций довольно много. Не пытайтесь их все запомнить, нужно просто иметь общее представление о том, что эти опции могут делать.
-p partno : эта опция просто говорит утилите, какой микроконтроллер AVR будет программироваться. Например, если Вы собрались программировать ATtiny2313, то в качестве partno введите attiny2313.
-b baudrate: эта опция используется для настройки скорости последовательной передачи данных (через RS-232, UART) для программаторов, работающих по протоколам наподобие STK200 или STK500 STK500. Часто эту опцию использовать необязательно, потому что подходит скорость, настроенная по умолчанию.
-B bitrate: эта опция меняет скорость следования бит, на которой программатор общается с программируемым чипом. Если Ваш микроконтроллер тактируется очень низкой частотой, то потребуется снизить скорость данных программирования. Обычно микроконтроллер работает на высокой частоте (8 МГц и выше, особенно если используется кварцевый резонатор), так что эта опция применяется редко.
-c programmer : эта опция задает тип программатора (его протокол). Например, если используете STK500, то укажите stk500, если используете программатор DT006, то укажите dt006, и т. д.
-D: опция запрещает очистку памяти чипа перед программированием. Скорее всего, эта опция Вам никогда не потребуется.
-P port : опция задает порт обмена данными между компьютером и программатором. Это может быть COM1, LPT1 или USB.
-F: опция отменяет проверку сигнатуры, которая позволяет убедиться, что программируемый чип именно тот, который нужен. Настоятельно рекомендуется выполнять эту проверку для тестирования соединения, поэтому не используйте эту опцию.
-e: опция очистки памяти чипа. Обычно её использовать не нужно, потому что очистка FLASH выполняется автоматически перед программированием.
Если путь до файла имеет пробелы, то его следует брать в двойные кавычки.
-n: это означает, что никаких действий записи производиться не будет. Команда полезна, когда Вы хотите гарантировать, что ни одна из отправляемых команд не повредит содержимое памяти чипа. Это разновидность ‘блокировки безопасности’.
-V: выключает автоматическую проверку содержимого памяти при записи. Не советую использовать эту опцию, потому что проверка дает дополнительную уверенность, что память записана правильно.
-u : запрет режима безопасности. Это установка по умолчанию, когда avrdude запускается из скрипта. Если хотите модифицировать биты фьюзов, то используйте эту опцию, чтобы явно подтвердить свои намерения (подавляет дополнительный запрос подтверждения).
-t: запускает режим терминала, когда Вы вводите команды строка за строкой. Не используйте этот режим, поскольку это добавляет сложности.
-E: выводит некоторые спецификации программатора, не используйте эту опцию.
-v: опция включает подробный вывод сообщений. Это может потребоваться для диагностики, чтобы получить дополнительную информацию. Обычно эта опция не нужна.
В этом списке красным цветом выделены те опции, которые скорее всего Вам понадобятся. Давайте рассмотрим подробнее использование этих опций.
[-c programmer]
[-p partno]
В этом списке указаны псевдонимы всех чипов микроконтроллеров, о которых знает avrdude. Большинство из них программируются через интерфейс ISP.
Обратите внимание, что названия моделей чипов t2313 и 2313, m8 и m88, c128 и m128 выглядят очень похоже, но на самом деле это абсолютно разные модели микроконтроллеров! Поэтому во избежание ошибки советую Вам вместо псевдонима чипа ввести его полное имя. Т. е. вместо t2313 используйте attiny2313, или вместо m8 используйте atmega8. Avrdude достаточно умен, чтобы распознать правильно тип чипа по его полному имени.
![]() | ![]() |
[-P port]
Если Вы используете параллельный (LPTx) или последовательный (COMx) порт для подключения программатора (что сейчас уже почти не актуально, потому что компьютеры с такими портами уже практически не выпускаются), то должны использовать эту опцию, чтобы показать порт, к которому подключен программатор. На операционной системе Windows в 99% случаев это будет lpt1 (для параллельного порта) или com1 (для последовательного порта), но Вы можете всегда проверить это через просмотр раздела «Ports (COM & LPT)», по-русски это раздел «Порты (COM и LPT)» дерева Device Manager (Менеджер Устройств). Откройте управляющую панель System Properties (Свойства Системы), и выберите закладку Hardware (Оборудование):
Кликните на кнопке Device Manager (Менеджер Устройств), и разверните пункт Ports (Порты).
Здесь будут перечислены все имеющиеся на компьютере параллельные и последовательные порты. Может быть несколько последовательных портов, но обычно параллельный порт (так называемый порт принтера) только один.
/dev/cu.Bluetooth это встроенный порт bluetooth, он не нужен. /dev/cu.modem это модем (если он имеется на Вашем компьютере), его также не нужно использовать. Обратите внимание на порты наподобие /dev/cu.usbserial или /dev/cu.KeySerial1. В моем случае это порт /dev/cu.usbserial-FTCTYG5U.
[-U memtype:r|w|v:filename:format]
Это опция, которая описывает, как реально будут записываться данные в программируемый микроконтроллер. Команда выглядит довольно сложной, но мы рассмотрим её по частям.
memtype может быть либо flash, либо eeprom, либо hfuse (старший байт фьюзов), либо lfuse (младший байт фьюзов) или efuse (расширенный байт фьюзов).
r|w|v может быть либо r (read, чтение), w (write, запись), v (verify, проверка).
filename имя входного (для записи или проверки) или выходного (для чтения) файла.
[:format] не обязательная опция, указывающая формат файла. Можно опустить эту опцию при записи, но для чтения указывайте i, чтобы выходной файл получил формат Intel Hex [7] (это наиболее распространенный формат файла).
[Как программировать]
В примерах ниже я буду использовать программатор mkII-slim [8] (это клон фирменного AVRISP-mkII компании Atmel) и загрузчик USBasp на примере программирования чипов ATmega328P и ATmega32A через интерфейс ISP и через интерфейс USB. Само собой, Вы должны будете ориентироваться на Ваш конкретный программатор, программируемый чип и его фьюзы.
Подготовьте Вашу программируемую плату, удостоверьтесь, что можете подключить к ней питание (для программирования требуется наличие питания на программируемом микроконтроллере). Плата может питаться как от отдельного внешнего источника питания, так и от коннектора программатора, если он это позволяет.
Прошивать я буду тестовый пример, мигающий светодиодом на плате (так называемый Hello World для мира микроконтроллеров). Если кому-то интересно, то код этого примера приведен во врезке, или можете скачать его проект AVR Studio по ссылке [12] (см. папку HelloWorld архива).
Все платы Arduino обычно программируются одинаково, через интерфейс USB. При этом используется загрузчик UART (интерфейс USB организован аппаратно, с помощью специального отдельного чипа). В этом примере в плату Arduino Nano будет записана прошивка HEX\Hello-World-Arduino-ATmega328.hex. Загрузчик использует функцию самопрограммирования памяти программ AVR [9]. Обратите внимание, что фьюзы таким способом записать нельзя (самопрограммирование памяти программ микроконтроллера AVR не распространяется на фьюзы).
При компилировании прошивки Hello-World-Arduino-ATmega328.hex было учтено, что светодиод подключен к порту PB5 (цифровой порт D13 Arduino).
Подключите плату Arduino Nano через USB (при этом на микроконтроллер ATmega328 будет подано питание), и выполните команду:
Примечание: здесь подразумевается, что виртуальный COM-порт, через который подключена плата Arduino, имеет имя COM20.
При компилировании прошивки Hello-World-ATmega2560.hex было учтено, что светодиод подключен к порту PB7 (цифровой порт D13 Arduino).
Подключите плату Arduino MEGA 2560 через USB (при этом на микроконтроллер платы будет подано питание), и выполните команду:
Примечание: здесь подразумевается, что виртуальный COM-порт, через который подключена плата Arduino, имеет имя COM155.
В плату metaboard [11] записан загрузчик USBasp, эмулирующий поведение программатора USBasp. Интерфейс USB реализован программно, с помощью библиотеки V-USB. Как и в предыдущем примере с Arduino, фьюзы записать нельзя, мы будем записывать только память программ.
При компилировании прошивки Hello-World-metaboard-ATmega328.hex было учтено, что светодиод подключен к порту PB5.
Для записи прошивки подключите плату metaboard через USB, удерживая при подключении кнопку S1 Reset, после подключения к USB кнопку отпустите (это активирует работу загрузчика), и выполните команду:
Чтобы убедиться, что записанная программа работает и светодиод мигает, подключите его через резистор 330..470 ом к порту PB5 (ножка 6 коннектора IP2 платы metaboard), что соответствует цифровому порту D13 Arduino.
![]() |
На плату AVR-USB-MEGA16 установлен микроконтроллер ATmega32A, и также используется загрузчик USBasp на основе все той же библиотеки V-USB. Поэтому программирование будет осуществляться аналогично. Перед подключением платы AVR-USB-MEGA16 к USB установите перемычку между контактами 4 и 6 коннектора U1 ISP, это активирует работу загрузчика:
И запустите следующую команду:
После программирования будет мигать светодиод D1, подключенный к ножке PB1 микроконтроллера, см. схему платы в статье [10]. При компилировании прошивки Hello-World-ATmega32A.hex было учтено, что светодиод подключен к порту PB0.
Подключите сначала программируемую плату к программатору через интерфейс ISP. Перемычка питания на программаторе mkII-slim должна быть установлена в положение «5V». Обратите внимание, что в данном примере питание на программируемую плату подается через программатор, поэтому подключать плату AVR-USB-MEGA16 к USB не обязательно.
Для подключения через ISP понадобится плоский кабель из 6 проводов мама-мама:
После того, как соединили кабелем ISP программируемую плату и программатор, подключите программатор через USB и для программирования памяти программ выполните команду:
Как программировать фьюзы:
Программирование платы Arduino Uno, на которой установлен микроконтроллер ATmega168, плата подключена к компьютеру через виртуальный порт COM4:
Программирование ATtiny2313 с помощью программатора USBtiny [2]:
Программирование через параллельный bitbang-программатор DT006 (такой как MiniPOV2):
Программирование через последовательный bitbang-программатор DASA (такой как MiniPOV3):
Программирование платы разработчика STK500 (она работает как одноименный программатор):
Программирование через программатор AVRISP v2 USB:
Программаторы, ISP, фьюзы
Загрузка прошивки
В этом уроке мы рассмотрим загрузку прошивки в ардуино через внешние “программаторы”. Давайте вспомним, о чем уже говорили в одном из первых уроков: загрузка прошивки в Arduino возможна двумя способами:
Загрузчик (bootloader)
Загрузчик живёт в самом конце Flash памяти МК и позволяет записывать прошивку, отправляемую через UART. Загрузчик стартует при подаче питания на МК, ждёт некоторое время (вдруг кто-то начнёт слать код прошивки по UART), затем передаёт управление основной программе. И так происходит каждый каждый раз при старте МК.
Программатор
Помимо записи прошивки во flash память, программатор позволяет:
Программатор – ваш единственный друг при работе с “голым” микроконтроллером, то есть для его низкоуровневой настройки и загрузки прошивки.
USB-TTL (UART)
Этот способ реализован прямо на платах Arduino при помощи USB-TTL (USB-UART) преобразователя, именно поэтому мы можем подключить плату к компьютеру и загрузить код. USB-TTL позволяет только загрузку данных во flash, остальные возможности (как у ISP программатора) ему недоступны. В то же время он ограничен только возможностями загрузчика, но в этом уроке мы рассматриваем только стандартные. Также USB-TTL мост позволяет микроконтроллеру общаться с компьютером по последовательному соединению (тот самый Serial и монитор com порта). Есть платы без бортового USB-TTL, например Arduino Pro Mini. Для работы с ними нужно купить внешний USB-TTL преобразователь. Также загрузка прошивки через UART возможна и в “голый” микроконтроллер при условии наличия там загрузчика, который запишет принятый код во flash. Про запись загрузчика мы поговорим ниже. UART “загружатор” подключается к пинам RX и TX Ардуино (или микроконтроллера), RX->TX и TX->RX, также обязательно подключается земля GND. Если у прошиваемой платы нет своего питания, то подключается и питание. Загрузчик отрабатывает при запуске МК, поэтому непосредственно перед загрузкой прошивки МК должен быть сброшен (перезагружен), и для этого на платах USB-UART есть вывод DTR (Data Terminal Ready), который подключается к пину RST Reset и собственно выполняет сброс перед перед загрузкой прошивки. На платах Pro Mini есть отдельный пин DTR.
| USB-TTL | Arduino |
| DTR | DTR |
| RX | TX |
| TX | RX |
| GND | GND |
| VCC/5V/3.3V | VCC |


Фьюзы (Pro)
Фьюзы (фьюз-биты) являются низкоуровневыми настройками микроконтроллера, которые хранятся в специальном месте в памяти и могут быть изменены только при помощи ISP программатора. Это такие настройки как выбор источника тактирования, размер области памяти под загрузчик, настройка отсечки по напряжению и прочее. Фьюз-биты собраны по 8 штук в байты (т.н. байты конфигурации), как типичный регистр микроконтроллера AVR. Таких байтов может быть несколько, они называются low fuses, high fuses, extended fuses. Для конфигурации байтов рекомендуется использовать калькулятор фьюзов (например, вот такой), в котором просто ставятся галочки на нужных битах, и на выходе получается готовый байт в hex виде. Рассмотрим на примере ATmega328p:
Важный момент: в AVR биты у нас инверсные, то есть 1 это выкл, 0 это вкл. Расставляя галочки в калькуляторе, мы формируем байт, галочка стоит – бит включен, но в результирующем байте включенные биты являются нулями. Об этом стоит задумываться при ручном составлении фьюз-байта, при использовании калькулятора можете об этом даже не вспоминать. Что позволяют настроить биты?
* – прошивка возможна при помощи высоковольтного программатора
Лок-биты (Pro)
Лок-биты (lock-bits) позволяют управлять доступом к памяти микроконтроллера, что обычно используется для защиты устройства от копирования. Лок-биты собраны опять же в конфигурационный лок-байт, который содержит: BOOTLOCK01, BOOTLOCK02, BOOTLOCK11, BOOTLOCK12, LOCKBIT1, LOCKBIT2 (для ATmega328). Калькулятор лок-битов можно использовать этот. BOOTLOCK биты позволяют запретить самому МК запись (самопрограммирование) во flash память (область программы и область загрузчика)
А вот локбиты LOCKBIT позволяют запретить запись и чтение flash и EEPROM памяти извне, при помощи программатора, т.е. полностью защитить прошивку от скачивания и копирования:
Таким образом включив LOCKBIT1 (лок-байт будет 0x3E) мы запретим внешнюю запись во Flash и EEPROM память, т.е. при помощи ISP программатора, а включив LOCKBIT1 и LOCKBIT2 (лок-байт: 0x3C) полностью заблокируем заодно и чтение данных из памяти микроконтроллера. Повторюсь, всё описанное выше относится к ATmega328p, для других моделей МК читайте в соответствующих даташитах.
ISP программатор
USBasp
Дешёвые ISP программаторы также есть в ассортименте у китайцев, рекомендую брать USBasp как самый распространенный. Поискать на алиэкспресс, мне нравится версия в корпусе. USBasp имеет не очень удобный выход 10-пин на шлейфе, поэтому рекомендуется купить также переходник 10-пин на 6-пин, который позволяет сразу подключаться к ISP header’у, который есть на большинстве плат Arduino. Внимание! Очень часто встречается брак в виде непропая контактов, поэтому во избежание проблем рекомендуется пропаять переходник и отмыть флюс (зубная щётка + бензин калоша).
Решение проблем
Решение большинства проблем с загрузкой через программатор (независимо от того, что написано в логе ошибки):
Для прошивки микроконтроллера, тактирующегося низкой частотой (менее 1 МГц внутренний клок):
Основные ошибки в логе Arduino IDE
avrdude: error: could not find USB device with vid=0x16c0 pid=0x5dc vendor=’www.fischl.de’ product=’USBasp’ Причина – компьютер не видит USB ASP
avrdude: error: program enable: target doesn’t answer. Причина – usbasp не видит подключаемый микроконтроллер
Arduino as ISP
Почти любая другая плата Arduino может стать ISP программатором, для этого нужно просто загрузить в неё скетч ArduinoISP:
ISP программатор подключается к четырем пинам микроконтроллера, не считая питания: один из пинов передает сброс, остальные – для передачи данных. Чтобы плата-программатор не сбрасывалась при загрузке, на неё нужно:
Решение проблем
Для прошивки микроконтроллера, тактирующегося низкой частотой (менее 1 МГц внутренний клок):
Работа в Arduino IDE
Прошивка загрузчика
Из Arduino IDE при помощи ISP программатора мы можем записать другой загрузчик (по факту загрузчик + фьюзы) и загрузить скетч, а также настроить/прошить фьюзы и лок-биты, но не очень удобным способом. Когда мы выбираем плату в Инструменты > Плата и загрузчик в Инструменты > Плата (загрузчик, bootloader), Arduino IDE автоматически делает “активным” нужный загрузчик. Нажимая Инструменты > Записать загрузчик мы прошиваем загрузчик, соответствующий выбранной плате и её настройкам. Также одновременно с загрузчиком прошиваются фьюзы и лок-биты, соответствующие выбранной плате в Arduino IDE. Как и где их поменять, смотрите чуть ниже. Рассмотрим на примере записи загрузчика для atmega328, стоящей на китайской плате Arduino NANO. На данный момент китайцы прошивают в МК старую версию загрузчика, которая называется old bootloader в меню платы. Оригинальные платы идут с более современным загрузчиком, поэтому при работе с китайскими платами нам приходится выбирать old bootloader для загрузки прошивки через бортовой usb порт. Подключим usbasp по схеме выше, выберем его как программатор в Инструменты > Программатор, выберем плату Arduino NANO, загрузчик для atmega328 (первый в списке). Нажмём записать загрузчик. Всё! Теперь плату можно шить через бортовой usb порт, выбирая первый загрузчик. Он кстати легче, быстрее “прошивает” и сама прошивка быстрее “запускается”.
Как убрать загрузчик?
В стандартном “ядре” Arduino не предусмотрен вариант “без загрузчика”. Для того, чтобы вручную убрать поддержку загрузчика, нужно уметь работать с boards.txt и фьюзами: нужно будет изменить фьюз BOOTRST и подправить максимальный размер скетча. Есть более простой вариант – найти и установить ядро, в котором реализован выбор загрузчика с вариантом “без загрузчика”, например для ATmega328 это miniCore и наше GyverCore. Нужно установить поддержку ядра по рассмотренной ранее инструкции, выбрать плату, указать вариант “без загрузчика” и нажать “Записать загрузчик”. В МК будут прошиты соответствующие фьюзы.
Загрузка скетча
Фьюзы
Файл конфигурации называется boards.txt и найти его можно в папке с ядром Arduino: C:\Program Files (x86)\Arduino\hardware\arduino\avr\boards.txt. Документацию на boards.txt можно почитать здесь. При желании можно вывести нужные фьюзы через калькулятор (читайте выше), изменить их в boards.txt (главное не запутаться, для какой выбранной конфигурации платы делается изменение) и прошить в МК, нажав Инструменты > Записать загрузчик.
Такая работа с фьюзами максимально неудобна, но есть и другие варианты:




















