В статье описывается 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 USB boot loader for AVR microcontrollers site:obdev.at - домашняя страничка BootloadHID. 3. 100711bootloadHID.2008-11-26.zip - исходный код и скомпилированные прошивки проекта BootloadHID, модифицированные для использования с макетной платой AVR-USB-MEGA16. В код BootloadHID я добавил управление красным светодиодом макетной платы D1 - для индикации процесса работы загрузчика (активизация и запись памяти). 4. 100705usbasploader.zip - AVR-USB-MEGA16:USB bootloader USBASPloader для микроконтроллера ATmega32. Мой вариант usbasploader, заточенный под макетную плату AVR-USB-MEGA16 с микроконтроллером ATmega32 (проект для AVR Studio с исходниками и скомпилированными вариантами для кварцев 12 МГц, 16 МГц). 5. Макетная плата AVR-USB-MEGA16. |
Комментарии
microsin: какая у Вас операционная система - никакого значения не имеет. Чтобы устройство USB на библиотеке V-USB заработало, требуется выполнение одного простого условия - чтобы работал кварцевый генератор на своей частоте. Для этого фьюзами нужно выбрать тип генератора "External Crystal High Freq" и отключить делитель тактовой частоты. Выбрать шестнадцатеричн ые значения фьюзов Вам поможет даташит и ресурс http://www.engbedded.com/fusecalc/. Байт фьюзов LOCKOPT BYTE не меняйте, оставьте по умолчанию. Также, чтобы нормально запускался загрузчик, Вам нужно правильно установить бит BOOTRST и размер секции загрузчика битами BOOTSZ.
microsin: BOOTLOADER_ADDR ESS это адрес слова команды (внимание, это не байтовый адрес, байтовый адрес в 2 раза больше!), который задает начало кода загрузчика. Его значение зависит от марки микроконтроллер а и выставленных фьюзов BOOTSZ1 и BOOTSZ0. Само собой, фьюзы BOOTSZ1 и BOOTSZ0 должны быть предварительно установлены так, чтобы код загрузчика влез в выбранный размер секции загрузки.
microsin: к сожалению, не сталкивался. Наверное, поставили Windows 7? Я свою Windows XP уже наверное лет 7 не переставлял.
microsin: скорее всего у Вас прошит загрузчик не BootloadHID, а USBASPloader, поэтому пользоваться надо другим софтом для перепрошивки. См. описание Вашего загрузчика, как им пользоваться.
microsin: можно, не вопрос, нужно только правильно учесть цоколевку ножек.
microsin: по ссылке [5] есть принципиальная схема макетной платы AVR-USB-MEGA16. Кроме того, если скачаете русифицированну ю библиотеку V-USB (файл архива avr-usb-russian.rar), то в папке сircuits найдете множество схем. В файле bootloaderconfi g.h макросами USB_CFG_DMINUS_ BIT и USB_CFG_DPLUS_B IT порты микроконтроллер а тоже указаны.
Есть проблемка - если собирать самому (через make), и не менять подключение ножек, прошивка работает как надо. Но если изменить D- на другой соседний порт, Windows уже не определяет USB-устройство. В чем может быть проблема?
microsin: если подключили все правильно и электрическая схема в порядке, то в обычной конфигурации V-USB со сменой ножки для сигнала D- не должно быть никаких проблем (эта ножка не используется на прерывание). Может, забыли перед запуском make hex сделать очистку make clean? Других идей у меня пока нет.
RSS лента комментариев этой записи