Bootloader usb что это

Обновлено: 07.07.2024

Ой как давно уже замучила меня необходимость каждый раз при малейшем изменении управляющей программы вынимать процессор из платы устройства, доставать с полки программатор, подключать это все к компьютеру, перешивать код, и затем снова возвращать процессор назад в устройство. А ведь это еще и не весь список "проблем" - можно и ножки у процессора погнуть, а то и сам процессор наоборот вставить (если был не внимателен). Короче - сплошной "напряг", не для нас, лентяев, всё это.

Вариантов для "ублажения" моего лентяйства умные люди уже напридумали задолго до меня. Оставалось определиться с выбором и реализовать. Из предлагавшихся для выбора вариантов было: (А) разъем для внутрисхемного програмирования и (Б) бутлоадер. Первое - по сути - тот же программатор, только что процессор из платы устройства дергать не нужно. А вот второе - это уже целый интерфейс к ПК плюс небольшая програмка, живущая внутри процессора, и позволяющая "перепрошить" его основную программу. Звучит куда заманчивей! Не правда ли? Итак, первый шажок в "лабиринте выбора" сделан - бутлоадер!

Второй шаг - выбор интерфейса связи с ПК. При програмировании ПИК-контроллеров данные в них подаются в последовательном виде, следовательно и интерфейс должен быть последовательным. Вспомним-ка теперь - а какие последовательные интерфейсы торчат наружу из наших ПК? Да не так уж и много вариантов-то - COM (RS-232), FireWire (IEC-1394) или же USB. Если учесть, что (А) первому уже лет практически столько-же, сколько и самому термину "персональный компьютер", и он постепенно "уходит от нас", а (Б) второй - пока еще большая экзотика, то выбор мной третьего из них (USB) становится вполне очевиден.

Последний шаг - выбор самого ПИК-контроллера. Варианты: (А) выбрать контроллер "на свой вкус" и писать бутлоадер самостоятельно, или же (Б) использовать уже готовые вещи, но тогда - придется смириться с тем, что контроллер за нас уже выбрал тот, кто делал этот самый бутлоадер. Написать такую штуку как бутлоадер самому, да еще и такой, чтобы он "общался" с компьютером по шине USB - это еще и уметь нужно. А для таких лентяев, как я, инженеры ф. Microchip уже выполнили всё необходимое, и остается лишь с вот этой страницы выкачать файлик [F1] (размером 3,07 МБ). На всякий случай (а то у Microchip-а периодически меняется вся "карта сайта") копию этого файла я сложил и в своей "файловой свалке" [F2] - а Вы можете "качать" с любой из этих ссылок. Нюанс состоит в том, что абсолютно всё software, имеющееся в указанном файле, рассчитано на использование микроконтроллеров ТОЛЬКО серии PIC18F2455/2550/4455/4550 и никаких других. Таким образом, увы, но этот выбор уже сделали за нас (по крайней мере, речь про ленивую "половину" населения).

Итак, подведем предварительный итог. Результирующая "железяка" будет:

  1. выполнена на процессоре PIC18F2455/2550/4455/4550 (любом из них);
  2. в процессор будет прописан нестираемый бутлоадер;
  3. связь с компьютером будет осуществляться по шине USB.

Ну что ж, поехали.

«Железо»

С одной стороны, есть народная пословица: "В чужой монастырь со своим уставом не ходят". С другой - любая конструкция на (микро)процессоре - это т.н. "аппаратно-програмный модуль". И коль уж взял я готовую программу (в данном случае - прошивку), то и в аппаратной части необходимо повторить устройство, которому она была предназначена. Точнее, достаточно будет повторить не всё устройство, а лишь те его узлы, без которых эта прошивка работать не будет. "Подручной книгой", подлежащей анализу на тему того, какой будет необходимая "обвеска" процессора, является "Руководство пользователя к демонстрационной плате PICDEM™ FS USB" [D1], т.к. именно ее прошивку я и использовал. В данной книге в первую очередь нужно прочесть раздел "3.5 BOOTLOAD MODE" (стр. 24), одновременно поглядывая на принципиальную схему самого модуля PICDEM™ FS USB, напечатанную там же на стр. 54-56. Что нам дает этот анализ? Пройдемся по пунктикам.

"To start using the application, press and hold S2 while resetting the board (pressing and releasing S1). The entry condition on the PICDEM FS USB board and the provided firmware is determined by the status of the switch button S2, which is checked once after each reset. If the button is held down during a Reset, the microcontroller enters the bootload mode. "

