Как сделать загрузчик arduino

Digitrode

цифровая электроника вычислительная техника встраиваемые системы

Что такое загрузчик Arduino и как он работает?

Почти все микроконтроллерные (и микропроцессорные) системы используют некоторую форму загрузчика. Часто называемый прошивкой, что ошибочно, в Arduino также имеется загрузчик. Так как это довольно популярная платформа, давайте использовать ее в качестве обобщенного примера всех загрузчиков. Давайте поговорим о том, что делает загрузчик и как он работает.

Как сделать загрузчик arduino. Смотреть фото Как сделать загрузчик arduino. Смотреть картинку Как сделать загрузчик arduino. Картинка про Как сделать загрузчик 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, очень легко. Загрузчики не идеальны и требуют некоторых ресурсов, которые могут потребоваться для вашего проекта. Однако такие компромиссы обычно стоят того.

Источник

Про Ардуино и не только

четверг, 19 июля 2018 г.

Как сделать загрузчик arduino. Смотреть фото Как сделать загрузчик arduino. Смотреть картинку Как сделать загрузчик arduino. Картинка про Как сделать загрузчик arduino. Фото Как сделать загрузчик arduino

Есть у меня пара идей для будущих публикаций, но в них будет использоваться программатор. Поэтому сегодня я расскажу о том, как превратить Ардуино в ISP программатор, для чего он нужен и как им пользоваться. А в качестве примера будет описана процедура прошивки загрузчика в Ардуино.

Что такое ISP?

ISP (In-System Programming) расшифровывается как внутрисхемное программирование. Это технология, которая позволяет программировать микроконтроллер, установленный в устройство. До появления этой технологии микроконтроллеры программировались перед установкой в устройство, а для их перепрограммирования требовалось их извлечение из устройства.

Существует 2 основных подхода внутрисхемного программирования:

Использование загрузчика существенно упрощает процесс перепрограммирования микроконтроллера, что особенно полезно при отладке. Но за удобство приходится платить. Во-первых, загрузчик занимает часть ПЗУ и для программы пользователя остается меньший объем памяти. Во-вторых, загрузчик не может изменить Fuse-биты и Lock-биты (в отличие от программаторов). Ну и, конечно, не обойтись без программатора, если вы хотите обновить бутлоадер или загрузить его в чистый МК. Таким образом существует ряд задач, которые могут быть выполнены только с использованием программатора. Если же у вас нет аппаратного программатора, то вместо него можно воспользоваться Ардуино, о чем и будет рассказано дальше.

Arduino as ISP. Прошивка загрузчика в Ардуино.

Итак, мы решили превратить Ардуино в программатор. Для примера попробуем прошить загрузчик в целевую плату Ардуино. Сначала подготовим плату, которую будем использовать в качестве программатора. Для этого загрузим в нее скетч ArduinoISP, его можно найти в стандартных примерах:

Как сделать загрузчик arduino. Смотреть фото Как сделать загрузчик arduino. Смотреть картинку Как сделать загрузчик arduino. Картинка про Как сделать загрузчик arduino. Фото Как сделать загрузчик arduino

Если мы работаем с двумя платами Arduino Uno, то схема их подключения может выглядеть следующим образом:

Как сделать загрузчик arduino. Смотреть фото Как сделать загрузчик arduino. Смотреть картинку Как сделать загрузчик arduino. Картинка про Как сделать загрузчик arduino. Фото Как сделать загрузчик arduino

Если используются не Uno, а другие платы Ардуино, то перед подключением программатора к целевой плате необходимо уточнить расположение на них выводов MOSI, MISO и SCK. Их расположение для различных плат приведено ниже в таблице. Как вы можете видеть, не на всех платах Ардуино линии SPI мультиплексированны с цифровыми выводами, поэтому для подключения к данному интерфейсу необходимо использовать разъем ICSP. Ниже показан пример подключения Uno в качестве программатора к плате Nano через ICSP разъем.

Плата АрдуиноMOSIMISOSCKУровень
Uno, Duemilanove11 или ICSP-412 или ICSP-113 или ICSP-3
Nano11 или ICSP-412 или ICSP-113 или ICSP-3
Pro Mini1112133.3В или 5В
Mega1280, Mega256051 или ICSP-450 или ICSP-152 или ICSP-3
LeonardoICSP-4ICSP-1ICSP-3
DueICSP-4ICSP-1ICSP-33.3В
ZeroICSP-4ICSP-1ICSP-33.3В
10111 или ICSP-412 или ICSP-113 или ICSP-33.3В

Обратите внимание на нумерацию выводов ICSP платы Nano: она начинается с правого нижнего угла. Поэтому на приведенной схеме Arduino Nano перевернута.

Теперь необходимо вернуться в Arduino IDE и изменить в ней параметры:

Резюмируя вышеописанное, выделим основные шаги для прошивки загрузчика с использованием Ардуино в качестве ISP программатора:

Прошивка скетча с использованием Arduino as 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-TTLArduino
DTRDTR
RXTX
TXRX
GNDGND
VCC/5V/3.3VVCC

