В статье описывается USB bootloader BootloadHID, который хорошо подходит для ATmega8 и ATmega16, так как у него код умещается в 2048 байт.
Загрузчик BootloadHID очень похож на USBASPloader по структуре исходного кода и принципу работы. Причем BootloadHID проще, чем USBASPloader, т. к. не поддерживает чтение flash (для проверки того, что уже записано). Следовательно, и размер кода у него меньше. За это приходится расплачиваться универсальностью - для записи нужна специальная программа (написанная специально только для BootloadHID), но зато есть возможность встроить USB bootloader в младшие модели контроллеров AVR.
Имея BootloadHID, можно отказаться от повседневного использования ISP-программатора, и прошивать код прямо через соединение по USB. Для BootloadHID подходят все микроконтроллеры AVR, у которых есть технология boot-сектора (т. е. область памяти в старших адресах, куда может передаваться управление при сбросе (подробнее см. [1]), и размер этого сектора не меньше 2048 байт. Boot-поведение при сбросе конфигурируется фьюзами микроконтроллера. По тебованиям к ресурсам для BootloadHID подходят микрокотроллеры ATmega8 и выше (ATmega16, ATmega32 и т. д.). BootloadHID мне отлично подошел для старой модификации макетной платы AVR-USB-MEGA16, у которой стоит микроконтроллер ATmega16. Другие загрузчики у меня не заработали по разным причинам - USBASPloader я не смог скомпилировать так, чтобы он уложился в 2048 байт, а загрузчик AVRUSBBoot у меня попросту не заработал - непонятно почему, так и не разобрался.
Теперь подробнее от том, как встроить в свой проект BootloadHID, на примере макетной платы AVR-USB-MEGA16 (микроконтроллер ATmega16), процесс по шагам.
1. Скачайте последнюю версию BootloadHID, см. [2]. Я скачивал bootloadHID.2008-11-26.zip. Распакуйте в отдельную папку. Попробуйте выполнить команду make в папке bootloadHID.2008-11-26\firmware\, процесс должен успешно завершиться, и должен появиться файл прошивки main.hex (предполагается, что у Вас установлена GCC-среда компилирования WinAVR).
2. Исправьте в файле bootloaderconfig.h, если это нужно, макросы USB_CFG_IOPORTNAME, USB_CFG_DMINUS_BIT и USB_CFG_DPLUS_BIT - они задают порт и ножки, к которым подключены сигналы D- и D+ шины USB (помните, что сигнал D+ должен быть обязательно соединен с портом, вызывающем срабатывание прерывания INT0). Также при необходимости исправьте подпрограмму bootLoaderInit. Она подготавливает микроконтроллер для работы с переключающей перемычкой, которая активирует bootloader (перемычки нет- bootloader не активен, перемычка стоит - bootloader работает). Для макетной платы AVR-USB-MEGA16 я воспользовался тем, что есть очень удобное место для этой перемычки на конекторе U1 ISP - между его контактом 4 (MOSI, порт PB5, ножка 1 микроконтроллера ATmega16 в корпусе TQFP44) и контактом 6 (GND, земля, минус питания).
Чтобы порт PB5 работал как вход для перемычки, я переделал код bootLoaderInit следующим образом (раньше для перемычки был назначен порт PD3):
static inline void bootLoaderInit(void)
{
//PORTD = 1 << 3; /* activate pull-up for key */
PORTB = 1 << PB5; /* activate pull-up for key */
_delay_us(10); /* wait for levels to stabilize */
}
Необходимо также поправить макрос bootLoaderCondition:
//#define bootLoaderCondition() ((PIND & (1 << 3)) == 0) /* True if jumper is set */
#define bootLoaderCondition() ((PINB & (1 << PB5)) == 0) /* True if jumper is set */
3. Подправьте при необходимости установки в Makefile. Проверьте частоту кварца (макрос F_CPU), адрес начала размещения в памяти загрузчика (BOOTLOADER_ADDRESS) и тип микроконтроллера (макрос DEVICE). Для макетной платы AVR-USB-MEGA16 с микроконтроллером ATmega16 и кварцем на 16 МГц я установил следующие значения (больше ничего не менял):
DEVICE = atmega16
BOOTLOADER_ADDRESS = 3800
F_CPU = 16000000
Остальные параметры Makefile можно не трогать (если Вы не собираетесь с помощью него прошивать перемычки и код BootloadHID).
Если лень проделывать шаги 1..3, то просто скачайте пакет по ссылке[3]. В папке bootloadHID.2008-11-26\firmware\hexfiles\ найдете уже сгенерированные прошивки для микроконтроллеров ATmega8, ATmega16,ATmega32 на разные частоты кварцев.
4. Выполните make. Прошейте получившийся файл main.hex отдельным ISP-программатором. Для ATmega16 перемычки должны быть прошиты в следующем состоянии:
LOW FUSE BYTE: 0xCF
HIGH FUSE BYTE: 0x98
LOCKOPT BYTE: 0xEF
[Как работать с BootloadHID]
Для прошивки по USB с помощью BootloadHID можно воспользоваться тремя возможными вариантами:
- консольная утилита bootloadHID.exe, которую можно найти в папке bootloadHID.2008-11-26\commandline\ архива с BootloadHID.
- GUI программа HIDBootFlash.
- GUI программа GUI uploader tool.
Со своей стороны я рекомендую HIDBootFlash. Она поддерживает BootloadHID, AVRUSBBoot, позволяет выбрать другие VID и PID для программирующего загрузчика, поддерживает также командную строку и наглядно отображает процесс. Что еще надо?
Теперь опишу нехитрую процедуру прошивки программы с помощью USB bootloader BootloadHID (на примере макетной платы AVR-USB-MEGA16 и модифицированного кода BootloadHID, который можно скачать по ссылке [3]).
1. Поставьте перемычку между ножками 4 и 6 коннектора U1 ISP.
2. Подключите макетную плату к компьютеру по USB. На макетке загорится красный светодиод, и в системе Windows обнаружится USB HID-устройство BootloadHID (драйвера не потребуются).
3. Запустите программу HIDBootFlash. Загрузите hex-файл прошивки (кнопка Open .hex File). Нажмите большую кнопку Flash Device, запускающую программирование. Программируется кристалл очень быстро, за несколько секунд. При этом красный светодиод на макетке будет мигать.
4. Снимите перемычку между ножками 4 и 6 коннектора U1 ISP.
Переподключите макетку (выдерните и снова вставьте шнур USB). Начнет выполняться Ваша программа с адреса 0 (которую Вы только что записали).
[Ссылки]
1. Загрузчики (bootloader) для микроконтроллеров AVR.
2. Домашняя страничка BootloadHID.
3. Исходники и скомпилированные прошивки проекта BootloadHID, модифицированные для использования с макетной платой AVR-USB-MEGA16. В код BootloadHID я добавил управление красным светодиодом макетки D1 - для индикации процесса работы загрузчика (активизация и запись памяти).
4. AVR-USB-MEGA16:USB bootloader USBASPloader для микроконтроллера ATmega32. Мой вариант usbasploader, заточенный под макетную плату AVR-USB-MEGA16 с микроконтроллером ATmega32 (проект для AVRStudio с исходниками и скомпилированными вариантами для кварцев 12 МГц, 16 МГц).
5. Макетная плата AVR-USB-MEGA16.
|
Комментарии
2014-02-2709:41:22 Подскажите где в даташитах смотреть данные для строки BOOTLOADER_ADDR ESS = 7000?
microsin: см. раздел Boot Loader Support, таблицу размера секций и адресации (таблица будет называться наподобие "Boot Size Configuration (Word Addresses)"). Адреса и размеры там указаны в словах (каждое слово размером в 2 байта). Чтобы узнать значение байтового адреса BOOTLOADER_ADDR ESS, адрес в словах из таблицы нужно умножить на 2.
Например, если Вы установили фьюзами секцию загрузки размером 2048 слов (4096 байт), то её адрес в словах, указанный в таблице, будет 0×3800. При этом BOOTLOADER_ADDR ESS будет равен 0×3800 * 2 = 0×7000.
2014-02-1701:39:26 Спасибо, заработало. Развел плату по вашей схеме, вышла платка 55х55 мм, завтра подправлю пару косяков и хочу выложить. Несложная односторонняя плата вышла, доступная для повторения.
Из пожеланий: у меня клон AVR910 на MEGA8. Вроде правильно выставил конфигурацию фьюзов, по файлу не очень все понятно что выставлять. И хотелось бы сразу тестовую програмку, допустим поморгать светодиодиком, прошить и посмотреть как все работает.
microsin: чтобы правильно выставить фьюзы для ATmega8, читайте документацию по исходному коду и даташит микроконтроллер . Тестовую программку (прошивку микроконтроллер а) можете взять из статьи "Как использовать библиотеку libusb в Visual Studio (управление макеткой AVR-USB-MEGA16)". Тупо перекомпилируйт е исходный код прошивки на Ваш микроконтроллер , и все.
2012-07-0819:36:07 Большое СПАСИБО! Все заработало! У меня 7(32бит)винда.
2012-05-1713:38:26 Спасибо, microsin что ответили но мы наверное не правильно поняли дуг друга. В том то и дело скачав «bootloadHID.2010-07-292» в папке firmware есть уже скомпилированны й hex-файл начало которого выглядит так:
:1018000050C084C069 C068C067C066C06 5C064C09D
:1018100063C062C061C060C05FC05EC05 DC05CC0CC
:101820005BC05AC059 C00403090412036F00620070
…
в общем все как положено. Прошивка начнет заливаться с адреса 1800.
И вот я ни чего не меняя выполняю команду make чтобы заново скомпилировать hex-файл. Он должен получиться как в исходном hex-файле (т.е. начальный адрес hex-файла должен быть 1800)
А у меня при выполнении команды make получается hex-файл:
:1000000050C084C0 69C068C067C066C 06 5C064C0B5
:1000100063C062C061C060C05FC05EC05 DC05CC0E4
:100020005BC05AC0 59C00403090412036F00620088
…
Он не такой как должен быть.
В чем причина? Я ни чего не менял.
microsin: большая просьба к Вам, Алексей - не пишите больше многострочных комментариев с вопросами, задавайте вопросы в почту. Здесь в комментариях я больше на подобные вопросы отвечать не буду.
Ответ на Ваш вопрос. Тут возможны варианты.
Вариант 1. Адрес расположения кода бутлоадера во flash-памяти (т. е. то, что у Вас формируется в HEX-файле с ошибкой) зависит от макропеременной BOOTLOADER_ADDR ESS. Проверьте пожалуйста её значение, и как они используется в коде программы. Возможно, что из-за ошибки в проекте эта переменная либо отсутствует, либо её значение неверно, либо код вообще не предназначен для Вашего микроконтроллер а (например, если микроконтроллер должен иметь секцию бутлоадера, а её нет). Не забудьте также про макропеременную DEVICE - она должна соответствовать Вашему микроконтроллер у.
Вариант 2. Возможно, что Вы не сделали команду make clean, и код неправильно собирается линковщиком из старых объектных файлов.
Вариант 3 (самый вероятный). Возможно, что Вы скачали проект откуда-то "неоттуда". Я попробовал скачать проект по ссылке [3], но не обнаружил там тех названий папок, о которых Вы пишете. Проект, скачанный по ссылке [3], нормально компилируется командами make clean и make, и нормально создается файл прошивки main.hex.
2012-05-1710:01:29 Скачал BootloadHID и, ни чего не меняя, выполнил команду make. В результате получил hex-файл, из которого видно что он кривой. У него нет смещения на адресс бутсекции. Хотя должно быть с адреса, указанного в makefile BOOTLOADER_ADDR ESS = 1800 для mega8.
microsin: скорее всего Вы первый раз в жизни заглянули в содержимое HEX-файла. Адреса там задаются в начале текстовых строк с данными. Посмотрите пожалуйста спецификацию формата Intel HEX, которая есть в Википедии, все сразу станет на свои места.
2011-10-2320:54:19 HIDBootFlash заработал! Похоже не хватало Visual C++ или .NET. После установки Visual C# 2008 Express все заработало.
2011-10-2300:16:45 Спасибо microsin, все работает (работало!) великолепно, но после переустановки винды HIDBootFlash.exe пишет - программа не запускается! Не сталкивались с такой проблемой?
microsin: к сожалению, не сталкивался. Наверное, поставили Windows 7? Я свою Windows XP уже наверное лет 7 не переставлял.
2011-07-2822:24:17 Существуют ли загрузчики для ATmega8535?
2011-04-0419:40:32 Можно ли собирать эту схему на ATMEGA16 в дип корпусе?
microsin: можно, не вопрос, нужно только правильно учесть цоколевку ножек.
2010-10-2513:25:04 Спасибо большое за помощь.