"Для запуска приложения (в данном случае - бутлоадера), сбросьте устройство (нажав и отпустив кнопку S1), при этом удерживая нажатой кнопку S2. Начальное состояние платы PICDEM FS USB и выполняемая ей программа определяются состоянием кнопки S2, которое однократно проверяется сразу же после сброса. Если во время сброса кнопка S2 была нажата, то процессор входит в режим бутлоадера. "

Вот Вам и первый вынужденный элемент схемы - кнопка S2. Посмотрим, что она делает. Согласно схеме из [D1] (рис. A-2 на стр. 54) она закорачивает на "землю" вывод RB4 процессора. Все остальное время, пока кнопка S2 не нажата, резистор R13 "подтягивает" этот вывод к плюсу питания. Резистор R17 - защитный, он нужен, чтобы случайно не сжечь вывод процессора (при инициализации после сброса порт В настроен на выход). Таким образом, получается, что условием вхождения процессора в режим бутлоадера является факт наличия уровня логического "нуля" на выводе RB4 в момент сброса. Но, просто "посадить" вывод RB4 на землю нельзя - тогда при каждом включении процессор будет входить в режим загрузки новой программы (бутлоадер). Нам такое ни к чему - процессор при "нормальном" включении должен попадать в ОСНОВНУЮ рабочую программу. А вот в режим бутлоадера он должен попадать лишь только тогда, когда мы его об этом попросим. Не мудрствуя лукаво, установим в нашу схему такую же кнопку S2. А сигнал сброса мы сформируем банальной RC-цепью (при подаче питания) или же впишем в программу.

Следующий элемент, который нам придется поставить, это резистор R15 согласно все той же схемы из [D1] (рис. A-2 на стр. 54). Через этот резистор на вывод RA1 подается сигнал USB_ATTACH, сообщающий процессору, что он подключен к шине USB. Управляющая программа проверяет наличие этого сигнала перед началом обмена данными по USB.

Также, необходимым элементом является конденсатор С14 (согласно схемы рис. A-2 на стр. 54 из [D1]). Это фильтрующий кондесатор встроенного в процессор стабилизатора напряжения питания для USB-модуля.

Понадобится процессору и цепь сброса при подаче питания - резистор R10 и конденсатор C9 (см. рис. A-2 на стр. 54 в [D1]). Только мы немного упростим "путь прохождения" сигнала сброса на процессор - не будем ставить резистор R12 и джампер JP1. При этом, сигнал с точки соединения R10 и C9 мы подадим непосредственно на вывод MCLR ПИК-а. Ну и само собой разумеется, что процессору необходимо установить внешние цепи тактового генератора - кварцевый резонатор Y1 на частоту 20 МГц (почему - читайте ниже), резистор R11 и конденсаторы C7 и C8 (согласно схемы рис. A-2 на стр. 54 из [D1]). А также, и сам разъем, в который мы будем подключать кабель от компьютера (USB, тип В), обозначенный на схеме рис. A-3 на стр. 55 из [D1] как J1. И парочку дросселей (L1 и L2 с той же схемы) впридачу - зачем нам лишние помехи.

В итоге наша схема (сохранена нумерация элементов, приведенная выше) будет выглядеть как показано на рисунке 1. Следует только учесть, что это не готовое устройство (мы ведь еще даже не задумывались над тем, что это будет), а лишь самый необходимый минимум.


Рис. 1 — Минимально необходимая "обвеска" PIC18F4550 для работы с бутлоадером
(. исправлено подключение резистора R15 - 5.05.2006)

И еще одно обстоятельство, с которым придется считаться, используя данный бутлоадер. Это - биты конфигурации процессора. Являясь по сути "програмной" частью, фактмчески они определяют аппаратные режимы работы процессора. Почитаем, что по этому поводу сказано в "Руководстве пользователя к демонстрационной плате PICDEM™ FS USB" [D1]:

"The PIC18F4550 microcontroller for the PICDEM FS USB board has a specific configuration setting that is necessary for the bootload program to function. The USB Voltage Regulator and device oscillator settings are both critical, and cannot be changed. Other settings, such as code protection, WDT and LVP, are less critical but may cause irreversible side effects. "