Как сделать загрузчик arduino. Смотреть фото Как сделать загрузчик arduino. Смотреть картинку Как сделать загрузчик arduino. Картинка про Как сделать загрузчик arduino. Фото Как сделать загрузчик arduino

Китайцы выпускают USB-TTL модули в широком ассортименте, но в целом они все одинаковые по своей сути. Ссылка на результат поиска на aliexpress, и ссылка на все USB-TTL в моём любимом магазине WAVGAT. Что использую я? В основном платку на CP2102. Перед заказом модуля обязательно убедитесь в том, что у него есть выход DTR, иначе этот модуль можно будет использовать только для “общения” с контроллером через COM порт.

Как сделать загрузчик arduino. Смотреть фото Как сделать загрузчик arduino. Смотреть картинку Как сделать загрузчик arduino. Картинка про Как сделать загрузчик arduino. Фото Как сделать загрузчик arduino

Для работы с таким преобразователем нужно установить драйвер для чипа, на базе которого собран модуль, это может быть 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:

Как сделать загрузчик arduino. Смотреть фото Как сделать загрузчик arduino. Смотреть картинку Как сделать загрузчик arduino. Картинка про Как сделать загрузчик arduino. Фото Как сделать загрузчик arduino

Важный момент: в AVR биты у нас инверсные, то есть 1 это выкл, 0 это вкл. Расставляя галочки в калькуляторе, мы формируем байт, галочка стоит – бит включен, но в результирующем байте включенные биты являются нулями. Об этом стоит задумываться при ручном составлении фьюз-байта, при использовании калькулятора можете об этом даже не вспоминать.

Что позволяют настроить биты?

* – прошивка возможна при помощи высоковольтного программатора

Лок-биты (Pro)

Лок-биты (lock-bits) позволяют управлять доступом к памяти микроконтроллера, что обычно используется для защиты устройства от копирования. Лок-биты собраны опять же в конфигурационный лок-байт, который содержит: BOOTLOCK01, BOOTLOCK02, BOOTLOCK11, BOOTLOCK12, LOCKBIT1, LOCKBIT2 (для ATmega328). Калькулятор лок-битов можно использовать этот.

BOOTLOCK биты позволяют запретить самому МК запись (самопрограммирование) во flash память (область программы и область загрузчика)Как сделать загрузчик arduino. Смотреть фото Как сделать загрузчик arduino. Смотреть картинку Как сделать загрузчик arduino. Картинка про Как сделать загрузчик arduino. Фото Как сделать загрузчик arduinoА вот локбиты LOCKBIT позволяют запретить запись и чтение flash и EEPROM памяти извне, при помощи программатора, т.е. полностью защитить прошивку от скачивания и копирования:Как сделать загрузчик arduino. Смотреть фото Как сделать загрузчик arduino. Смотреть картинку Как сделать загрузчик arduino. Картинка про Как сделать загрузчик arduino. Фото Как сделать загрузчик arduinoТаким образом включив LOCKBIT1 (лок-байт будет 0x3E) мы запретим внешнюю запись во Flash и EEPROM память, т.е. при помощи ISP программатора, а включив LOCKBIT1 и LOCKBIT2 (лок-байт: 0x3C) полностью заблокируем заодно и чтение данных из памяти микроконтроллера. Повторюсь, всё описанное выше относится к ATmega328p, для других моделей МК читайте в соответствующих даташитах.

ISP программатор

USBasp

Дешёвые ISP программаторы также есть в ассортименте у китайцев, рекомендую брать USBasp как самый распространенный. Поискать на алиэкспресс, мне нравится версия в корпусе. USBasp имеет не очень удобный выход 10-пин на шлейфе, поэтому рекомендуется купить также переходник 10-пин на 6-пин, который позволяет сразу подключаться к ISP header’у, который есть на большинстве плат Arduino. Внимание! Очень часто встречается брак в виде непропая контактов, поэтому во избежание проблем рекомендуется пропаять переходник и отмыть флюс (зубная щётка + бензин калоша).Как сделать загрузчик arduino. Смотреть фото Как сделать загрузчик arduino. Смотреть картинку Как сделать загрузчик arduino. Картинка про Как сделать загрузчик arduino. Фото Как сделать загрузчик 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:

Как сделать загрузчик arduino. Смотреть фото Как сделать загрузчик arduino. Смотреть картинку Как сделать загрузчик arduino. Картинка про Как сделать загрузчик arduino. Фото Как сделать загрузчик arduino

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 (главное не запутаться, для какой выбранной конфигурации платы делается изменение) и прошить в МК, нажав Инструменты > Записать загрузчик.

Как сделать загрузчик arduino. Смотреть фото Как сделать загрузчик arduino. Смотреть картинку Как сделать загрузчик arduino. Картинка про Как сделать загрузчик arduino. Фото Как сделать загрузчик arduino

Такая работа с фьюзами максимально неудобна, но есть и другие варианты:

Avrdudeprog

Как сделать загрузчик arduino. Смотреть фото Как сделать загрузчик arduino. Смотреть картинку Как сделать загрузчик arduino. Картинка про Как сделать загрузчик arduino. Фото Как сделать загрузчик arduino

Видео


Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *