Как прошивать avr через usb

Обновлено: 04.07.2024

Перевод даташита "AVR282: USB Firmware Upgrade for AT90USB" [1], посвященного обновлению программного обеспечения микроконтроллера (firmware) для AVR с аппаратной поддержкой USB (так называемое семейство AVR USB, поделенное на серии. Многие представители этого семейства имеют префикс AT90USB в наименовании чипа).

Способ обновления firmware через USB, предлагаемый Atmel, обладает следующими возможностями:

• Поддерживается программой Atmel FLIP на всех операционных системах Microsoft Windows®, начиная с Windows® 98SE.
• Версия FLIP 3.2.1 и все более поздние поддерживают работу под Linux.
• Бутлоадер USB по умолчанию прописан в память чипа на заводе Atmel.
• Программирование в системе (In-System programming) через интерфейс USB не требует дополнительного внешнего аппаратного обеспечения.
• Скорость обновления firmware до 32 килобайт/сек.

Цель этого документа - показать, как нужно обновлять программное обеспечение микроконтроллера (firmware upgrade) для чипов семейства AT90USB, используя его встроенный бутлоадер и программу-утилиту FLIP.

[2. Описание]

Чипы серий AVR USB, название которых начинается с AT90USB, поставляются с фабрики Atmel с прошитым в память FLASH (память программ) бутлоадером (USB bootloader). Этот бутлоадер позволяет программировать области памяти FLASH и EEPROM через интерфейс USB.

Для того, чтобы выполнять обновление firmware, компания Atmel разработала бесплатную программу для компьютера, которую почему-то назвала "FLIP". Эта программа обладает достаточной гибкостью, чтобы позволить Вам обновлять firmware микроконтроллеров Atmel прямо в своем рабочем окружении (т. е. в составе готового электронного устройства), и при этом не требуется никакое дополнительное аппаратное обеспечения, кроме стандартного шнура USB (отдельный программатор не нужен).

Последний релиз утилиты FLIP предоставляет следующие возможности:

• Может осуществлять "программирование в системе" (In-System Programming) через интерфейсы RS232, USB или CAN (в зависимости от того, какие интерфейсы поддерживает модель микроконтроллера и Ваше конечное электронное устройство).
• Может использоваться как интуитивно понятная программа с графическим интерфейсом, а также может быть запущена из консоли команд Windows (имеется в виду программа batchisp.exe [2], входящая в пакет FLIP), из интегрированной среды разработки (IDE AVR Studio), или даже из Вашей собственноручно написанной программы.
• Позволяет редактировать буфер записываемых данных: заполнение байтом (fill), поиск по содержимому (search), копирование (copy), очистка (reset), изменение (modify), запуск программы по указанному адресу (goto address).
• Управление памятью целевого микроконтроллера (target device): очистка (erase), проверка на очистку (blank check), программирование содержимого памяти (program), проверка соответствия памяти буферу (verify), чтение в буфер (read), запись и чтение байт, управляющих уровнем защиты, и чтение и запись других специальных байт.
• Возможность автоматизации процесса программирования устройств (возможно только с помощью утилиты batchisp [2]).
• Запуск бутлоадера (срабатывание условия ISP hardware condition) может быть осуществлен программно, из кода firmware микроконтроллера.

AVR282-USB-Device-Firmware-Upgrade

[3. На каком железе это работает (Hardware Requirements)]

1. Любая отладочная плата AVR USB - например ATSTK525/STK526, AT90USBKey, AVR-USB162, AVR-USB32U4, любой кит с микроконтроллером семейства AT90USB (это может быть даже Ваше собственное устройство с чипом AVR USB).
2. Микроконтроллер семейства AT90USB (при этом необязательно в названии чипа должен быть префикс AT90USB, есть и другие микроконтроллеры, которые поддерживают FLIP через USB, например ATmega32U4).
3. Обычный стандартный кабель USB (например, с коннекторами Type A и Mini B), который подходит к Вашей плате.
4. Компьютер PC, работающий под управлением операционной системы Windows с поддержкой USB (98SE, ME, 2000, XP).

[4. Требуемое программное обеспечение (Software Requirement)]

Для перепрограммирования памяти чипа через USB бутлоадер Atmel требуется программа FLIP [3] (утилита Device Firmware Upgrade) версии 3.2.0 или более свежей.

[5. Как использовать бутлоадер]

AVR282-Bootloader-Process-fig51

Рис. 5-1. Алгоритм запуска бутлоадера.

Как показано на этом рисунке, чипы серии AT90USB имеют новый бит фьюзов (fuse bit), если сравнивать со стандартными чипами AVR. Этот фьюз называется HWBE (расшифровывается HardWare Button Enable, т. е. разрешение работы аппаратной кнопки запуска бутлоадера), и по умолчанию он разрешен. Этот новый fuse bit добавлен для того, чтобы добавить поддержку новой функции специального вывода микроконтроллера: HWB. Эта ножка имеет свойство приводить к аппаратному переходу в код секции бутлоадера (запускается бутлоадер, который позволяет загрузить программу пользователя через USB с помощью утилиты FLIP), если при сбросе (RESET) лог. уровень на ней был 0. Чтобы пользователь мог воспользоваться бутлоадером, многие киты (как например AVR-USB162 [2]) имеют две кнопки: RST чтобы выполнить сброс, другая HWB, чтобы подать лог. 0 на ножку HWB.