"Микроконтроллер PIC18F4550 в плате PICDEM FS USB имеет определенные значения битов конфигурации, требующиеся для функционирования программы бутлоадера. Значения битов, определяющих установки кварцевого резонатора а таже внутреннего стабилизатора питания для USB являются критическими, их менять нельзя. Другие параметры, такие как защита кода, "сторожевой таймер", "низковольтное программирование" менее критичны, но могут привести к нежелательным побочным эффектам. "

Прописанные в данном бутлоадере биты конфигурации и соответствующие значения определяемых ими параметров приведены в таблице:

Почти все микроконтроллеры серии Mega с памятью от 8КБ могут прошиваться через бутлоадер. Фишка удобная и применяется довольно часто, однако подробного мануала как работать с бутлоадером на AVR я в свое время не нашел и пришлось разбираться самостоятельно. С той поры мало что изменилось. Пора бы дать подробное описание как выбрать, скомпилировать, прошить и в дальнейшем использовать bootloader для AVR.

Ликбез
Что же это такое бут и с чем его едят. BootLoader это всего лишь небольшая программка которая сидит в специальной области памяти микроконтроллера и слушает какой-либо интерфейс. Обычно это UART, но бывает и SPI, USB и даже SoftUSB бутлоадеры.

Если разрешающего условия при старте нет, то бут завершает свою работу и передает управление основной программе.

Мало того, с помощью бута можно сильно облегчить обслуживание коммерческих устройств. Например, такая простая вещь как обновление прошивки, которую поддерживает масса девайсов вроде плееров или сотовых телефонов и которую делает обычный юзер. Выходит прошивка доступна и конкурентам? А вот фигу! Она шифрованая, а бутлоадер содержит ключ для ее дешифровки, дешифрует на лету и заливает во флеш. Красота, правда?

Bootloader в AVR
Что происходит при старте контроллера? В нормальном состоянии процессор начинает по одной выполнять инструкции из памяти программ, начиная с нулевого адреса. Вот так это примерно выглядит в ATmega16, в других все аналогично, только адреса другие.

Но если активировать Fuse бит BOOTRST то процессор будет стартовать не с нулевого адреса, а с адреса начала Boot сектора. Этот сектор расположен в самом конце памяти программ и его размер задается FUSE битами BOOTSZх.

Вот как, например, выглядит таблица соответствия битов BOOTSZх и размера загрузочной области для ATMega16:

И сейчас я покажу тебе как юзать эту замечательную программулину.

Потом тебе нужны сорцы загрузчика. Можешь взять у у автора , но я рекомендую сдернуть все же у меня. У меня сразу же готовый проект для AVRStudio:

Жмешь финиш и имеешь пустой проект. Сохраняешь его и закрываешь.

Теперь находишь папку этого проекта и перекидываешь туда все исходники и хидеры из архива бутлоадера, в том числе и папочку, что там тусуется, перезаписывая свой пустой файл main.c

Осталось вновь открыть этот проект, но поскольку мы переписали main.c то он уже не будет пуст. Там будет дофига кода.

Во вкладке Build AVR Studio должно проскочить что то вроде:

Итак, вначале правим main.c
Первым делом твой взор должен воткнуться в строку с определнием F_CPU:

Это выбор порта инициализации и порта индикации. Оба этих пина совершенно опциональные.

Вначале выбираем свой проц:

Затем размер бутсектора

Первые две опции не катят, ибо бут в них не влезет. А вот 512 и 1024 вполне пригодны. Для начала поставь 512, если не влезет, то изменишь на 1024. Размер бутлоадера зависит от количества включеных фишек и опции запуска. Для Wait и Simple хватает и 512 слов.

Ниже можешь посмотреть адреса загрузочных секторов у разных микроконтроллеров. Если твоего нет в списке, то можешь его добавить по аналогии, прописав по даташиту числа. Не забыв добавить его строку и в записях что я приводил выше. Еще надо поковырять файл chipdef.h который идет в составе сорцев и добавить и там свой контроллер, точнее его инклюдник.

Если поковырять makefile еще ниже, то можно найти где прописываются пути к WinAVR

Это на случай если будут ошибки при компиляции.

Ок, загрузчик с включенными фичами входит в память. Так что все в порядке. Если у тебя с твоим набором функций не влезет в память, то придется выбирать бутсектор на 1024 слова и перекомпилировать все заново.

Осталось сделать страшное :) Выставить Fuse биты.

Во-первых надо активировать бит BOOTRST
Во-вторых выставить размер бут сектора в битах BOOTSZ1..0, для 512 на Mega16 это 01


З.Ы.
Народ, кто юзает/пишет загрузчики накидайте мне в комменты линков на то чем пользуетесь вы. А то я особо тему не рыл, нашел что удовлетворяло моим условиям и успокоился. Хотелось бы в статью еще добавить подборку линков на разные бутлоадеры под разные языки и компиляторы.

З.З.З.Ы.
Бутлоадером изначально прошиты все контроллеры AVR в моих демоплатах Pinboard

Спасибо. Вы потрясающие! Всего за месяц мы собрали нужную сумму в 500000 на хоккейную коробку для детского дома Аистенок. Из которых 125000+ было от вас, читателей EasyElectronics. Были даже переводы на 25000+ и просто поток платежей на 251 рубль. Это невероятно круто. Сейчас идет заключение договора и подготовка к строительству!

А я встрял на три года, как минимум, ежемесячной пахоты над статьями :)))))))))))) Спасибо вам за такой мощный пинок.

тут имеется ввиду немного другой принцип, то что вы описали называется старт-ап

Как вы помните из статьи, посвященной flash-памяти микроконтроллеров STM32, основная пользовательская программа начинается с первой страницы памяти, а точнее с адреса 0х08000000. То есть при подаче питания контроллер сразу же убегает по этому адресу.

Принцип работы bootloader.

Но именно hex-файл не совсем подходит для наших целей, поскольку помимо кода нашей программы он несет в себе дополнительную служебную информацию. Чтобы ее не обрабатывать и не вытаскивать из hex-файла нужный нам код, который bootloader должен записать во flash, мы в настройках компилятора во вкладке Output попросим его генерировать нам вместо hex-файла bin-файл.

Конечно, это сильно упрощенная версия загрузчика. Тут мы в вечном цикле пытаемся открыть файл с программой, а как только это нам удается (пользователь записал на карту долгожданный файл) bootloader программирует flash-память и перескакивает на адрес записанной им же программы. После этого контроллер начинает выполнять пользовательскую программу. Еще раз повторюсь, это всего лишь псевдокод для примера, полноценный bootloader для STM32 мы обязательно напишем в следующей статье!

И тут уже гораздо проще один раз подключить ST-Link и прошить загрузчик, а впоследствии просто скидывать новую версию основной программы на флешку и втыкать ее в готовое устройство, где перепрошивкой займется bootloader, чем по сто раз бегать от одной платы к другой, втыкать ST-Link, при этом перенося с собой ноутбук с ST-Link Utility 🙂 Как видите, польза загрузчика очевидна!

Вторая ситуация еще лучше это демонстрирует. Устройство уже выпущено и куча экземпляров распродана пользователям. Как бы хороша не была финальная версия программы никто не застрахован от неожиданного появления ошибок в процессе эксплуатации. И тут уже человек, купивший устройство, точно не сможет разобрать его, чтобы выполнить перепрошивку через программатор. То есть программу обновить просто нереально. Совсем другое дело, если изготовители предусмотрели встроенный bootloader. Пользователь может без проблем скинуть на карту памяти или на флешку скачанный бинарник и подключить карту/флешку к устройству. Изготовителю остается только выкладывать новые версии прошивок на своем сайте!

В общем, о пользе и применениях загрузчика можно говорить очень и очень долго 🙂 Помимо упомянутых возможностей обновления прошивки при помощи флешки или карты памяти, bootloader может использовать какой-нибудь из интерфейсов передачи данных, например SPI, I2C или USART.

Я, честно говоря, аппаратным загрузчиком предпочитаю не пользоваться по нескольким причинам.

Давайте на этом на сегодня и закончим, не пропустите статью, посвященную практической реализации загрузчика!


Загрузчик (bootloader)

Загрузчик живёт в самом конце Flash памяти МК и позволяет записывать прошивку, отправляемую через UART. Загрузчик стартует при подаче питания на МК, ждёт некоторое время (вдруг кто-то начнёт слать код прошивки по UART), затем передаёт управление основной программе. И так происходит каждый каждый раз при старте МК.

  • Загрузчик позволяет прошивать МК через UART;
  • Загрузчик замедляет запуск МК, т.к. при каждом запуске ждёт некоторое время для потенциальной загрузки прошивки;
  • Загрузчик занимает место во Flash памяти. Стандартный старый для Arduino NANO занимает около 2 кБ, что весьма существенно!
  • Именно загрузчик мигает светодиодом на 13 пине при включении, как индикация работы.

Программатор

Помимо записи прошивки во flash память, программатор позволяет:

  • Считывать содержимое Flash памяти (скачать прошивку на компьютер)
  • Полностью очищать чип от всех данных и настроек
  • Записывать и читать загрузчик
  • Считывать/записывать EEPROM память
  • Читать и настраивать фьюзы (fuses, fuse-bits) и лок биты.

USB-TTL (UART)

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:


Лок-биты (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


Решение проблем

Решение большинства проблем с загрузкой через программатор (независимо от того, что написано в логе ошибки):

  • Вытащить и обратно вставить usbasp в usb порт
  • Вставить в другой usb порт
  • Переустановить драйвер на usbasp
  • Проверить качество соединения USBasp с МК
  • Перепаять переходник и отмыть флюс

Для прошивки микроконтроллера, тактирующегося низкой частотой (менее 1 МГц внутренний клок):

Основные ошибки в логе Arduino IDE

Arduino as ISP

Почти любая другая плата Arduino может стать ISP программатором, для этого нужно просто загрузить в неё скетч ArduinoISP:

  • Открыть скетч Файл > Примеры > 11. ArduinoISP > ArduinoISP
  • Всё! Ваша Arduino теперь стала ISP программатором
  • Подключаем к ней другую Arduino или голый чип по схеме ниже
  • Выбираем Arduino as ISP в Инструменты > Программатор
  • И можем писать загрузчики, фьюзы или загружать прошивку напрямую во Flash


    Либо поставить поставить конденсатор ёмкостью


Решение проблем

Для прошивки микроконтроллера, тактирующегося низкой частотой (менее 1 МГц внутренний клок):

  • Arduino ISP: нужно изменить частоту загрузки прошивки в скетче Arduino ISP и снова прошить его в ардуино-программатор (см. строку в скетче 45 и ниже);

Работа в Arduino IDE

Прошивка загрузчика

Как убрать загрузчик?

Загрузка скетча

В Arduino IDE можно зашить скетч через программатор, для этого надо нажать Скетч > Загрузить через программатор. Это очень удобно в том случае, когда МК используется без загрузчика, или просто голый МК.

Фьюзы

Конфигуратор платы в Arduino IDE устроен следующим образом: каждой плате в Инструменты > Плата соответствует свой набор настроек, включая фьюзы, которые прошиваются вместе с загрузчиком . Некоторые из них:

  • Загрузчик (путь к файлу)
  • Скорость загрузки (через загрузчик)
  • Объем доступной flash и sram памяти
  • Весь набор фьюзов и лок-биты

Файл конфигурации называется boards.txt и найти его можно в папке с ядром Arduino: C:\Program Files (x86)\Arduino\hardware\arduino\avr\boards.txt. Документацию на boards.txt можно почитать здесь. При желании можно вывести нужные фьюзы через калькулятор (читайте выше), изменить их в boards.txt (главное не запутаться, для какой выбранной конфигурации платы делается изменение) и прошить в МК, нажав Инструменты > Записать загрузчик.


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

  • Ядро GyverCore для atmega328, в нем мы сделали кучу готовых настроек фьюзов прямо в настройках платы, читайте в уроке про GyverCore. Несколько загрузчиков, включая вариант без загрузчика, выбор источника тактирования и другие настройки в один клик мышкой.
  • Программа AVRdudeprog, про нее поговорим ниже

Avrdudeprog

  • Чтение/запись/очистка flash памяти
  • Чтение/запись/очистка eeprom памяти
  • Полная очистка чипа
  • Калькулятор фьюзов и локбитов (чтение/запись)


Более подробный обзор на avrdudeprog можно посмотреть здесь . Давайте посмотрим на калькулятор фьюзов. Выбираем свой микроконтроллер и программатор (можно добавить другие модели микроконтроллеров и программаторов, читай тут). Переходим во вкладку Fuses, нажимаем прочитать. При успешном чтении увидим текущий набор настроек своего чипа. Можно их поменять и загрузить. Важно! Галку инверсные биты не трогаем! Лок-биты и отключение RST заблокирует микроконтроллер, не трогайте их, если такой цели нет! Можно загружать прошивку или загрузчик из .hex файла, указав путь к ней на первой вкладке в окне Flash. Очень удобная утилита для низкоуровневой работы с МК.

Видео

Читайте также: