0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Микроконтроллер и Bootloader. Описание и принцип работы.

Микроконтроллер и Bootloader. Описание и принцип работы.

Описана технология bootloader, встроенная во все микроконтроллеры Atmel AVR семейства ATmega. Материал для статьи взят с сайта scienceprog.com .

Возможно, что самый удобный и правильный метод программирования микроконтроллера — использовать программу бутлоадера. Поскольку Вам не надо использовать специальные адаптеры для программирования или специальные знания – нужно просто подключить стандартный кабель от Вашего PC к целевой плате и запустить на PC специальную программу, которая соединяется с программой бутлоадера, записанной в микроконтроллере. Идея проста:

Если микроконтроллер после сброса предварительно переконфигурирован (если установлены определенные фьюзы), он стартует не с адреса 0x0000, а со специального адреса, в котором обычно располагается bootloader. На диаграмме condition — это условие загрузки, которое определяется обычно опросом состояния специальной внешней перемычки, подключенной к ножке микроконтроллера.

Все микроконтроллеры семейства AVR ATmega имеют возможность запрограммировать bootloader в старшие адреса адресного пространства. Адрес старта программы зависит от установок внутренних перемычек чипа AVR (fuse settings). Если установки указывают стартовать с другого адреса, то после сброса программный счетчик переставляется на секцию бутлоадера, и тогда первым выполняется bootloader. Бутлоадеры могут иметь различный размер и использовать разные алгоритмы и интерфейсы, через которые будет загружаться основная программа. Источниками для загрузки могут быть карты Flash (MMC/SD), I2C, USART (COM-порт или RS232), SPI и USB. Условие для загрузки может быть получено, например, путем опроса специальной внешней перемычки, или наличием на карте памяти MMC/SD специального файла с прошивкой.

[USB bootloader]

Несомненно, самый удобный для пользователя интерфейс загрузки — USB. Этот интерфейс очень популярен, работает на всех операционных системах. Но протокол USB довольно сложен, поэтому встраивание bootloader в микроконтроллер, не имеющий аппаратной поддержки USB, потребует значительного объема кода (до 2 килобайт). Наиболее распространена программная реализация протокола USB от компании Objective Development — V-USB [6]. Есть также другая программная реализация — USBtiny [7].

Для микроконтроллеров AVR с аппаратным интерфейсом USB (например, AT90USB162) компания Atmel предлагает фирменные загрузчики по USB. Некоторые микроконтроллеры поставляются с завода с уже прошитым в память загрузчиком (например, все тот же AT90USB162). Технологии, применяемые для такого bootloader, называются DFU и Flip. Подробнее см. [5].

[Разнообразие бутлоадеров для AVR]

Многие AVR bootloader используют COM-порт для соединения с PC. Это хорошо работает, если используется аппаратный мост USB-USART. Если пишется бутлоадер самостоятельно, то не факт, что он сразу заработает. Обязательно потребуется отладка, и внимательное чтение документации на микроконтроллер. В списке можно увидеть уже готовые популярные бутлоадеры, которыми можно воспользоваться (список может быть и бОльшим):
* Atmex site:ladyada.net , COM, 19200bps, Assembler; JAvrProg(Java), ATtiny2313 (8-16Mhz);
* AVR Bootloader Programmer Peter Dannegger site:mikrocontroller.net , COM, Assembler; ATmega8/16/32/128;
* AVRProg-compatible Bootloader Martin Thomas site:siwawi.arubi.uni-kl.de , COM, WinAVR (C); AVRProg; Various AVRs and speeds;
* USBisp Bootloader Matthias Weisser site:matwei.de , USB, COM, AVR-GCC(C); AVRProg; STK-500; ATmega8, FT245BM;6MHz;
* Bootloader ATmega8 AVR microprocessor site:stratoserver.net , COM, 19200bps, ASM, AVRProg;ATmega8 7.3728MHz;
* Chip45boot site:chip45.com , COM, 11500bps, WinAVR; HyperTerminal; Various AVR
* STK500-Bootloader Pascal Stang , COM, Hex; AVRProg; STK500; ATmega8-128; 7.3 – 22.1MHz
* AVR109 (AVR Butterfly) site:atmel.com , COM, IAR(C); ATmega series; 12MHz;
* AVRUSBBoot — USB bootloader for Atmel AVR controllers site:fischl.de , USB, AVR-GCC; ATmega8(other Megas); 12MHz;
* Megaload site:microsyl.com , COM, 11500bps, ICCAVR(C); Megaload.NET; Various AVR;
* BootloadHID site:obdev.at , USB, HID, WinAVR; ATmega8;
* Crypto-Boot site:wikidot.com , USB, IAR(C); Crypted AES; ATmega32; 12MHz.

Большинство бутлоадеров рассчитано на COM-порт, который уже устарел и в современных компьютерах встречается редко. Наиболее простой способ адаптировать эти бутлоадеры на USB — использование аппаратного моста USART USB типа FT245BM. Но вероятно более удобно, когда USB подключен непосредственно к микроконтроллеру, и часть коммуникации бутлоадера сделана драйвером USB встроенного программного обеспечения.

Загрузчик (bootloader) — одна из основных вещей, что отличает Adruino от простого микроконтроллера AVR компании Atmel. Когда Вы собираете свою плату, или когда случайно купили на ebay плату, не прошитую загрузчиком, то Вам нужен внешний программатор ISP, чтобы прошить в память микроконтроллера загрузчик.

Загрузчик это по сути маленькая программа, предназначенная для только одной цели — перепрошить микроконтроллер программой пользователя. Загрузчик размещен в старших адресах пространства памяти программ (FLASH), а программа пользователя — в младших адресах (начиная с нулевого адреса). На рисунке показан типичный пример распределения памяти программ (FLASH) микроконтроллера ATmega328.

Микроконтроллер Arduino сконфигурирован фьюзами так, чтобы при запуске системы (включение питания, сброс) управление всегда получал загрузчик. Затем загрузчик некоторое время ждет (1..2 секунды) загрузки программы пользователя, и если загрузка не началась, то запускает программу пользователя (передает управление на адрес 0). Таким образом, всегда можно при желании перезаписать программу пользователя, и тем самым обновить или полностью изменить функционал устройства. Код загрузчика при этом остается нетронутым.

Условие запуска загрузчика. Есть загрузчики, которые сразу передают управление в программу пользователя (без задержки), если не выполнено условие загрузки. Это иногда делается для того, чтобы ускорить запуск программы пользователя. Условие загрузки может быть разным, но чаще всего это перемычка, замыкающая на землю определенный (известный заранее пользователю) вывод микроконтроллера. Если перемычка установлена, то условие загрузки выполняется, и загрузчик ждет начала загрузки, не передавая управление в программу пользователя.

[На что нужно обратить внимание при программировании загрузчика]

Выбор загрузчика. Поскольку могут быть различные варианты реализации целевой системы — может быть применена разная модель микроконтроллера (ATmega168, ATmega328, ATmega32U4 и т. п.). Загрузчики для разных моделей микроконтроллеров могут быть несовместимыми друг с другом.

Частота кварцевого резонатора. Обязательно убедитесь, что прошиваемый Вами загрузчик точно соответствует рабочей частоте системы, разная частота кварцевого резонатора (обычно 8 или 16 МГц, но могут быть и другие варианты). Рабочая частота микроконтроллера обычно зависит от конфигурации фьюзов и частоты внешнего кварцевого или керамического резонатора.

Фьюзы. Для правильного функционирования загрузчика важны 2 аспекта, которые конфигурируются фьюзами — выбор размера секции загрузки (фьюзы BOOTSZ1, BOOTSZ0), разрешение работы загрузчика (фьюз BOOTRST), а также конфигурирование тактовой частоты (фьюзы, управляющие генератором тактовой частоты и прескалером — CKDIV8, SUT1, SUT0, CKSEL3..0).

Если Вы неправильно прошьете фьюзы BOOTSZ1, BOOTSZ0, BOOTRST, то код загрузчика не будет запускаться, и загрузчик работать не будет. Точно также если Вы неправильно сконфигурируете фьюзами тактовый генератор и прескалер, то микроконтроллер может заработать на той частоте, на которую загрузчик не рассчитан, и работоспособность загрузчика также будет нарушена. Для вычисления правильного значения фьюзов Вам поможет калькулятор фьюзов [6].

В таблице я привел самые популярные загрузчики и конфигурации для них. Фьюзы указаны в шестнадцатеричном значении, где HFUSE это старший байт фьюзов, LFUSE младший байт фьюзов, EFUSE байт расширенных фьюзов.

Микроконтроллер и Bootloader. Описание и принцип работы.

Описана технология bootloader, встроенная во все микроконтроллеры Atmel AVR семейства ATmega. Материал для статьи взят с сайта http://www.scienceprog.com/.

Возможно, что самый удобный и правильный метод программирования микроконтроллера — использовать программу бутлоадера. Поскольку Вам не надо использовать специальные адаптеры для программирования или специальные знания – нужно просто подключить стандартный кабель от Вашего PC к целевой плате и запустить на PC специальную программу, которая соединяется с программой бутлоадера, записанной в микроконтроллере. Идея проста:

Если микроконтроллер после сброса предварительно переконфигурирован (если установлены определенные фьюзы), он стартует не с адреса 0x0000, а со специального адреса, в котором обычно располагается bootloader. На диаграмме condition — это условие загрузки, которое определяется обычно опросом состояния специальной внешней перемычки, подключенной к ножке микроконтроллера.

Все микроконтроллеры семейства AVR ATmega имеют возможность запрограммировать bootloader в старшие адреса адресного пространства. Адрес старта программы зависит от установок внутренних перемычек кристала AVR (fuse settings). Если установки указывают стартовать с другого адреса, то после сброса программный счетчик переставляется на секцию бутлоадера, и тогда первым выполняется bootloader. Бутлоадеры могут иметь раличный размер и использовать разные алгоритмы и интерфейсы, через которые будет загружаться основная программа. Источниками для загрузки могут быть карты Flash (MMC/SD), I2C, USART (COM-порт или RS232), SPI и USB. Условие для загрузки может быть получено, например, путем опроса специальной внешней перемычки, или наличием на карте памяти MMC/SD специального файла с прошивкой.

Читать еще:  Программа Cheat Engine на Android — удобный инструмент для взлома игр и приложений

Несомненно, самый удобный для пользователя интерфейс загрузки — USB. Этот интерфейс очень популярен, работает на всех операционных системах. Но протокол USB довольно сложен, поэтому встраивание bootloader в микроконтроллер, не имеющий аппаратной поддержки USB, потребует значительного объема кода (до 2 килобайт). Наиболее распространена программная реализация протокола USB от компании Objective Development — V-USB. Есть также другая программная реализация — USBtiny.

Для микроконтроллеров AVR с аппаратным интерфейсом USB (например, AT90USB162) компания Atmel предлагает фирменные загрузчики по USB. Некоторые микроконтроллеры поставляются с завода с уже прошитым в память загрузчиком (например, все тот же AT90USB162). Технологии, применяемые для такого bootloader, называются DFU и Flip. Подробнее см. здесь — http://microsin.ru/content/view/685/44/.

[Разнообразие бутлоадеров для AVR]

Многие AVR bootloader используют COM-порт для соединения с PC. Это хорошо работает, если используется аппаратный мост USB-USART. Если пишется бутлоадер самостоятельно, то не факт, что он сразу заработает. Обязательно потребуется отладка, и внимательное чтение документации на микроконтроллер. В списке можно увидеть уже готовые популярные бутлоадеры, которыми можно воспользоваться (список может быть и бОльшим):
* Atmex, http://ladyada.net/techproj/Atmex/, COM, 19200bps, Assembler; JAvrProg(Java), ATtiny2313 (8-16Mhz);
* Bootloader Programmer, Peter Dannegger, http://www.mikrocontroller.net/topic/12181, COM, Assembler; ATmega8/16/32/128;
* AVRProg-compatible Bootloader, Martin Thomas, http://www.siwawi.arubi.uni-kl.de/avr_projects/, COM, WinAVR (C); AVRProg; Various AVRs and speeds;
* USBisp Bootloader, Matthias Weisser, http://www.matwei.de/doku.php?id=en:electronics:usbisp, USB, COM, AVR-GCC(C); AVRProg; STK-500; ATmega8, FT245BM;6MHz;
* DL5NEG, Herbert Dingfelder, http://www.herbert-dingfelder.de/bootloader/bootloader.html, COM, 19200bps, ASM, AVRProg;ATmega8 7.3728MHz;
* Chip45boot, Erik Lins, http://www.chip45.com/index.pl?page=chip45boota?©=en, COM, 11500bps, WinAVR; HyperTerminal; Various AVR
* STK500-Bootloader, Pascal Stang, http://hubbard.engr.scu.edu/embedded/avr/bootloader/, COM, Hex; AVRProg; STK500; ATmega8-128; 7.3 – 22.1MHz
* AVR109 (AVR Butterfly), Atmel, http://www.atmel.com, COM, IAR(C); ATmega series; 12MHz;
* AVRUSBBoot, Thomas Fischl, http://www.fischl.de/avrusbboot/, USB, AVR-GCC; ATmega8(other Megas); 12MHz;
* Megaload, Sylvain Bissonnette, http://www.microsyl.com/megaload/megaload.html, COM, 11500bps, ICCAVR(C); Megaload.NET; Various AVR;
* Bootload HID, http://www.obdev.at/products/avrusb/bootloadhid.html, USB, HID, WinAVR; ATmega8;
* Crypto_Boot, http://avrusb.wikidot.com/project:crypto-boot, USB, IAR(C); Crypted AES; ATmega32; 12MHz.

Большинство бутлоадеров рассчитано на COM-порт, который уже устарел и в современных компьютерах встречается редко. Наиболее простой способ адаптировать эти бутлоадеры на USB — использование аппаратного моста USART USB типа FT245BM. Но вероятно более удобно, когда USB подключен непосредственно к микроконтроллеру, и часть коммуникации бутлоадера сделана драйвером USB встроенного программного обеспечения.

1. AVR-USB-MEGA16: USB bootloader BootloadHID для микроконтроллера ATmega16. Мой вариант BootloadHID, заточенный под макетную плату AVR-USB-MEGA16 с микроконтроллером ATmega16 (с исходниками и скомпилированными вариантами для микроконтроллеров ATmega8, ATmega16, ATmega32 и кварцев на различные частоты).
2. AVR-USB-MEGA16: USB bootloader USBASPloader для микроконтроллера ATmega32. Мой вариант usbasploader, заточенный под макетную плату AVR-USB-MEGA16 с микроконтроллером ATmega32 (проект для AVRStudio с исходниками и скомпилированными вариантами для кварцев 12 МГц, 16 МГц).
3. AVR-USB-MEGA16: USB bootloader USBasp для микроконтроллера ATmega32. Простая инструкция, как пользоваться загрузчиком USBasp.

Комментарии

  1. #8 Точка опоры
    2015-03-14 10:20:14 Ещё один загрузчик: http://www.fulcrum.ru/Support/art_Atmel_Loader_EXT.htm
    Написан на ассемблере, собирается под любой МК семейства mega, связь с ПК по UART, работает под управлением AVRDUDE и AVRProg.
  2. #7 Владимир
    2014-10-14 22:10:29 Подскажите — существует ли любительский бутлоадер с управлением через Ehternet (по типу Kernelchip Louran) (например, в связке с ENC28J60). Буду признателен за любую наводку.

microsin: мне такие бутлоадеры для AVR не попадались. И навряд ли такой существует — слишком неподходящие требования по размеру кода у сетевых стеков, трудно уместить программу бутлоадера в секцию загрузки.

  • #6 4RESTER
    2013-02-18 22:33:12 Чтобы использовать bootloader по RS-485 — используйте MAX13488 (он с автоматическим переключением направления).
  • #5 Дима
    2011-08-19 15:58:28 Позарез нужен буатлоадер работающий на ATmega16, но по rs485 интерфейсу. То есть бутак должен еще и дрыгать каким нибудь пином микроконтроллер а, чтобы переключать драйвер max485 то на прием, то на передачу. Есть такой?

    microsin: думаю, Вам нужно взять за основу бутлоадер для COM-порта (RS232, USART) и немножко его доработать, чтобы переключалось направление передачи данных. Бутлоадер RS232 для AVR найти не проблема.
    #4 Дмитрий
    2011-07-11 19:15:35 У меня вопрос по старту бута. Можно ли как-нибудь сделать, чтобы можно было обходится без перемычки? Т. е. чтобы просто подключил девайс к USB и сам USB хост сообщил ему, что надо стартануть бут? Например в основном коде придумать как ему сделать рестарт, а перед рестартом еще в ЕЕПРОм, например, флаг какой-нибудь установить, чтобы по рестарту он не выходил из бута, пока прошивку не всосет? Ну или как-то так?

    microsin: вариантов решения проблемы запуска бутлоадера множество, и метод реализации запуска зависит целиком от Вашей фантазии. Просто придумайте, как Вы хотели бы, чтобы бутлоадер стартовал — и просто сделайте это, благо исходники бутлоадеров есть, и поменять их поведение достаточно просто. Стандартное решение — добавление в протокол обмена USB-устройства специальной команды, которая запускает бутлоадер. Тогда никакая перемычка не нужна.
    #3 Дима
    2010-12-30 15:55:05 Есть ли бутлоадер для утилиты AVRprog, находящейся в составе AVRStudio?

    microsin: к сожалению, такой бутлоадер пока не попадался. Если попадется, то обязательно будет его перевод или обзор. Теоретически такой бутлоадер можно реализовать самому, так как все основные части — протокол STK200 (или STK500) и класс CDC, реализованный на библиотеке V-USB, уже есть готовые в исходниках. Вот, кстати, хороший кандидат для переделки под V-USB — http://www.siwawi.arubi.uni-kl.de/avr_projects/index.html#avrprog_boot . Код хорошо документирован, и может быть легко портирован на V-USB. Основная проблема только в том, чтобы уместить получившийся код в секцию бутлоадера. Наверняка он влезет в boot-секцию только начиная с ATmega32.
    #2 Kaseiiro
    2010-07-10 12:43:00 Компилятору-то зачем знать про „меньше памяти“? Сами заметите. А загрузчику затирать себя можно и запретить.
    И все же, субъективно: загрузчик лучше писать самостоятельно.

    microsin: по поводу компилятора — Вы правы, если не задумываться от том, что НА САМОМ ДЕЛЕ хотели спросить. А в остальном Все в этом мире с точки зрения человека субъективно. В том числе, с моей точки зрения — загрузчику лучше ничего не запрещать, а сделать его как можно тупее и меньше по размеру. И опять же, субъективно — bootloader для AVR НИ В КОЕМ СЛУЧАЕ НЕ НАДО ПИСАТЬ САМОСТОЯТЕЛЬНО, поскольку лучше, чем уже уже понаписано (причем столько, что не разгребете), Вы никогда не напишете.
    #1 Маковюшка
    2010-07-07 08:18:06 Огромное спасибо за содержание сайта — оно бесценно для электронщиков!

    Подскажите пожалуйста, что нужно дописать, настроить в проекте WinAVR IAR CVAVR если программа создается под бутлодер? Т. е. как сообщить компилятору, что памяти доступно меньше, чем в выбранном камушке?

    microsin: Вы указали целых три системы проектирования, поэтому для ответа на вопрос придется написать целую статью. Пожалуйста, задавайте конкретные вопросы, и еще лучше — пишите по этому поводу на на email. Объем памяти в общем случае задается в хедерах, описывающих микроконтроллер , или в настройках проекта, или в опциях линкера.

    Урок 17. Использование бутлоадера в BASCOM-AVR

    В новых AVR микроконтроллерах семейства Mega есть одна хорошая фича, которая позволяет записать в специальную облась Flash памяти программу которая называется бутлоадер (Bootloader). И так что же такое бутлоадер? Бутлоадер — это специальная программа которая позволяет прошивать микроконтроллер через UART интерфейс. Сегодня наиболее распространённая платформа с использованием бутлоадера это Arduino. В ней есть сразу микроконтроллер и USB-UART переходник, программа на компьютере позволяет сразу свеженаписанную программу зашить в МК через обычный UART. Обычно бутлоадер записывается в конец Flash памяти и стартует сразу при подачи питания на микроконтроллер. После старта бутлоадер проверяет UART, если на него приходит сообщение то начинается прошивка МК, если нет то микроконтроллер начинает выполнять программу как обычно (с начала). Для запуска бутлоадера в микроконтроллере необходимо cначала его прошить потом установить специальный фьюз-бит который называется BOOTRST (Boot Reset vector Enabled), при установленном данном фьюз-бите микроконтроллер при запуске переходит по адресу Flash памяти в котором записан бутлоадер. Адрес перехода устанавливается с помощью фьюз-бита BOOTSZ, обычно он равен 01 (Boot Flash section size = 1024), хотя бывают случаи когда нужен другой адрес (зависит от конкретного бутлоадера). Стоит помнить что при стирании памяти микроконтроллера стирается вся его память в том числе и бутлоадер, если вы хотите чтобы микроконтроллер работал как раньше (выполнял программу сразу) просто снимите фьюз-бит BOOTRST. К счастью в BASCOM-AVR есть готовые бутлоадеры которые можно настроить под конкретный микроконтроллер, в среде BASCOM-AVR есть программа которая выполняет прошивку МК через бутлоадер. Это очень удобно при отладке какого либо устройства на стадии разработки, уважаю MCS Electronics. И так, теперь мы научимся работать с бутлоадером в BASCOM-AVR.

    Читать еще:  Как отключить прием смс?

    Чтобы научится работать с бутлоадером, сначала соберём простую схему:

    Собственно ничего особенного ничего здесь нет, микроконтроллер Atmega32, ЖК индикатор HD44780 и некоторая рассыпуха. Стоит отметить что для связи схемы с компьютером вам будет нужен USB — UART, COM — UART переходник, отлично подойдёт схема из прошлых уроков или вот эта схема. Главное не забывать что RXD подключается к TXD, а TXD к RXD. Напряжение питания схемы 5 вольт, резистор R2 регулирует контрастность дисплея, кнопка S1 — «Сброс».

    Теперь подготовим сам бутлоадер, в папке BASCOM-AVRSAMPLESBOOT есть большое количество исходных файлов бутлоадеров для разнообразных микроконтроллеров, возьмём самый универсальный, это BootLoader.bas. Откроем его, всё что нам нужно это прописать нужную скорость UART, тактовую частоту, раскомментировать строки с нужным микроконтроллером и закомментировать строки с ненужным. После чего исходный файл бутлоадера можно смело компилировать и прошивать в микроконтроллер. Вот такой получился у меня исходник бутлоадера для Atmega32:

    В нём я установил микроконтроллер Atmega32, скорость UART 4800 бод, тактовая частота 16 МГц, Boot Flash section size = 1024. После прошивки устанавливаем следующие фьюз-биты:

    После прошивки и установки фьюз-битов, подключаем схему через UART переходник к компьютеру. Запускаем BASCOM-AVR и открываем настройки программатора (Options>Programmer), в выпадающем списке Programmer выбираем MCS Bootloader, устанавливаем галочку Upload Code and Data. Далее во вкладке Serial выбираем COM-port порт к которому подключена схема (у меня 3) и бод которых указали в бутлоадере (у меня 4800), во вкладке MCS Loader устанавливаем Boot size какой установили во фьюз битах и бутлоадере (у меня 1024). Вот что примерно должно получится:

    Всё, когда всё настроили можно писать программу и прошивать с помощью бутлоадера, например напишем простенькую программу:

    Когда всё написали, компилируем и прошиваем: идём Program>Send to chip>Program, появится следующие окошко:

    Программа просит, чтобы мы сбросили микроконтроллер, нажмём на кнопку S1 сбросим микроконтроллер (этим мы запустим бутлоадер), сразу начнётся процесс прошивки:

    После прошивки кнопочка «Cancel» примет вид «Ok», вот так:

    Нажмём на кнопку «Ok» и сбросим микроконтроллер нажав на кнопку S1. Всё, прошивка окончена, программа зашитая в микроконтроллер сразу запуститься. Вот что получилось у меня:

    Вот видео где я демонстрирую прошивку МК с помощью бутлоадера:

    В файлах к статье есть исходники бутлоадера, программы, готовые прошивки и проект в Proteus.

    Вот собственно и всё! Задавайте вопросы в комментариях, пишите в ЛС, всегда рад помочь!

    Введение

    Размер секции загрузчика и секции прикладной программы задается с помощью конфигурационных битов BOOTSZ1, BOOTSZ0. Для микроконтроллера ATmega16 размеры секций памяти в зависимости от значений конфигурационных битов будут выглядеть так.

    Значение конфигурационных битов зависит от требований конкретного загрузчика. Например, для бутлоадера фирмы Chip45 требуется загрузочная секция размером в 1024 слова (2 Кб), но можно написать и более компактный загрузчик. Все зависит от закладываемой в него функциональности и вашего умения кодить.

    Допустим, мы записали в микроконтроллер бутлоадер, как им воспользоваться? Чтобы загрузчик заработал, его нужно активировать (запустить). Сделать это можно двумя способами:

    Для реализации такого перехода нужно: создать указатель на функцию, присвоить ему адрес начала загрузочной секции и осуществить вызов функции с помощью этого указателя. Например, так:

    Бутлоадер фирмы Chip45

    Перейдем к рассмотрению загрузчика фирмы Chip45. В чем его особенность?

    1. Наличие готовых прошивок загрузчика под большую номенклатуру AVR микроконтроллеров, а также микроконтроллеров XMEGA. Не нужно компилировать прошивку самому!

    2. Простая и удобная графическая оболочка для работы с загрузчиком, а также наличие ее портов под несколько операционных систем (Windows, Linux, Mac OS X).

    3. Простой командный интерфейс для работы через терминальные программы.

    4. Использование для обмена данными UART модуля, что позволяет загружать прошивку в микроконтроллер по RS-232 или USB, в случае использования USB-UART преобразователя.

    5. Поддержка интерфейса RS-485.

    6. Возможность чтения/записи EEPROM памяти.

    7. Автоматическая установка скорости обмена UART`a с хостом независимо от тактовой частоты микроконтроллера.

    8. Дополнительные возможности по активации загрузчика, путем отправки произвольной строки.

    9. Требуемый размер загрузочной секции – 1024 слова (2 Kб flash памяти)

    Запись загрузчика в микроконтроллер состоит из следующих шагов:

    — устанавливаем размер загрузочной секции равной 1024-м словам,
    — устанавливаем конфигурационный бит BOOTRST,
    — запрещаем деление тактовой частоты, если есть бит CLKDIV8,
    — запрещаем работу сторожевого таймера, если он включен битом WDTON,
    — выбираем подходящую под наш микроконтроллер прошивку,
    — записываем ее в микроконтроллер с помощью любого программатора.

    Микроконтроллер и Bootloader. Описание и принцип работы.

    Приветствую всех на нашем сайте и сегодня мы после небольшого перерыва вернемся к теме микроконтроллеров. А если быть совсем точным, то мы начинаем обсуждать одну очень интересную и важную тему, а именно использование bootloader (загрузчика) при программировании контроллеров. Сегодня мы разберем теоретическую часть – зачем bootloader нужен, как он работает и что это вообще такое. Следующая статья будет посвящена целиком и полностью практике. Забегая вперед скажу, что мы напишем свой bootloader для любимых микроконтроллеров STM32!

    Итак, простыми словами, bootloader – это специальная программа, которая располагается в памяти микроконтроллера и может самостоятельно перепрограммировать его. Давайте для лучшего понимания процесса посмотрим как вообще выполняется программа, прошитая в микроконтроллер, и где она располагается.

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

    При использовании загрузчика все выглядит несколько иначе. Основная программа записывается уже по другим адресам и располагается начиная, например, с адреса 0х0800A000. А область памяти (0х08000000 – 0х0800А000) целиком и полностью отдается bootloader’у. В итоге в flash-памяти контроллера у нас находятся две полноценные программы. При включении устройства управление получает bootloader (поскольку он находится в области, начинающейся со “стартового” адреса 0х08000000), а при дальнейшей работе bootloader, выполнив все свои задачи передает управление нашей основной программе, которая располагается по адресу 0х0800А000 (этот адрес мы взяли для примера). Вот небольшая схемка для демонстрации работы загрузчика:

    Вроде бы понятно как устроено, но возникает вопрос – зачем все это надо? Давайте разбираться!

    Первостепенной задачей bootloader’а является программирование микроконтроллера. Он не просто выполняет какие-то действия, а затем передает управление основной программе (переходит на адрес, который соответствует началу основной программы), он, в первую очередь, самостоятельно записывает эту основную программу в flash-память по нужным адресам.

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

    Небольшое отступление от основной темы… Поясню, что я тут имею ввиду под “файлом программы”.

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

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

    Бинарник, в отличие от hex, содержит в себе только последовательный код программы и ничего больше. То есть bootloader’у остается только читать байты из bin-файла и записывать их во flash-память. То есть в нашем примере задачей загрузчика является чтение байт из файла на карте памяти и запись их по адресам, начиная с 0х0800A000. Вот псевдокод для наглядности:

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

    Читать еще:  17track — китайский сервис отслеживания почтовых отправлений

    Все это, конечно, очень интересно, но по-прежнему, непонятно, зачем нужны все эти сложности….

    С этим на самом деле все просто – вот, например, первая ситуация – есть огромное количество устройств, на заводе работники прошили в каждый контроллер (например, при помощи ST-Link) на каждой плате bootloader, который при подключении к плате флешки (в заранее предусмотренный разъем) ищет на ней файл прошивки и выполняет программирование. Основную программу, конечно же, тоже можно прошить вместе с bootloader’ом через ST-Link. Но тонкость тут в том, что проект bootloader’а остается всегда неизменным и перепрошивать его не надо, а вот версия основной программы может обновляться кучу раз в процессе тестирования устройств.

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

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

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

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

    В общем-то, вроде бы мы разобрались с теоретической частью, посвященной использованию bootloader’а, но давайте еще один момент обсудим в этой статье – а именно аппаратный загрузчик микроконтроллеров STM32.

    В STM32 уже есть bootloader, который инженеры ST поместили в специально отведенную область памяти микроконтроллера (System Memory). Удалить его оттуда нельзя, да и незачем 🙂 Для того, чтобы ввести контроллер в режим загрузчика необходимо подать определенные сигналы на ножки BOOT0 и BOOT1. После этого микроконтроллер готов принимать по USART новую прошивку. Для этого необходимо подключить плату к ПК, скачать специальную софтинку от ST – Flash Loader Demonstrator и загрузить в нее свой файл прошивки.

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

    Во-первых, прошивка никак не шифруется, что для коммерческих устройств зачастую недопустимо. Если я использую свой собственный bootloader, то я могу сделать с bin-файлом все, что угодно, например, поменять определенные байты местами. Если такой файл попадет в руки конкурентов, то это ничего не даст, поскольку только мой bootloader знает как расшифровать бинарник. При использовании аппаратного botloader’а такое невозможно – Flash Loader Demonstrator принимает bin-файл в исходном виде, то есть все байты в нем не зашифрованы.

    Во-вторых, пользователю будет необходимо подключать свою плату к ПК и скачивать дополнительный софт для перепрошивки устройства, и это не очень хорошо. Чем проще устройство в использовании, тем лучше! Но есть и плюсы аппаратного bootloader’а – он не занимает flash-память. При использовании своего загрузчика нужно иметь ввиду, что и загрузчик и основная программа должны поместиться в памяти. С аппаратным bootloader’ом такой проблемы нет – он расположен в специальной области, использовать которую программист не может.

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

    Загрузчики (bootloader) для микроконтроллеров AVR

    Описана технология bootloader, встроенная во все микроконтроллеры Atmel AVR семейства ATmega. Материал для статьи взят с сайта http://www.scienceprog.com/.

    Возможно, что самый удобный и правильный метод программирования микроконтроллера — использовать программу бутлоадера. Поскольку Вам не надо использовать специальные адаптеры для программирования или специальные знания – нужно просто подключить стандартный кабель от Вашего PC к целевой плате и запустить на PC специальную программу, которая соединяется с программой бутлоадера, записанной в микроконтроллере. Идея проста:

    Если микроконтроллер после сброса предварительно переконфигурирован (если установлены определенные фьюзы), он стартует не с адреса 0x0000, а со специального адреса, в котором обычно располагается bootloader. На диаграмме condition — это условие загрузки, которое определяется обычно опросом состояния специальной внешней перемычки, подключенной к ножке микроконтроллера.

    Все микроконтроллеры семейства AVR ATmega имеют возможность запрограммировать bootloader в старшие адреса адресного пространства. Адрес старта программы зависит от установок внутренних перемычек кристалла AVR (fuse settings). Если установки указывают стартовать с другого адреса, то после сброса программный счетчик переставляется на секцию бутлоадера, и тогда первым выполняется bootloader. Бутлоадеры могут иметь различный размер и использовать разные алгоритмы и интерфейсы, через которые будет загружаться основная программа. Источниками для загрузки могут быть карты Flash (MMC/SD), I2C, USART (COM-порт или RS232), SPI и USB. Условие для загрузки может быть получено, например, путем опроса специальной внешней перемычки, или наличием на карте памяти MMC/SD специального файла с прошивкой.

    Несомненно, самый удобный для пользователя интерфейс загрузки — USB. Этот интерфейс очень популярен, работает на всех операционных системах. Но протокол USB довольно сложен, поэтому встраивание bootloader в микроконтроллер, не имеющий аппаратной поддержки USB, потребует значительного объема кода (до 2 килобайт). Наиболее распространена программная реализация протокола USB от компании Objective Development — . Есть также другая программная реализация — .

    Для микроконтроллеров AVR с аппаратным интерфейсом USB (например, AT90USB162) компания Atmel предлагает фирменные загрузчики по USB. Некоторые микроконтроллеры поставляются с завода с уже прошитым в память загрузчиком (например, все тот же AT90USB162). Технологии, применяемые для такого bootloader, называются DFU и Flip. Подробнее см. здесь — .

    [Разнообразие бутлоадеров для AVR]

    Многие AVR bootloader используют COM-порт для соединения с PC. Это хорошо работает, если используется аппаратный мост USB-USART. Если пишется бутлоадер самостоятельно, то не факт, что он сразу заработает. Обязательно потребуется отладка, и внимательное чтение документации на микроконтроллер. В списке можно увидеть уже готовые популярные бутлоадеры, которыми можно воспользоваться (список может быть и большим):
    * Atmex, , COM, 19200bps, Assembler; JAvrProg(Java), ATtiny2313 (8-16Mhz);
    * Bootloader Programmer, Peter Dannegger, , COM, Assembler; ATmega8/16/32/128;
    * AVRProg-compatible Bootloader, Martin Thomas, , COM, WinAVR (C); AVRProg; Various AVRs and speeds;
    * USBisp Bootloader, Matthias Weisser, , USB, COM, AVR-GCC(C); AVRProg; STK-500; ATmega8, FT245BM;6MHz;
    * DL5NEG, Herbert Dingfelder, , COM, 19200bps, ASM, AVRProg;ATmega8 7.3728MHz;
    * Chip45boot, Erik Lins, , COM, 11500bps, WinAVR; HyperTerminal; Various AVR
    * STK500-Bootloader, Pascal Stang, , COM, Hex; AVRProg; STK500; ATmega8-128; 7.3 – 22.1MHz
    * AVR109 (AVR Butterfly), Atmel, , COM, IAR(C); ATmega series; 12MHz;
    * AVRUSBBoot, Thomas Fischl, , USB, AVR-GCC; ATmega8(other Megas); 12MHz;
    * Megaload, Sylvain Bissonnette, , COM, 11500bps, ICCAVR(C); Megaload.NET; Various AVR;
    * Bootload HID, , USB, HID, WinAVR; ATmega8;
    * Crypto_Boot, , USB, IAR(C); Crypted AES; ATmega32; 12MHz.

    Большинство бутлоадеров рассчитано на COM-порт, который уже устарел и в современных компьютерах встречается редко. Наиболее простой способ адаптировать эти бутлоадеры на USB — использование аппаратного моста USART USB типа FT245BM. Но вероятно более удобно, когда USB подключен непосредственно к микроконтроллеру, и часть коммуникации бутлоадера сделана драйвером USB встроенного программного обеспечения.

    Ссылки

    1. AVR-USB-MEGA16: USB BootloadHID для микроконтроллера ATmega16. BootloadHID заточенный под макетную плату AVR-USB-MEGA16 с микроконтроллером ATmega16 (с исходниками и скомпилированными вариантами для микроконтроллеров ATmega8, ATmega16, ATmega32 и кварцев на различные частоты).

    Мой вариант usbasploader, заточенный под макетную плату AVR-USB-MEGA16 с микроконтроллером ATmega32 (проект для AVRStudio с исходниками и скомпилированными вариантами для кварцев 12 МГц, 16 МГц).

  • Ссылка на основную публикацию
    Статьи c упоминанием слов:

    Adblock
    detector