AVR-USB-MEGA16: USB bootloader BootloadHID для микроконтроллера ATmega16 Печать
Добавил(а) microsin   

В статье описывается USB bootloader BootloadHID, который хорошо подходит для ATmega8 и ATmega16, так как у него код умещается в 2048 байт.

Загрузчик BootloadHID очень похож на USBASPloader по структуре исходного кода и принципу работы. Причем BootloadHID проще, чем USBASPloader, т. к. не поддерживает чтение flash (для проверки того, что уже записано). Следовательно, и размер кода у него меньше. За это приходится расплачиваться универсальностью - для записи нужна специальная программа (написанная специально только для BootloadHID), но зато есть возможность встроить USB bootloader в младшие модели контроллеров AVR.

BootloadHID-NO-ispconn.jpgИмея 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, земля, минус питания).

BootloadHID-select-jumper.png 

Чтобы порт 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 для программирующего загрузчика, поддерживает также командную строку и наглядно отображает процесс. Что еще надо?

HIDBootFlash-screenshot.jpg

Теперь опишу нехитрую процедуру прошивки программы с помощью USB bootloader BootloadHID (на примере макетной платы AVR-USB-MEGA16 и модифицированного кода BootloadHID, который можно скачать по ссылке [3]).

1. Поставьте перемычку между ножками 4 и 6 коннектора U1 ISP.

USBasp-bootloader-ON-IMG_0879.JPG

2. Подключите макетную плату к компьютеру по USB. На плате загорится красный светодиод, и в системе Windows обнаружится USB HID-устройство BootloadHID (драйвера не потребуются).

3. Запустите программу HIDBootFlash. Загрузите hex-файл прошивки (кнопка Open .hex File). Нажмите большую кнопку Flash Device, запускающую программирование. Программируется кристалл очень быстро, за несколько секунд. При этом красный светодиод на макетной плате будет мигать.

4. Снимите перемычку между ножками 4 и 6 коннектора U1 ISP.

USBasp-bootloader-OFF-IMG_0878.JPG

Переподключите макетную плату (выдерните и снова вставьте шнур 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.