Что такое загрузчик ардуино
Digitrode
цифровая электроника вычислительная техника встраиваемые системы
Что такое загрузчик Arduino и как он работает?
Почти все микроконтроллерные (и микропроцессорные) системы используют некоторую форму загрузчика. Часто называемый прошивкой, что ошибочно, в Arduino также имеется загрузчик. Так как это довольно популярная платформа, давайте использовать ее в качестве обобщенного примера всех загрузчиков. Давайте поговорим о том, что делает загрузчик и как он работает.
Когда микроконтроллер включается, он знает только, как делать только одну вещь. Как правило, это одна задача – запустить инструкцию, найденную в определенной ячейке памяти. Часто это адрес 0x0000, но не всегда. Обычно это место памяти будет содержать инструкцию перехода в другое место в памяти, которое является началом пользовательской программы. Однако загрузчик существует в немного другом пространстве памяти, отличном от пространства пользовательской программы.
При включении или сбросе загрузчик представляет собой раздел памяти программ, который запускается до запуска основного кода. Он может использоваться для настройки микроконтроллера или предоставления ограниченной возможности обновления кода основной программы.
Но как же работает загрузчик? Загрузчик Arduino поддерживает перепрограммирование памяти программ (или Flash-памяти) через последовательный порт. Без этого вам понадобится специальный аппаратный программатор, например, USBtiny для изменения кода в ATmega328p у Arduino Uno.
Как и многие микроконтроллеры, ATmega328p выделяет часть своей программной памяти для загрузки кода. В случае Uno загрузчик Arduino ждет короткое время, наблюдая за выводами UART. Если загрузчик не получает определенную последовательность байтов по последовательному порту, процессор переходит к разделу «пользовательской» программы для загрузки того, что уже находится в памяти программы. Этот скачок загружает вашу программу (или скетч).
Если предварительно определенная последовательность получена, загрузчик Arduino претендует на роль программатора AVR. В случае Uno используется уникальный протокол программирования, называемый «arduino». Этот «специальный протокол» является вариантом аппаратного программатора stk500. Другие платы Arduino имеют другие типы программаторов, которые они поддерживают.
На этом этапе avrdude начнет отправлять двоичные данные вашей программы по протоколу через виртуальный последовательный порт. Программная память (PROGMEM) ATmega328p сохраняет входящий поток байтов. После завершения чип сбрасывается и запускает новый код.
Повторное программирование Flash-памяти без специального программатора возможно только в том случае, если код работает во время фазы загрузки. Идея состоит в том, чтобы не допустить, чтобы вредоносный код (или какие-то баги) менял содержимое Flash-памяти.
Преимуществом загрузчика является то, что на более высоком уровне загрузчик может использоваться для предварительной настройки микроконтроллера / микропроцессора или, в случае загрузчика Arduino, позволяет программировать конечное устройство в полевых условиях. Хотя вы можете использовать загрузчик Arduino для тестирования и разработки кода в своем проекте, вы также можете использовать загрузчик для обновления кода в конечном продукте.
В то время как загрузчики предлагают невероятные преимущества, есть некоторые аспекты, которые следует учитывать, если вы храните загрузчик в готовом проекте.
Оглядываясь на то, как работает загрузчик Arduino, помните, что он задерживает выполнение «реального» программного кода. Этот факт означает, что до запуска основного кода после включения микроконтроллера была задержка.
Если у вас есть код загрузчика, это означает, что теперь выделено меньше объема памяти для вашей программы. Загрузчик optiboot для Arduino Uno занимает 508 байт (512-байтовый блок минус оставшиеся 4 байта). Впрочем, при Flash-памяти в 32 Кб занятие дополнительных 512 байт это не так много.
Поскольку загрузчик Arduino работает до вашего кода, он может устанавливать некоторые регистры не так, как ожидается. Например, у некоторых людей были проблемы со сторожевым таймером при ранних версиях загрузчика Arduino. К счастью, загрузчик optiboot, который сегодня более распространен, решает проблему сторожевого таймера.
Тем не менее, загрузчик Arduino позволяет программировать плату, такую как Uno, очень легко. Загрузчики не идеальны и требуют некоторых ресурсов, которые могут потребоваться для вашего проекта. Однако такие компромиссы обычно стоят того.
Что такое загрузчик ардуино
Среда разработки Ардуино
Интерфейс среды разработки Ардуино содержит следующие основные элементы: текстовый редактор для написания кода, область для вывода сообщений, текстовая консоль, панель инструментов с традиционными кнопками и главное меню. Данный софт позволяет компьютеру взаимодействовать с Ардуино как для передачи данных, так и для прошивки кода в контроллер.
Написание программ
Verify (Проверить)
Проверить код на ошибки.
New (Создать)
Создать новую программу.
Open (Открыть)
Команда открывает меню со списком всех скетчей, доступных в вашей рабочей папке. После щелчка по файлу его содержимое откроется в текущем окне.
Save (Сохранить)
Сохранить программу
Serial Monitor
Открыть программу «Serial Monitor» (для работы с последовательным интерфейсом).
Дополнительные команды находятся в меню: File, Edit, Sketch, Tools и Help. В этих меню всегда активны только те пункты, которые можно применить к текущему элементу или фрагменту кода.
Меню «Edit (Правка)«
Меню «Sketch (Программа)«
Меню «Tools (Инструменты)«
Скетчбук (рабочая папка)
В среде разработки Ардуино используется принцип организации скетчбука: все ваши программы (или скетчи) хранятся в одном месте. Чтобы просмотреть их, необходимо выбрать меню File > Sketchbook или щелкнуть по кнопке Open на панели инструментов. Директория для хранения ваших программ будет автоматически создана при первом запуске среды Ардуино. Ее месторасположение всегда можно изменить в окне настроек программы.
Вкладки, компиляция и работа с несколькими файлами
Прошивка
После выбора используемого порта и платы, необходимо нажать кнопку Upload на панели инструментов или выбрать пункт Upload из меню File. После этого произойдет сброс Ардуино и начнется процесс загрузки программы в память контроллера. В старых моделях (до Arduino Diecimila) функция авто-сброса отсутствует, поэтому перед прошивкой таких устройств необходимо вручную нажать кнопку сброса на плате. В процессе загрузки на большинстве моделей Ардуино будут мигать светодиоды RX и TX. По завершению процесса прошивки, программа выдаст соответствующее сообщение или ошибку.
Библиотеки
Список основных библиотек, описанных на сайте, приведен здесь. Некоторые из них устанавливаются вместе со средой разработки Ардуино, остальные можно скачать из разных источников. В версиях IDE 1.0.5 и старше реализована возможность импорта библиотек прямо из zip-архива и подключения их к текущему скетчу. См. инструкции по установке сторонних библиотек.
Инструкции по написанию собственных библиотек см. здесь.
Оборудование сторонних производителей
Дополнительную информацию о создании пакетов для стороннего оборудования можно найти в соответствующем разделе на сайте Arduino Google Code.
Программа «Serial Monitor»
Отображает данные, поступающие от Ардуино на компьютер по последовательному интерфейсу (поддерживается работа как с USB-, так и с обычными версиями Ардуино). Чтобы отправить данные внешнему устройству, достаточно просто ввести текст в окне программы и щелкнуть по кнопке «Отправить» (либо нажать Enter). Из выпадающего списка необходимо выбрать только скорость передачи данных, соответствующую той скорости, которую вы указали в функции Serial.begin() в вашем скетче. Помните, что на Mac- и Linux-системах, Ардуино будет сбрасываться при каждом подключении программы к устройству (соответственно, после сброса скетч будет выполняться заново).
Общаться с Ардуино можно также через Processing, Flash, MaxMSP и пр. (подробнее об этом читайте здесь).
Настройки
Поддерживаемые языки
Среда разработки Ардуино 1.0.1 переведена более чем на 30 различных языков. По умолчанию, язык IDE выбирается исходя из языковых настроек вашей операционной системы. (Обратите внимание: на Windows и Linux-системах язык IDE определяется по региональным настройкам, отвечающим за формат даты и валюты, а не по языкоу самой операционной системы).
Если вы хотите вручную изменить текущий язык программы, запустите среду Ардуино и откройте окно настроек. В поле Editor Language будет выпадающий список поддерживаемых языков. Выберите из списка предпочитаемый язык и перезапустите программу, чтобы изменения вступили в силу. Если выбранный вами язык не поддерживается, то по умолчанию IDE подгрузит английскую локализацию.
Чтобы сбросить языковые настройки среды и вернуть автоматический выбор ее языка по региональным настройкам операционной системы, в выпадающем списке необходимо выбрать пункт System Default. Изменения вступят в силу после перезапуска IDE Arduino. И наоборот, чтобы изменение языковых настроек операционной системы повлияли на текущий язык программы, необходимо просто перезапустить среду Ардуино.
Разновидности плат
Выбирать модель используемой платы в среде Ардуино необходимо по двум причинам:
Ниже перечислены основные пункты меню Boards и дана расшифровка соответствующих им настроек:
Инструкции по добавлению в программу других устройств описаны выше в разделе «Оборудование сторонних производителей». Текст данного руководства опубликован под лицензией Creative Commons Attribution-ShareAlike 3.0. Примеры кода, встречающиеся в руководстве, являются свободным контентом.
Программаторы, 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 |
Китайцы выпускают USB-TTL модули в широком ассортименте, но в целом они все одинаковые по своей сути. Ссылка на результат поиска на aliexpress, и ссылка на все USB-TTL в моём любимом магазине WAVGAT. Что использую я? В основном платку на CP2102. Перед заказом модуля обязательно убедитесь в том, что у него есть выход DTR, иначе этот модуль можно будет использовать только для “общения” с контроллером через COM порт. Для работы с таким преобразователем нужно установить драйвер для чипа, на базе которого собран модуль, это может быть CP2102, CH340/341, FT232, PL2303 и другие. Прошивка загружается как обычно: выбираем порт, на котором сидит преобразователь, версию загрузчика и жмём загрузить, всё! Важный момент: на некоторых китайских версиях плат Arduino Pro Mini не распаян пин DTR, т.е. он не идёт на RST и автоматический сброс перед загрузкой прошивки не выполняется. В этом случае сброс нужно производить вручную, кнопкой RST, непосредственно перед загрузкой прошивки… Загрузка прошивки посредством загрузчика (bootloader) возможна с любого UART устройства, даже через Bluetooth. Но об этом мы поговорим в отдельном уроке.
Фьюзы (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 (главное не запутаться, для какой выбранной конфигурации платы делается изменение) и прошить в МК, нажав Инструменты > Записать загрузчик.
Такая работа с фьюзами максимально неудобна, но есть и другие варианты:
Avrdudeprog
Видео
Что такое загрузчик ардуино
Прошивка загрузчика из среды разработки Arduino. Чтобы прошить bootloader, Вам понадобится купить AVR-ISP (фирменный программатор ISP компании Atmel), USBtinyISP [6] или самому собрать ParallelProgrammer [7]. Программатор должен быть подключен к коннектору ICSP, это двухрядный разъем «папа», 2×3 выводов, с цоколевкой ISP6 [8]. При подключении убедитесь, что подсоединили коннектор в правильной ориентации, не наоборот. Для программирования на микроконтроллер платы должно подаваться питание; для плат Arduino обычно питание подается от внешнего источника или от порта USB.
Команда «Burn Bootloader» (прошить загрузчик) среды разработки Arduino IDE использует avrdude, утилиту с открытым исходным кодом. При этом выполняются друг за другом шагов: разблокировка секции загрузки микроконтроллера (с помощью изменения фьюзов lock byte), запись фьюзов микроконтроллера, загрузка кода загрузчика в память микроконтроллера (программа bootloader записывается в секцию загрузки), и затем блокировка секции загрузчика микроконтроллера (с помощью изменения фьюзов активация защиты секции загрузчика lock byte). Эти шаги управляются некоторыми настройками в preferences file системы Arduino.
Примечание: что такое preferences file, где он находится?
Вот, например, эти настройки в preferences file для ATmega8 bootloader:
Вот настройки для ATmega168 bootloader (здесь слово ПЛАТА может быть либо diecimila, либо ng):
Здесь приведен перевод инструкции, предоставленной Gian Pablo Vilamil ( Bootload the Arduino Mini site:arduino.cc ). Инструкция полезна также для китайских плат Arduino, в которые производители для удешевления производства «забывают» прошить загрузчик.
В каких случаях может понадобиться перешить загрузчик?
2. Нужно заменить имеющуюся версию загрузчика на другую. Старые несовершенные загрузчики плат Arduino (до появления Arduino Diecimila) ждали около 10 секунд после сброса или включения питания, пока придет от хоста новая программа микроконтроллера (скетч). Такая задержка могла появиться и после программирования скетча. Эта лишняя задержка довольно неприятна, когда не нужно записывать в память скетч. Альтернативные загрузчики, в том числе Adaboot bootloader, LilyPad bootloader и загрузчик Arduino Diecimila устраняют эту задержку. Также в некоторых случаях Вы можете самостоятельно изменить код загрузчика (см. разделы «Исходный код загрузчиков Arduino», ссылку [9] и врезку «Пример конфигурирования загрузчика Arduino UART»). Это полезно, когда нужно, чтобы проект стартовал намного быстрее (без таймаута загрузчика), и особенно когда при включении питания/сбросе возможно поступление на вход UART каких-то данных, не относящихся к загрузке. Если обычный загрузчик получит некоторые посторонние данные, то он будет пытаться их обработать как данные новой прошивки, что может привести к ошибкам, задержке запуска, и возможно даже что Ваша программа никогда не запустится.
Чем программирование загрузчика у Arduino Mini отличается от других плат Arduino? Полноразмерные платы Arduino имеют 6-контактный коннектор ISP для подключения программатора. Ну у платы Arduino такого коннектора нет (он просто не поместился на маленькой плате), поэтому Вам понадобится сделать кабель с коннектором самостоятельно. В остальном программирование загрузчика ничем не отличается.
Что понадобится?
• Программатор ISP [5], например AVR ISP MkII или другой.
• 6 проводков.
• 2 кусочка линеек по 3 контакта (или двухрядный разъем «папа» на 6 контактов).
• Среда программирования AVR Studio (можно загрузить с сайта Atmel, или см. [11]).
Как сделать кабель?
Кабель должен соединять 6 контактов платы Arduino Mini с контактами разъема ISP программатора. Эти 6 выводов называются MISO, MOSI, SCK, RESET, Power и Ground. Из этих выводов 3 соответствуют цифровым портам ввода / вывода Arduino 11..13. Другие 3 вывода это сброс (Reset), +5V (Power) и земля (Ground, GND), и возможно Вы их уже используете. Обратите внимание, что вывод +5V это не вывод +9V. Вывод +5V нужен для подачи питания в программатор ISP.
Эти 6 выводов платы Arduino нужно подключить к 6 выводам коннектора ISP, показанным ниже.
1 | MISO | VCC | 2 | ||
3 | SCK | MOSI | 4 | ||
5 | GND | 6 |
Обратите внимание, что на этом рисунке показана нумерация контактов с обратной стороны коннектора ISP программатора (или со стороны штырьков коннектора, который будет подключен к плате Arduino Mini). Если коннектор программатора наколот на плоский кабель, у которого красным помечен первый провод, и коннектор обращен от Вас, то на рисунке показано то, что Вы увидите.
Сделайте соединения между платой Arduino и двухрядным коннектором «папа», как показано на рисунке ниже. Подключите этот коннектор к разъему ISP6 «мама» программатора, соблюдая правильную ориентацию коннекторов. Подключите программатор к компьютеру, подайте питание на плату Arduino.
Как прошить загрузчик в среде программирования Arduino?
Чтобы прошить альтернативный загрузчик (например, который Вы скомпилировали сами), понадобится программное обеспечение для управления программатором. Есть множество таких утилит, и в зависимости от имеющегося программатора Вам нужно выбрать то программное обеспечение, которое работает с Вашим программатором. Если Вы используете программатор AVR-ISP mkII, отладчик AVR Dragon или JTAGICE mkII, то можете воспользоваться средой программирования AVR Studio [11], где есть утилита программатора.
Как прошить загрузчик в среде программирования AVR Studio?
Загрузите и установите среду программирования AVR Studio. К сожалению, она работает только в операционной системе семейства Windows, но в Интернете можно найти инструкции, как прошить загрузчик (как и любую программу в память микроконтроллера AVR) в среде Mac OS/X, Linux и даже FreeBSD.
Запустите AVR Studio. Нажмите Cancel, чтобы пропустить стартовое окно, предлагающее создать или открыть проект.
Нажмите кнопку Program. В строке статуса основного окна AVR Studio Вы увидите отображение прогресса записи кода загрузчика. После окончания записи можно также нажать кнопку Verify, чтобы еще раз убедиться, что процедура завершилась успешно.
Подробнее про настройку фьюзов см. врезку «На что нужно обратить внимание при программировании загрузчика». В установке фьюзов и бит защиты очень помогает калькулятор фьюзов [10], также см. даташит на используемый микроконтроллер.
[Версии загрузчика Arduino]
Есть разные версии bootloader, потому что они должны работать на разной аппаратуре (разных платах Arduino), и потому что за длительное время развивалась как схема Arduino, так и код загрузчика.
Текущие версии загрузчиков (например те, которые поставляются вместе со средой Arduino 0009) почти идентичны для плат Arduino Diecimila и Arduino NG (на которых стоит ATmega168). Оба загрузчика этих плат работают на скорости передачи данных 19200 бод, и занимают в памяти программ (FLASH) микроконтроллера ATmega168 область размером в 2 килобайта. Отличия могут быть только во времени, сколько загрузчик ждет поступления новой программы, и в количестве мерцаний светодиодом на порте 13 Arduino (pin 13 LED), когда загрузчик запускается. Из-за автоматического сброса плат Arduino Diecimila загрузчик ждет очень малое время (меньше секунды), и для экономии времени также только один раз мигает светодиодом на порте 13. Загрузчик Arduino NG ждет примерно 6-8 секунд (потому что плата сбрасывается вручную при загрузке) и мигает светодиодом 3 раза при старте загрузчика.
Загрузчик платы Arduino BT делает некоторую первоначальную конфигурацию модуля Bluetooth.
Загрузчик ATmega8 занимает объем всего лишь 1 килобайт памяти программ (flash). Он также не использует таймаут при приеме неправильных данных, поэтому Вам нужно убедиться, что в плату Arduino на основе ATmega8 не отправляется никаких данных в течение 6..8 секунд, пока активен загрузчик.
Некоторые древние версии загрузчика работают на скорости 9600 бод (вместо 19200). Такая скорость удобна для плат, у которых нет кварцевого резонатора для стабилизации тактовой частоты микроконтроллера. Чтобы код скетча успешно загружался в таких условиях, нужно поменять параметр serial.download_rate в файле настроек (preferences file) на 9600.
Продвинутый загрузчик, поставляемый с Arduino-совместимыми платами Wulfden Freeduino Kits. Его код основан на коде загрузчика Arduino UART. «Lady Ada», Limor Fried из Adafruit Industries, сделала множество исправлений и добавлений в код загрузчика с целью получения универсальности (код загрузчика работает в любой версии Arduino IDE, скетчи запускаются сразу после включения питания, скетчи запускаются сразу после загрузки). Последние ревизии Brian Riley унифицировали исходный код для микроконтроллеров ATmega168, ATmega328 и ATmega644, так что получился один файл исходного кода и один файл makefile. Добавлено мигание светодиодом pin 13 LED, показывающее процесс загрузки. Этот загрузчик можно использовать на старых, новых (и самостоятельно изготовленных) платах, как оборудованных, так и не оборудованных функцией автосброса (со средой разработки Arduino-0009 и платами Arduino Diecimilia).
Подробную информацию по различным загрузчикам см. в таблицах 4, 5, 6 (врезка «На что нужно обратить внимание при программировании загрузчика»), и 7 (раздел «Исходный код загрузчиков Arduino»).
Чтобы записать загрузчик, Вам обязательно нужен внешний ISP-программатор [5]. Программатор подключается к программируемой платой Arduino через 6-выводный коннектор ISP [8], который обычно всегда установлен на плате Arduino. При подключении коннектора убедитесь, что он ориентирован правильным образом. Некоторые платы наподобие Arduino Mini требуют самостоятельного подключения коннектора проводами к контактам платы. Если есть сомнения при подключении, то обратитесь к схеме платы и её описанию.
Частота кварцевого резонатора. Обязательно убедитесь, что прошиваемый Вами загрузчик точно соответствует рабочей частоте системы. Рабочая частота микроконтроллера обычно зависит от конфигурации фьюзов и от частоты внешнего кварцевого или керамического резонатора (чаще всего применяют кварцевые резонаторы на 8 или 16 МГц, но могут быть и другие варианты).
Если Вы неправильно прошьете фьюзы BOOTSZ1, BOOTSZ0, BOOTRST, то код загрузчика не будет запускаться, и загрузчик работать не будет. Точно также если Вы неправильно сконфигурируете фьюзами тактовый генератор и прескалер, то микроконтроллер может заработать на той частоте, на которую загрузчик не рассчитан, и работоспособность загрузчика также будет нарушена. Для вычисления правильного значения фьюзов Вам поможет калькулятор фьюзов [10].
В таблице я привел самые популярные загрузчики и конфигурации для них. Фьюзы указаны в шестнадцатеричном значении, где HFUSE это старший байт фьюзов, LFUSE младший байт фьюзов, EFUSE байт расширенных фьюзов.
Таблица 4. Загрузчики Arduino UART.
AVR | Тактовая частота | Прошивка | Размер секции загрузки, байт | Фьюзы (HEX) |
ATmega8 | 8 | ArduinoBOOT-mega8-8MHz.hex | 1024 | HFUSE=CA LFUSE=DF |
16 | ArduinoBOOT-mega8-16MHz.hex | |||
ATmega168 | 8 | ArduinoBOOT-mega168-8MHz.hex | 2048 | HFUSE=DD LFUSE=E2 EFUSE=00 |
16 | ArduinoBOOT-mega168-16MHz.hex | |||
ATmega328 | 8 | ArduinoBOOT-mega328-8MHz.hex | 2048 | HFUSE=DA LFUSE=FF EFUSE=05 |
16 | ArduinoBOOT-mega328-16MHz.hex | 2048 |
Прошивки загрузчиков Arduino можно найти в папке, где установлена система разработки Arduino, обычно это папка с полным путем наподобие c:\Program Files\Arduino1.0.6\hardware\arduino\bootloaders. Там же можно найти исходный код загрузчиков. Также готовые прошивки и исходный код всех загрузчиков можете скачать по ссылке [9], см. папку arduino\bootloaders\HEX архива, и ищите там имена файлов прошивок, указанные в таблицах 4, 5, 6 (имя файла прошивки указано в столбце Прошивка).
Таблица 5. Загрузчики Atmel DFU.
AVR | Тактовая частота | Прошивка | Размер секции загрузки, байт | Фьюзы (HEX) |
ATmega32U4 | 8 | BootloaderDFU-mega32u4-8MHz.hex | 4096 | HFUSE=D8 LFUSE=DE EFUSE=F3 |
16 | BootloaderDFU-mega32u4-16MHz.hex |
Таблица 6. Загрузчики USBasp.
AVR | Тактовая частота | Прошивка | Размер секции загрузки, байт | Фьюзы (HEX) |
ATmega168 | 12 | USBaspLoader-mega168-12MHz.hex | 2048 | HFUSE=D6 LFUSE=DF EFUSE=00 |
16 | USBaspLoader-mega168-16MHz.hex | |||
20 | USBaspLoader-mega168-20MHz.hex | |||
ATmega328 | 12 | USBaspLoader-mega328-12MHz.hex | HFUSE=DA LFUSE=F7 EFUSE=03 | |
16 | USBaspLoader-mega328-16MHz.hex | |||
20 | USBaspLoader-mega328-20MHz.hex |
Примечание: если у Вас есть программатор ISP [5], то Вы можете настроить среду разработки Arduino так, чтобы использовать для загрузки именно программатор, а не bootloader. Достоинство такого метода загрузки в том, что Вы можете полностью задействовать всю доступную память программ (FLASH) микроконтроллера (потому что загрузчик уже не используется, и его область памяти программ свободна для использования).
Микроконтроллер Arduino сконфигурирован фьюзами так, чтобы при запуске системы (включение питания, сброс) управление всегда получал загрузчик. Затем загрузчик некоторое время ждет (1..2 секунды) загрузки программы пользователя, и если загрузка не началась, то запускает программу пользователя (передает управление на адрес 0). Таким образом, всегда можно при желании перезаписать программу пользователя, и тем самым обновить или полностью изменить функционал устройства. Код загрузчика при этом остается нетронутым.
Условие запуска загрузчика. Есть загрузчики, которые сразу передают управление в программу пользователя (без задержки), если не выполнено условие загрузки. Это иногда делается для того, чтобы ускорить запуск программы пользователя. Условие загрузки может быть разным, но чаще всего это перемычка, замыкающая на землю определенный (известный заранее пользователю) вывод микроконтроллера. Если перемычка установлена, то условие загрузки выполняется, и загрузчик ждет начала загрузки, не передавая управление в программу пользователя.
[Готовые прошивки загрузчика Arduino]
См. архив по ссылке [9] и таблицы 4, 5, 6 во врезке «На что нужно обратить внимание при программировании загрузчика».
[Исходный код загрузчиков Arduino]
AVR bootloader: https://github.com/arduino/Arduino/tree/master/hardware/arduino/avr/bootloaders
SAMD bootloader: https://github.com/arduino/ArduinoCore-samd/tree/master/bootloaders/zero
В таблице я привел описание самых популярных загрузчиков, которые используются в Arduino-совместимых платах. Исходный код загрузчиков вместе с готовыми прошивками также можно скачать по ссылке [9].
Таблица 7. Разновидности загрузчиков, которые можно использовать для платформы разработки Arduino.
Название | AVR | Описание |
Arduino UART | ATmega8, ATmega168, ATmega328 и другие | Используется для большинства плат Arduino, когда код загружается через мост USB-UART. |
Atmel DFU | ATmega32U4 и другие | Применяется для случаев, когда микроконтроллер AVR имеет на борту аппаратный интерфейс USB. Загрузчик основан на протоколе Atmel DFU Flip и открытой библиотеке LUFA. |
USBasp | ATmega168, ATmega328 | Применяется для плат metaboard. Загрузчик основан на открытой библиотеке V-USB, эмулирует поведение популярного программатора USBasp. |
Компилируется загрузчик командами утилиты make. Обычно для этого нужно зайти в каталог с исходным кодом загрузчика, и выполнить 2 команды:
Инструкции по компиляции и настраиваемым опциям можно обычно получить, изучая содержимое файла Makefile проекта загрузчика, и сопутствующие файлы документации readme.txt.
Процесс получения прошивки загрузчика состоит из предварительного конфигурирования Makefile, где настраиваются опции (если это необходимо) и последующей компиляции командами make clean и make. Конечно же, для компиляции у Вас должен быть установлен тулчейн (компилятор AVR GCC и библиотеки). На операционной системе Windows тулчейн можно получить, если установить пакет разработки WinAVR или Atmel Studio.
Когда нужно получить загрузчик для Arduino, то чаще всего (в зависимости от типа платы или Вашей конструкции) это микроконтроллер ATmega328, или реже ATmega168, ATmega8, ATmega32U4. Поэтому сначала нужно выбрать, какой загрузчик использовать. Почти все загрузчики можно найти в папке установки Arduino c:\Program Files\Arduino1.0.6\hardware\arduino\bootloaders, распределенные по подкаталогам atmega8, atmega и другим.
Выбор загрузчика. Если Вам нужен загрузчик для ATmega8, то его исходный код и Makefile находится в папке atmega8. Если нужен загрузчик для ATmega168 или ATmega328, то см. папку atmega. Если нужен загрузчик для ATmega32U4, то его можно найти в библиотеке LUFA, см. папку Bootloaders\DFU.
Примечание: исходный код и прошивки загрузчиков можно скачать по ссылке [9].
Конфигурирование загрузчика для ATmega8. Зайдите в папку atmega8, и откройте текстовым редактором файл Makefile. Вам нужно проверить следующие опции:
• DIRAVR. Эта опции указывают на каталог установки тулчейна (в этом каталоге находится папка bin с исполняемыми файлами для компилятора и других утилит, и папка include для заголовочных файлов библиотек). Если у Вас установлен тулчейн WinAVR, то значение этой опции должно быть наподобие c:\WinAVR-20100110\avr. Если у Вас установлен тулчейн в составе Atmel Studio, то значение этой опции должно быть наподобие «c:\Program Files\Atmel\AVR Tools\AVR Toolchain» (должны быть кавычки, потому что в составе пути есть пробелы).
• DEFS. В этой опции указана тактовая частота системы через значение макропеременной F_CPU. Например, если указана опция:
Примечание: важно указать правильную тактовую частоту потому, что к этому значению привязана настройка последовательного порта UART, через который загрузчик получает код от хоста (из системы разработки Arduino IDE с помощью вызова утилиты программирования AVRDUDE). Неправильная настройка UART приведет к тому, что загрузчик не сможет получить код программы пользователя, и микроконтроллер не будет перепрошиваться через загрузчик.
На этом конфигурирование загрузчика можно считать законченным. Для получения прошивки загрузчика осталось выполнить последовательность из двух команд:
После компиляции получится файл ATmegaBOOT.hex, который можно с помощью программатора ISP записать в память микроконтроллера ATmega8. Не забудьте после программирования загрузчика правильно установить фьюзы микроконтроллера (см. таблицу 4).
Конфигурирование загрузчика для ATmega168 или ATmega328. Зайдите в папку atmega, и откройте текстовым редактором файл Makefile. Здесь все устроено несколько сложнее, потому что этот Makefile универсальный, он предназначен для получения прошивок для множества различных плат Arduino:
Таблица 8. Выбор цели (target) в Makefile для ATmegaXX8.
Плата Arduino | Target |
Arduino LilyPad | lilypad |
Arduino Pro или Arduino Pro Mini | pro8, pro16 или pro20 в зависимости от используемой тактовой частоты |
Arduino Diecimila | diecimila |
Arduino NG | ng |
Своя плата на ATmega328 | atmega328 |
Arduino Pro на ATmega328P без кварца | atmega328_pro8 |
Arduino Mega | mega |
Примечание: цель Target, указанная в таблице, подставляется как опция команды make при компиляции прошивки:
Первое, что Вам нужно сделать, это выбрать цель для компиляции (вариант из столбца Target таблицы 6) в зависимости от платы, которая у Вас используется. Предположим, что у Вас самодельная плата на микроконтроллере ATmega328, для которой Вы собираетесь сделать свой загрузчик. Тогда цель для компиляции у Вас будет atmega328, прошивка получается выполнением 2 команд:
Если у Вас используется другая тактовая частота, то проверьте значение макропеременной AVR_FREQ (по умолчанию для цели atmega328 задана тактовая частота 16 МГц: AVR_FREQ = 16000000L). После компиляции получите прошивку ATmegaBOOT_168_atmega328.hex, которую можно записать в память Вашего микроконтроллера с помощью программатора ISP. Внимание, не забудьте также правильно установить фьюзы микроконтроллера (см. таблицу 4).
Переходник USB TTL COM-port (он подключается с одной стороны к 6-pin коннектору FTDI, а с другой стороны к компьютеру по USB) можно купить готовый. Обычно такой переходник сделан по простейшей схеме на основе чипа FT232 (компания FTDI) или CP210x (компания Silicon Labs). Драйвер для переходника можно скачать с сайта соответствующей компании. Хорошие переходники USB to TTL Serial Cable FTDI (или на чипе CP210x) можно купить на eBay, dealextreme или aliexpress, есть даже предложения с бесплатной доставкой. При покупке выбирайте 5V версию (иногда бывают версии на 3.3V). Самый лучший вариант – когда можно выбрать перемычкой рабочие уровни порта TTL RS-232 (3.3V или 5V). Если уровни сигналов на переходнике USB to TTL и отлаживаемом устройстве не совпадают, то понадобятся последовательно включенные резисторы номиналом около 1…2 кОм.
[Ссылки]
Комментарии
Можете подсказать где почитать информацию если решили заливать прошивку не через среду Arduino IDE а через свое Windows приложение используя bootloader Arduino?
microsin: ответить на этот вопрос коротко невозможно, потому что существует множество способов организации загрузки, в зависимости от версии загрузчика и используемого микроконтроллер а. Общий принцип следующий: у загрузчика Arduino имеется стандартный, открытый протокол (UART, STK, DFU, USBasp), поддерживаемый утилитами перепрошивки, такими как AVRdude, dfu-programmer.exe и т. п. В среде Arduino как раз такие утилиты и используются. Вам нужно узнать, какой протокол использует Ваш загрузчик, и в зависимости от этого подобрать к нему утилиту командной строки для поддержки загрузки. Или перепрошить загрузчик на тот, который нужен. Если информации в этой статье недостаточно, то поищите информацию по протоколу загрузчика, посмотрите информацию о протоколе в исходном коде загрузчика. Попробуйте прогуглить arduino bootloader command line utility.
ПРОГРАММАТОР у Arduino на борту! Я, как и Sergey, не понимаю, почему бортовой программатор не подключили по SPI (а подключили по UART), тогда можно было бы обойтись без загрузчика.
Теперь берём плату Arudino Uno, например. На ней для связи по USB установлен микроконтроллер AVR’овский, наверняка где-то такой же, как в программаторе. Но при этом для прошивки платы Arduino Uno еще нужен вдруг bootloader для самопрограммиро вания контроллера. Но зачем? Почему? Ведь только что мы прошивали контроллер программатором без всякого bootloader’а. Интерфейсная м/с на Arduino Uno не такая, как программатор? Но опять же не понятно зачем и почему? Вот что никак не могу понять.
microsin: нечего тут особенно понимать. Плата Arduino и вся её платформа (в том числе и bootloader применен для той же цели, и дополнительная микросхема) спроектирована таким образом, чтобы пользователь мог сразу, из коробки, программировать AVR-микроконтроллер БЕЗ ПРОГРАММАТОРА. Имея только USB и компьютер.