Программирование AVR: работа с USB AVR-USB-MEGA16: USB bootloader BootloadHID для микроконтроллера ATmega16 Fri, March 31 2017  

Поделиться

нашли опечатку?

Пожалуйста, сообщите об этом - просто выделите ошибочное слово или фразу и нажмите Shift Enter.

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.

 

Комментарии  

 
0 #11 Иван 13.05.2016 19:25
Не пойму, как выставить fuse-биты. Шью через sinaprog LOW FUSE BYTE: 0xCF HIGH FUSE BYTE: 0x98, а вот LOCKOPT BYTE: 0xEF не ставится... выдает ошибку, и ставит мне 0x2F (у меня микроконтроллер atmega16). Где косяк? Кварц на 12MHz, мое устройство не определяется (на операционной системе Windows XP).

microsin: какая у Вас операционная система - никакого значения не имеет. Чтобы устройство USB на библиотеке V-USB заработало, требуется выполнение одного простого условия - чтобы работал кварцевый генератор на своей частоте. Для этого фьюзами нужно выбрать тип генератора "External Crystal High Freq" и отключить делитель тактовой частоты. Выбрать шестнадцатеричн ые значения фьюзов Вам поможет даташит и ресурс http://www.engbedded.com/fusecalc/. Байт фьюзов LOCKOPT BYTE не меняйте, оставьте по умолчанию. Также, чтобы нормально запускался загрузчик, Вам нужно правильно установить бит BOOTRST и размер секции загрузчика битами BOOTSZ.
Цитировать
 
 
0 #10 Роман 11.09.2015 11:25
Как узнать BOOTLOADER_ADDR ESS?

microsin: BOOTLOADER_ADDR ESS это адрес слова команды (внимание, это не байтовый адрес, байтовый адрес в 2 раза больше!), который задает начало кода загрузчика. Его значение зависит от марки микроконтроллер а и выставленных фьюзов BOOTSZ1 и BOOTSZ0. Само собой, фьюзы BOOTSZ1 и BOOTSZ0 должны быть предварительно установлены так, чтобы код загрузчика влез в выбранный размер секции загрузки.
Цитировать
 
 
0 #9 Сергей 23.10.2011 23:54
HIDBootFlash заработал! Похоже не хватало Visual C++ или .NET. После установки Visual C# 2008 Express все заработало.
Цитировать
 
 
0 #8 Сергей 23.10.2011 03:16
Спасибо microsin, все работает (работало!) великолепно, но после переустановки винды HIDBootFlash.exe пишет - программа не запускается! Не сталкивались с такой проблемой?

microsin: к сожалению, не сталкивался. Наверное, поставили Windows 7? Я свою Windows XP уже наверное лет 7 не переставлял.
Цитировать
 
 
0 #7 Дмитрий 29.07.2011 01:24
Существуют ли загрузчики для ATmega8535?
Цитировать
 
 
0 #6 Harry Plotter 04.04.2011 22:40
Можно ли собирать эту схему на ATMEGA16 в дип корпусе?

microsin: можно, не вопрос, нужно только правильно учесть цоколевку ножек.
Цитировать
 
 
0 #5 Владимир 25.10.2010 16:25
Спасибо большое за помощь. :-)
Цитировать
 
 
0 #4 Владимир 25.10.2010 04:34
Помогите чайнику - куда подключать D+ и D- ?

microsin: по ссылке [5] есть принципиальная схема макетной платы AVR-USB-MEGA16. Кроме того, если скачаете русифицированну ю библиотеку V-USB (файл архива avr-usb-russian.rar), то в папке сircuits найдете множество схем. В файле bootloaderconfi g.h макросами USB_CFG_DMINUS_ BIT и USB_CFG_DPLUS_B IT порты микроконтроллер а тоже указаны.
Цитировать
 
 
0 #3 Роман 02.10.2010 18:56
Спасибо microsin, теперь все работает. :-)
Цитировать
 
 
0 #2 Роман 02.10.2010 16:45
Респект автору за нужные статьи.
Есть проблемка - если собирать самому (через make), и не менять подключение ножек, прошивка работает как надо. Но если изменить D- на другой соседний порт, Windows уже не определяет USB-устройство. В чем может быть проблема?

microsin: если подключили все правильно и электрическая схема в порядке, то в обычной конфигурации V-USB со сменой ножки для сигнала D- не должно быть никаких проблем (эта ножка не используется на прерывание). Может, забыли перед запуском make hex сделать очистку make clean? Других идей у меня пока нет.
Цитировать
 

Добавить комментарий


Защитный код
Обновить

Top of Page