Прим. переводчика: иногда бутлоадер запускаются одной кнопкой, и необходимый для запуска бутлоадера уровень на ножке HWB формируется с помощью дополнительных элементов - резистора, диода и конденсатора. Так устроена например макетная плата AVR-USB162MU и Teensy 1.0. В макетной плате AVR-USB32U4 и Teensy 2.0 для запуска бутлоадера также используется одна кнопка благодаря наличию внешнего pull-down резистора на ножке HWB.

[6. Обновление firmware в микроконтроллере]

Программа-утилита "Flip" предназначена для организации процесса обновления firmware, она пересылает код бутлоадеру через USB или другие доступные интерфейсы. Утилиту FLIP можно свободно скачать с сайта Atmel или по ссылке [3].

Для того, чтобы можно было начать пользоваться бутлоадером, и с его помощью прошивать/перепрограммировать память FLASH и EEPROM, выполните следующие простые шаги:

1. Установите программное обеспечение Flip [3] (требуется Flip версии 3.0 или более свежая версия).
2. Подключите Вашу плату или устройство AT90USB (AVR-USB162 [2], AVR-USB32U4 [7], userial [6], STK525, AT90USBKey и т. п.) к компьютеру PC с использованием стандартного кабеля USB (обычно с коннекторами Type A и Mini B, такой шнур используется для подключения переносных накопителей на жестких дисках и картридеров).
3. Нажмите и удерживайте кнопку HWB (Hardware Bootloader).
4. Коротко нажмите и отпустите кнопку RST (Reset, сброс).
5. Отпустите кнопку HWB.
6. После выполнения этой процедуры операционная система обнаружит новое подключенное устройство USB и запустит диалог Мастера установки драйвера нового устройства. Просто следуйте инструкциям мастера (INF-файл и драйвер находится в поддиректории USB пути инсталляции программы Flip, обычно это папка %ProgramFiles%\ATMEL\FLIP\FLIPx.x.x\usb). После того, как драйвер установлен, то диалог мастера больше не будет появляться, и можно перейти к шагу 7. Подробно диалог установки драйвера со скриншотами можно посмотреть по ссылкам [6, 7].
7. После завершения установки драйвера Вы можете проверить, правильно ли работает Ваша плата с запущенным бутлоадером, если откроете Диспетчер Устройств (Device Manager). В дереве устройств компьютера Вы увидите папку LibUSB-Win32 Devices, в которой будет отображен чип на Вашей плате, например AT90USB162.

AT90USB162device

Рис. 6-4. Так выглядит устройство бутлоадера DFU в Диспетчере Устройств.

Теперь микроконтроллер на Вашей плате находится в режиме DFU (бутлоадер активен), и Вы можете воспользоваться утилитой FLIP для того, чтобы перепрограммировать микроконтроллер. Далее на скриншотах будет показан пример использования утилиты Flip.

1. В меню программы Flip или с помощью кнопки на передней панели с изображением микросхемы выберите название Вашего микроконтроллера. Предположим, что это AT90USB1287.

AVR282-Device-Selection-fig65

Рис. 6-5. Выбор устройства AT90USB.

2. Выберите интерфейс подключения, который будет использоваться (чаще всего это USB).

AVR282-select-USB-Communication-Mode-fig66

Рис. 6-6. Выбор режима подключения к бутлоадеру.

3. Откройте соединение с USB (USB Port Connection -> Open).

AVR282-open-USB-Communication-fig67

Рис. 6-7. Инициализация соединения через USB.

4. Выберите HEX-файл для загрузки.

AVR282-select-HEX-File-to-Load-fig68

Рис. 6-8. Запуск диалога выбора входного файла файла (File -> Load HEX File. ).

5. Теперь Вы можете загрузить файл (программу firmware) в память микроконтроллера, если нажмете на кнопку Run (слева внизу). Галочки Erase (очистка перед записью), Blank Check (проверка памяти на чистоту), Program (прошивка памяти содержимым загруженного HEX-файла), Verify (проверка записи).

AVR282-HEX-File-Loading-fig69

Рис. 6-9. Загрузка HEX-файла в память микроконтроллера.

6. Запуск на выполнение загруженной программы firmware произойдет, если после загрузки нажать кнопку Start Application (справа внизу в окне программы Flip). При этом бутлоадер перестанет работать и отключится от USB как устройство DFU, и начнет работать firmware пользователя. Это firmware может работать как другое USB-устройство (например, как клавиатура, мышь или виртуальный последовательный порт), или выполнять какие-то другие действия, заложенные в код программистом.

AVR282-Start-Application-fig610

Рис. 6-10. Запуск на выполнение программы пользователя.

[7. FAQ (часто задаваемые вопросы)]

1. Почему бутлоадер DFU перестал запускаться после того, как я прошил мой микроконтроллер через JTAGICE MKII или AVRISP?

• Когда Вы используете ISP или JTAG программатор типа JTAGICE MKII или AVRISP для перепрограммирования микроконтроллера, то первое действие, которое эти программаторы выполняют перед прошивкой - полное стирание памяти чипа (full chip erase). Эта операция очищает все содержимое памяти FLASH (заполняет её байтами 0xFF), и тем самым удаляет бутлоадер. Если вы хотите продолжить пользоваться бутлоадером, то загрузите его как HEX-файл с сайта Atmel (ссылку на бутлоадер можно найти в разделе утилиты Documents или Tools на странице сайта Atmel, посвященному Вашему используемому микроконтроллеру, см. скриншот). и далее прошейте этот файл в память чипа с использованием тех же программаторов, JTAGICE MKII или AVRISP.

AVR282-find-DFU-bootloader-at-Atmel-website

2. На моем компьютере установлена утилита FLIP версий Flip 2.4.x/3.0.x. Я установил Flip 3.1.y, и когда запустил бутлоадер, то почему не могу увидеть иконку устройства Atmel DFU у Менеджере Устройств Windows, как это показано на рис. 6-4, но иконка Jungo видна?

• Версии Flip 2.4.x и Flip 3.1.y используют разные драйверы для получения доступа у устройству USB DFU (ранее использовалось API библиотеки LibUSB, а теперь используется API драйвера Jungo). Вы можете обновить драйвер для бутлоадера следующим образом:

– Запустите Менеджер Устройств.
– Сделайте правый клик мышью на иконке AT90USB Jungo.
– Выберите обновить драйвер (Update Driver).
– Продолжите установку драйвера DFU под управлением мастера, как это показано по ссылкам [6, 7].

3. Можно ли с помощью Flip менять значение фьюзов микроконтроллера?

• Нет, утилита Flip не может модифицировать биты фьюзов (fuse bits). Для управления установками fuse bits можете использовать либо JTAGICE MKII (интерфейс JTAG или ISP), AVRISP MKII (интерфейс ISP) или параллельное программирование чипа с помощью специального программатора.

4. Для чего нужна галочка Reset возле кнопки Start Application, как это показано на рис. 6-10? Чем отличается запуск программы пользователя, когда эта галочка установлена, или когда не установлена?

• Если запускаете программу пользователя, не установив галочку Reset, то устройство для сброса не будет использовать таймер Watchdog (произойдет просто безусловный переход по адресу 0000h), и после запуска программы пользователя этот watchdog останется неактивным. Установленная галочка Reset аналогична обычному сбросу устройства, этот сброс генерируется таймером watchdog. После этого варианта запуска все ресурсы чипа очищаются, и watchdog становится неактивным. Этот обычный сброс устраняет сторонние эффекты из-за влияния работы бутлоадера на состояние чипа и его ресурсы. Однако таймер watchdog останется активным, и если watchdog не нужен, то Ваша программа должна его отключить.

[Словарик]

bootloader код в специальной секции старших адресов (Boot Section, конец памяти программ FLASH), который предназначен для загрузки приложения пользователя (Application Section, размещена с начала памяти программ FLASH, т. е. с адреса 0000H). Подробнее см. [4].

DFU Device Firmware Upgrade - обновление программного обеспечения устройства на микроконтроллере.

FLIP FLexible In-system Programmer - гибкое программирование микроконтроллера "прямо в системе", т. е. в готовом изделии. Так называется утилита Atmel [3], работающая с бутлоадером. Для каждого чипа AVR USB есть свой бутлоадрер в бинарном виде, его можно скачать с сайта Atmel (исходный код Atmel не предоставила). Есть также бутлоадер DFU с открытым исходным кодом в библиотеке LUFA (благодаря тому, что спецификация протокола DFU Flip открыта [5]).

firmware выполняемое программное обеспечение микроконтроллера, которое сохранено в перезаписываемой, энергонезависимой памяти микроконтроллера (в нашем случае это AVR, работающий как устройство USB).

HWB Hardware Bootloader, специальная ножка микроконтроллера AVR USB, которая может использоваться не только как обычный порт, но также и для запуска бутлоадера.

ISP In-System Programming, программирование микроконтроллера "прямо в системе", т. е. в готовом изделии. Это могут быть разные способы программирования (USB, JTAG, CAN), но обычно под этой аббревиатурой подразумевается 6-контактный интерфейс ISP, предназначенный для подключения к программатору.



Картинка для привлечения внимания — xkcd

Представьте себе, что вы попали на необитаемый остров. И вам жизненно необходимо запрограммировать микроконтроллер. Зачем, спросите вы? Ну, допустим, чтобы починить аварийный радиомаяк, без которого шансы на спасение резко падают.

Радуясь, что еще не забыли курс ассемблера, вы кое-как написали программу палочкой на песке. Среди уцелевших вещей каким-то чудом оказалась распечатка документации на контроллер (хорошо, что вы еще не успели пустить её на растопку!), и программу удалось перевести в машинные коды. Осталась самая ерунда — прошить её в контроллер. Но в радиусе 500 километров нет ни одного программатора, не говоря уже о компьютерах. У вас только источник питания (батарея из картошки кокосов) и пара кусков провода.

Как же прошить МК фактически голыми руками?

В качестве подопытного будет выступать МК ATtiny13 фирмы Atmel. Описанная методика работает практически с любым контроллером семейства AVR, разве что коды команд могут незначительно отличаться.

  • SCK — тактовый сигнал, синхронизирует все операции обмена данными;
  • MOSI (Master Out Slave In) — линия данных от ведущего устройства к ведомому;
  • MISO (Master In Slave Out) — линия данных, наоборот, от ведомого устройства к ведущему;
  • RESET — для разрешения прошивки по SPI нужно подать логический «0» на этот вывод.


Для своего же удобства можно добавить индикацию входных сигналов. Схема усложняется, но не чрезмерно:

Рис. 2. Схема с индикацией сигналов.

Защита от дребезга


К сожалению, просто используя кнопки для формированя сигналов SPI, хорошего результата мы не добьёмся. Причина этого — в неприятном явлении, которое называется дребезг контактов. При замыкании механические контакты соударяются, отскакивают друг от друга, и вместо одного импульса получается несколько. Для подавления дребезга придется собрать простую схему из пары логических элементов:

Рис. 3. RS-триггер для подавления дребезга.

Это RS-триггер, который переключается в состояние «1» в момент замыкания нижнего контакта переключателя и игнорирует остальные импульсы дребезга. Сброс триггера обратно в «0» происходит при замыкании верхнего контакта, то есть при отпускании кнопки.

«Ишь, разбежался!» — скажет читатель, — «Я же на необитаемом острове сижу. Где я тут возьму триггеры?» Хорошо, можно избавиться от дребезга и без электронных схем. Нужно только заменить «сухой» контакт на мокрый жидкостный. Выключателем будут служить два электрода, опускаемые в проводящую жидкость.

Сигналы MOSI и RESET не требуют подавления дребезга, в отличие от SCK: здесь значение имеет только уровень сигнала в момент выборки, а не его фронты.



Рис. 4. Временная диаграмма работы SPI.

SPI является синхронным интерфейсом: все операции синхронизированы фронтами тактового сигнала (SCK), который вырабатывается ведущим устройством. Максимальная скорость передачи ограничена величиной 1/4 тактовой частоты контроллера. На минимальную же скорость нет никаких ограничений: без тактового сигнала обмен данными «замораживается», и интерфейс может оставаться в статическом состоянии сколь угодно долго.

Передача по SPI осуществляется в полнодуплексном режиме, по одному биту за такт в каждую сторону. По возрастающему фронту сигнала SCK ведомое устройство считывает очередной бит с линии MOSI, а по спадающему — выдает следующий бит на линию MISO. Все внимание на рисунок 4.

  1. Перевод контроллера в режим программирования;
  2. (опционально) Чтение идентификатора устройства;
  3. Стирание;
  4. Запись во flash;
  5. (опционально) Проверка записанного;

Включение режима программирования

Режим программирования включается подачей «0» на ногу RESET. Но есть некоторые тонкости. Atmel рекомендует сначала выставить на выводах RESET и SCK низкий уровень, а только потом подавать на контроллер питание. Если такой возможности нет, нужно после включения питания подать «0» на SCK, а затем положительный импульс на RESET:



Рис. 5. Перевод МК в режим программирования.

Но и это еще не все. Далее нужно передать команду на собственно включение режима программирования: 10101100 01010011 xxxxxxxx xxxxxxxx



Рис. 6. Команда «Program Enable».

Биты, обозначенные как x, могут быть любыми. Во время передачи третьего байта контроллер должен переслать обратно второй байт (01010011). Если это произошло, значит, все хорошо, команда принята, контроллер ждет дальнейших инструкций. Если ответ отличается, нужно перезагрузить МК и попробовать все сначала.

Проверка идентификатора



Рис. 7. Команда «Read Signature Byte».

Прежде чем что-либо писать в память МК, нужно убедиться, что перед нами именно та модель, которая нужна. Каждая модель контроллера имеет свой трехбайтный идентификатор (Signature). Прочитать его можно командами вида
00110000 000xxxxx xxxxxxbb xxxxxxxx
Вместо bb (третий байт команды) следует подставить 00 для первого байта идентификатора, 01 — для второго и 10 — для третьего. Соответствующий байт идентификатора будет передан контроллером при отправке 4-го байта команды.

Для ATtiny13 значение идентификатора равно 00011110 10010000 00000111 (0x1E 90 07).

Очистка контроллера



Рис. 8. Команда «Chip Erase».

Следующим шагом будет очистка памяти МК, которая осуществляется посылкой команды «Chip Erase»
10101100 100xxxxx xxxxxxxx xxxxxxxx
Этой командой выполняется стирание содержимого Flash и EEPROM (все ячейки будут содержать FF), а также снятие lock-битов, если они установлены.

Запись во flash-память

Память программ (Flash) в ATtiny13 состоит из 512 двухбайтных слов (1К байт). Адрес слова имеет разрядность 9 бит. Flash-память разделена на страницы, каждая страница имеет размер 16 слов (всего получается 32 страницы). Запись во flash осуществляется в два этапа.

Сначала необходимо загрузить данные в буфер страницы, для этого используется команда «Load Program Memory Page»
01000000 000xxxxx xxxxbbbb iiiiiiii — для загрузки младшего байта слова, и 01001000 000xxxxx xxxxbbbb iiiiiiii — для загрузки старшего.
4 младших бита 3-го байта команды bbbb — адрес слова на странице, iiiiiiii — загружаемый байт. Сначала всегда должен загружаться младший байт слова, а затем — старший байт того же слова.



Рис. 9. Команда «Load Program Memory Page».

После того, как буфер страницы загружен, нужно выполнить команду «Write Program Memory Page» 01001100 0000000a bbbbxxxx xxxxxxxx для записи страницы непосредственно в память контроллера.
Младший бит второго байта и старшие 4 бита третьего a:bbbb — пятибитный номер страницы для записи.



Рис. 10. Команда «Write Program Memory Page».

Все это выглядит довольно запутанно, но ничего сложного нет. Адрес любого байта памяти программ состоит из 10 бит: ppppp:bbbb:w, где
ppppp — номер страницы (используется в команде «Write Program Memory Page»);
bbbb — адрес слова на странице (в команде «Load Program Memory Page»);
w — бит, определяющий старший или младший байт в слове (зашифрован в первом байте команды «Load Program Memory Page»).

Чтение flash



Рис. 11. Команда «Read Program Memory».

После записи прошивки в МК неплохо бы проверить записанное, так как никакой проверки целостности данных не выполнялось. Единственный способ проверки состоит в том, чтобы прочитать весь объем flash-памяти и сравнить с оригиналом.

Читать память программ легче, чем писать в нее. Забудьте про страничную организацию, чтение выполняется побайтно. Команда «Read Program Memory» выглядит так:
00100000 0000000a bbbbbbbb xxxxxxxx — для чтения младшего байта слова, и 00101000 0000000a bbbbbbbb xxxxxxxx — для старшего.
Младший бит второго байта и весь третий байт a:bbbbbbbb — адрес слова в памяти. Прочитанный байт возвращается во время передачи 4-го байта команды.

Завершение программирования

Пожалуй, самая простая операция. Чтобы завершить программирование и перевести МК в рабочий режим, достаточно подать на RESET логический уровень «1». Контроллер запустится и будет работать по новой программе.


Настало время воспользоваться полученными знаниями на практике. Жертва эксперимента — ATtiny13 — воткнут в макетную плату, рядом собран формирователь сигналов, всё готово:

Рис. 12. Экспериментальная схема.

Шить будем программу вида «проще некуда»:

Всё, что она делает — это выдает единицу на ногу PB1 и уходит в бесконечный цикл. В машинных кодах она занимает всего четыре слова:

Для прошивки её в контроллер необходимо набрать следующие команды:

Ключ на старт, поехали!

Всего 425 нажатий, и МК оживает. Теперь вас точно найдут и спасут с этого проклятого острова.

В статье описывается, как быстро запустить USB bootloader для микроконтроллера ATmega32 на примере загрузчика usbasploader компании Objective Development.

Технология USB bootloader дает одну-единственную возможность — отсутствие необходимости в специальном программаторе для замены программного обеспечения (firmware) в приборе — достаточно подключения к компьютеру по USB. Больше нет необходимости таскать с собой программатор, так как компьютер и USB есть везде. Если Ваша макетная плата оснащена bootloader, то можно сэкономить деньги на покупке программатора или время на его изготовлении — это бывает немаловажно для начинающих.

Для AVR понаделано очень много bootloader-ов — см. [1]. Для статьи я выбрал именно usbasploader [2] потому, что он совместим с очень популярным программатором USBasp. Это позволяет перепрошивать firmware как под Linux, так и под Windows с использованием популярных программ (см. [3]) avrdude, eXtreme Burner — AVR, Khazama AVR Programmer и даже из среды программирования BASCOM-AVR (система программирования на бейсике BASCOM-AVR — маленькое чудо, достойное отдельной статьи). Кроме того, usbasploader поставляется со всеми исходниками, отлично задокументирован и легко адаптируется под нужды пользователя (об этом далее).

Загрузчик usbasploader работает очень просто — при подключении к USB он прикидывается программатором USBasp. Поэтому все программы, его поддерживающие, будут перезаписывать firmware в Вашем устройстве, как будто они используют программатор USBasp. Bootloader расположен в старших адресах flash-памяти программ микроконтроллера, и записывает программу пользователя в младшие адреса (обычно начиная с адреса 0), т. е. при перепрошивке микроконтроллера bootloader не затирается. После окончания записи bootloader передает управление программе пользователя. Теперь подробнее, как это работает с микроконтроллерами ATmega, на примере ATmega32.

Для ATmega32 usbasploader скомпилирован так, чтобы он размещался во flash с адреса 7000h (напомню, что адресное пространство памяти программ ATmega32 составляет 0000h..7FFFh, и адрес команды кратен двум байтам, т. е. адреса команд лежат в диапазоне 0000h..37FFh). Для программы пользователя остается свободным пространство 0000h..6FFFh (28672 байт). Загрузчик usbasploader использует заложенную в микроконтроллер ATmega32 возможность запуска с адреса, расположенного в старших адресах памяти программ (доступно несколько фиксированных адресов, выбираемых перемычками — фьюзами, см. [4]). Чтобы при включении питания и сбросе управление всегда передавалось на адрес 0x7000, необходимо запрограммировать перемычки (фьюзы, fuse-bits) BOOTSZ0 и BOOTSZ1 в соответствующее состояние (под bootloader должно отводиться 4000h байт, или 2048 слов кода программы), а также запрограммировать перемычку BOOTRST. После этого код при сбросе или включении будет стартовать не с адреса 0, а с адреса 3800h в словах команд AVR, или с адреса 7000h в байтах flash (напомню, что минимальный размер команды AVR — два байта).

Получив управление после сброса, код usbasploader проверяет условие своей активизации, т. е. сигнал, по которому он должен начать работать как программатор USBasp. Обычно таким сигналом является замыкание какой-нибудь ножки на землю. Для макетной платы в качестве такой ножки я выбрал PB5 микроконтроллера ATmega32. Эта ножка является одновременно и сигналом MOSI, выведенным на коннектор, поэтому перемычкой между контактами 4 и 6 коннектора U1 ISP очень удобно подавать на PB5 сигнал лог. 0. Итак, код usbasploader проверяет уровень на порте PB5, и если там лог. 0 (перемычка между ножками 4 и 6 коннектора U1 ISP установлена), то начинается работа как программатора USBasp. Т. е. при установленной перемычке в момент включения питания bootloader активизируется, и если его подключить к компьютеру, то в компьютере появится USB-устройство USBasp. Если в момент включения питания перемычки нет (при этом на PB5 микроконтроллером читается лог. 1), то usbasploader сразу передает управление в программу пользователя (на адрес 0). Вот такой нехитрый алгоритм запуска.

В usbasploader есть возможность изменить поведение bootloader, для этого достаточно отредактировать три функции (они очень простые, и находятся в файле bootloaderconfig.h) — bootLoaderInit, bootLoaderCondition, bootLoaderExit. Назначение функций практически очевидно по названиям. Функция bootLoaderInit предназначена для конфигурирования окружения, в котором возможно отслеживание условие активизации bootloader:

static inline void bootLoaderInit( void ) <br> DDRB |= (1 << PB0); //выход для красного светодиода <br> //на PB5 (MOSI, контакт 4 коннектора U1 ISP) подключаем pull-up и зажигаем светодиод <br> PORTB |= (1 << PB5)|(1 << PB0); <br>>

Код очень прост — он только подключает на ножку PB5 подтягивающий к плюсу внутренний нагрузочный резистор (pull-up) — это позволяет определить наличие перемычки между контактами 4 и 6 коннектора U1 ISP, и зажигает красный светодиод на макетке. Функция bootLoaderCondition предназначена для проверки — есть или нет перемычка между контактами 4 и 6:
static inline uint8_t bootLoaderCondition() <br> if (!(PINB & (1 << PB5))) <br> return 1;<br> > <br> else <br> // no boot loader <br> return 0;<br> ><br>>
Если перемычка стоит, то ножка PB5 читается как лог. 0, и функция bootLoaderCondition вернет 1 (что означает — bootloader работает). Если перемычки нет, то функция вернет 0, что означает неактивность для bootloader (управление немедленно передается по адресу 0 — в программу пользователя). Функция bootLoaderExit у меня не делает ничего, только гасит красный светодиод макетки:

Приведенный код для функций bootLoaderInit, bootLoaderCondition, bootLoaderExit можно рассматривать в качестве примера — их можно и нужно переделать под Ваши нужды, и тогда usbasploader будет работать именно так, как Вы хотите. В заключение опишу процесс по шагам на платформе Windows (предполагается, что у Вас уже установлены AVRStudio и среда WinAVR. Если нет — читайте инструкции, как их установить, по ссылке [6]).

[Как встроить в Ваш проект usbasploader]

1. Нужно скачать последнюю версию usbasploader (см. [2]), например USBaspLoader.2009-03-20.zip. Если у Вас макетная плата AVR-USB-MEGA16, то предлагаю скачать вариант по ссылке [5] — там уже все готово, и шаги 2, 3, 4 можно пропустить. Распаковываете в любую удобную папку.

2. Отредактируйте установки в Makefile. Там нужно поменять:
а) определение F_CPU — частоту в Гц, на которой работает микроконтроллер. Домустимы частоты 12, 15, 16, 16.5 и 20 МГц.
б) определение DEVICE под Ваш тип микроконтроллера.
в) адрес (формат шестнадцатеричный, единицы в байтах) загрузки кода usbasploader BOOTLOADER_ADDRESS.
г) (необязательно, если Вы будете прошивать чип не из Makefile) проверить и при необходимости скорректровать определения FUSEOPT и LOCKOPT, а также определение AVRDUDE.

3. Отредактируйте bootloaderconfig.h. Там нужно проверить и при необходимости поменять:
а) макрос USB_CFG_IOPORTNAME — буква имени порта, к которому подключены сигналы USB D- и D+.
б) макросы USB_CFG_DMINUS_BIT и USB_CFG_DPLUS_BIT — номера портов, которым подключены сигналы D- и D+. Сигнал D+ обязательно должен быть подключен на ножку прерывания INT0.
в) код функций bootLoaderInit, bootLoaderExit и макрос bootLoaderCondition.

4. Перекомпилируйте проект, для этого введите make. В командной строке увидите что-то наподобие:

image

После успешной компиляции получите в корневой папке проекта файлы main.bin и main.hex — готовая прошивка для usbasploader. Кстати, в папке hexfiles уже есть несколько скомпилированных версий прошивок для кристаллов ATmega8, ATmega88, ATmega168, на разные частоты кварца.

5. Необходимо с помощью программатора прошить в чип код usbasploader, правильно установить фьюзы. Смысл этой операции — код usbasploader необходимо положить в верхнюю область памяти (по адресу BOOTLOADER_ADDRESS), и установить фьюзы таким образом, чтбы при сбросе или включении питания начал выполняться код bootloader (я уже об этом писал). Подробности по фьюзам см. по ссылке [4] и в даташите на Ваш микроконтроллер. Для микроконтроллера ATmega32, например, фьюзы должны быть установлены следующим образом:
LOW FUSE BYTE: 0xCF
HIGH FUSE BYTE: 0xD8 (можно и 0x98, чтобы разрешить JTAG-отладку)
LOCKOPT BYTE: 0xEF

Макетную плату AVR-USB-MEGA16 можно приобрести с уже прошитым usbasploader и фьюзами, поэтому шаги 1, 2, 3, 4, 5 проделывать не нужно.

6. Необходимо подключить прошитую макетную плату к компьютеру по USB. Если ничего не напутали, то макетка определится в системе как новое устройство и система Windows запросит драйвер. Драйвер можно скачать со странички [2], или взять из архива по ссылке [5]. Для Linux драйвер не нужен.

7. Нужна одна из программ, работающих с программатором USBasp (см. ссылки [3]). Для пользователей Linux подойдет avrdude, а для пользователей Windows выбор очень широк. Я рекомендую Khazama AVR Programmer с очень простым и удобным интерфейсом.

image

image

[Как работать с загрузчиком usbasploader на примере макетки AVR-USB-MEGA16 и Khazama AVR Programmer]

image

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

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

image

3. Запустите программу Khazama AVR Programmer. В настройках уберите опцию очистки памяти кристалла (Command -> Program Options -> снимите галку Erase Chip). Выберите из выпадающего списка Ваш чип. Загрузите hex-файл прошивки (через меню File -> Load FLASH file to Buffer). Нажмите большую кнопку Auto Program, запускающую программирование. Программируется кристалл очень быстро, за несколько секунд.

После окончания программирования красный светодиод погаснет, и начнет выполняться Ваша программа с адреса 0 (которую Вы только что записали).

image

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

UPD100711: написал статью про другой USB bootloader — BootloadHID. По исходному коду и стилю работы очень похож на USBASPloader. Отличается тем, что требует специальной программы на компьютере, но зато легче встраивается в младшие чипы (начиная с ATmega8), т. к. снижены требования к размеру bootloader-секции.

Популярнейшая программа AVRDUDE_PROG 3.3 предназначена для программирования микроконтроллеров AVR ATmega и ATtiny:
1. Возможность самостоятельного добавления программаторов, настройки скорости программирования и т.п;
2. Возможность самостоятельного добавления МК;
3. Редактирование и настройка отображения Fuses битов;
4. Выбор инверсных или прямых Fuses битов;
5. Окна вывода значений Fuses битов в HEX формате;
6. Сохранение настроек программирования при закрытии программы, т.е. при последующем открытии все настройки восстановятся.

programma-avrdude_prog-3-3

В прошлой статье я рассказал о простом (но очень хорошем) программаторе для прошивки микроконтроллеров AVR ATmega и ATtiny - USBASP AVR программатор. В той же статье я указал какие программы поддерживают данный программатор. Наиболее лучшей из них, на мой взгляд, является программа AVRDUDE_PROG автором которой является Сергей Боднар. О ней мы сегодня и поговорим.
Последняя версия программы AVRDUDE_PROG - 3.3 , из программы всегда можно попасть на сайт разработчика и скачать новые версии.
Программа очень проста в использовании, имеет приятный интуитивно понятный интерфейс на русском языке, поддерживает очень много различных программаторов и практически все микроконтроллеры ATmega и ATtiny. Немаловажно и то, что в программу можно самому вносить изменения - добавлять программаторы, микроконтроллеры, изменять некоторые настройки (все подробно расписано на сайте разработчика).
Программа не требует установки на компьютер, необходимо только разархивировать скачанный файл и можно сразу приступать к работе, поддерживаются все разновидности Windows - от ХР до 10.

Окно запущенной программы AVRDUDE_PROG:

vneshniy-vid-okna-avrdude_prog-3-3

Что есть что:
1:
- окно выбора типа микроконтроллера
- кнопка "Стереть все" - очищает все внутренности микроконтроллера


2:
- чтение калибровочных ячеек микроконтроллера

chtenie-kalibrovochnyih-yacheek


В данном примере показаны четыре калибровочные ячейки микроконтроллера ATmega8 для внутреннего RC генератора:
ВВ - для частоты 1 МГц (частота по умолчанию)
BD - для частоты 2 МГц
В2 - для частоты 4 МГц
В2 - для частоты 8 МГц
При тактировании микроконтроллера ATmega8 частотой 1 МГц от внутреннего RC генератора (по умолчанию) содержимое первой калибровочной ячейки автоматически учитывается микроконтроллером для подстройки внутреннего генератора. При других частотах - содержимое соответствующей калибровочной ячейки необходимо вручную вводить в регистр микроконтроллера для получения более стабильной частоты (если такое нужно). К примеру, в конструкции "Трехканальный термостат, термоморегулятор, таймер. ", которая работает с тактовой частотой 8 МГц от встроенного генератора с внутренней RC цепочкой, требуется перед прошивкой ЕЕPROM памяти записать в определенную ячейку HEX файла значение калибровочной ячейки для частоты 8 МГц.
3:
- выбор HEX файла для прошивки Flash памяти микроконтроллера, сверка записанного файла с оригиналом, чтение данных из памяти
4:
- выбор HEX или EEP файла для прошивки EEPROM памяти микроконтроллера, сверка и чтение
5:
- выбор программатора (по умолчанию - USBASP)

Если вы будете пользоваться программой скачанной с сайта разработчика то там, по умолчанию (первым в списке), будет идти "USBASP", у меня на картинке 4 разновидности USBASP программатора:
- Usbasp_1M
- Usbasp_4M
- Usbasp_8M
- Usbasp-32кГц
Дело в том, что программатор USBASP позволяет записывать файлы прошивки с двумя скоростями:
- для МК с тактовой частотой 1,5 МГц и выше (без перемычки на J3) - скорость записи 375 кГц
- для МК с тактовой частотой менее 1,5 МГц (с перемычкой на J3) - скорость записи 5 кГц
Для нормальной записи прошивки в МК требуется скорость в 4 раза меньше, чем установленная тактовая частота.
Для прошивки нового МК, у которого по умолчанию тактовая частота 1 МГц, необходимо устанавливать в программаторе перемычку на разъем J3, а сама скорость - 5 кГц, в некоторых случаях начинает нервировать.
Для того, чтобы не портить нервы, не дергаться с перемычкой, я программно установил 4 варианта скорости записи, которые выбираются в зависимости от текущей тактовой частоты МК:
- Usbasp_1M - скорость 187,5 кгЦ, для частот 1-4 МГц
- Usbasp_4M - скорость 375 кГц, для частот 4-8 МГц
- Usbasp_8M - скорость 750 кГц, для частот 8 и более МГц
- Usbasp-32кГц - скорость 4 кГц, для часового кварца
Все эти установки прописаны в самом начале файла "programm.ini" где скорость записи зависит от ключа "-В" и числа после него:

fayl-rogramm

znacheniya-klyucha-v-dlya-skorosti-programmirovaniya

6:
- выбор отображения FUSE битов - прямой (как в UniProf и даташитах) и инверсный (как в PonyProg)
7:
- окно вывода служебной информации о выполняемых и выполненных операциях

Внешний вид окна "FUSES" программы AVRDUDE_PROG:

okno-ustanovki-fuse

Тут все просто - расставляем в нужном виде галочки или убираем их и программируем FUSE биты. Если что-то намудрили - нажатие кнопки "По умолчанию" приведет установки FUSE битов в значения "по умолчанию" (сами FUSE биты в МК не изменятся!). Очень внимательно устанавливайте FUSE биты - ошибка может привести к отказу микроконтроллера.

Хочу обратить ваше внимание на самую распространенную ошибку при установки FUSE битов. В большинстве случаев мы изменяем только биты ответственные за выбор источника тактирования и частоту тактирования, к примеру для ATmega8 это: CKSEL0-CKSEL3. По умолчанию у ATMEGA8 тактовая частота 1 МГц от внутреннего генератора - сброшен бит CKSEL0 (стоит галочка). Нам, допустим, нужно установить тактовую частоту 8 МГц от внутреннего генератора - сбросить бит CKSEL2 (поставить галочку), что мы и делаем. Но при этом ЗАБЫВАЕМ УСТАНОВИТЬ БИТ CKSEL0 (убрать галочку)!. В результате, программируя FUSE биты, мы получаем совершенно иной результат - программа не работает, а МК не реагирует на программатор. Забыв сбросить бит CKSEL0 мы получаем другой источник тактирования МК - внешний RC. Отчаиваться не надо, главное разобраться в том, что вы получили в результате. В нашем примере - внешний RC, смотрим даташит, подсоединяем к соответствующим входам МК сопротивление и конденсатор (по схеме из даташита и с нужными номиналами) и восстанавливаем контроль над МК.

Внешний вид окна "Автоматическое программирование" AVRDUDE_PROG:

vneshniy-vid-okna-avtomaticheskoe-programmirovanie

Здесь можно задать первоначальные настройки для разных случаев использования программы.

Как видите - программа AVRDUDE_PROG проста и понятна в использовании, за что и скажем спасибо Сергею Боднару!

Читайте также: