Завантажники (bootloader) для мікроконтролерів avr, avr, programming

Описано технологію bootloader. вбудована в усі мікроконтролери Atmel AVR сімейства ATmega. Матеріал для статті взято з сайту scienceprog.com.

Можливо, що найзручніший і правильний метод програмування мікроконтролера - використовувати програму бутлоадер. Оскільки Вам не треба використовувати спеціальні адаптери для програмування або спеціальні знання - потрібно просто підключити стандартний кабель від Вашого PC до цільової платі і запустити на PC спеціальну програму, яка з'єднується з програмою бутлоадер, записаної в мікроконтролері. Ідея проста:

Завантажники (bootloader) для мікроконтролерів avr, avr, programming

Безсумнівно, найзручніший для користувача інтерфейс завантаження - USB. Цей інтерфейс дуже популярний, працює на всіх операційних системах. Але протокол USB досить складний, тому вбудовування bootloader в мікроконтролер, який не має апаратної підтримки USB, зажадає значного обсягу коду (до 2 кілобайт). Найбільш поширена програмна реалізація протоколу USB від компанії Objective Development - V-USB [6]. Є також інша програмна реалізація - USBtiny [7].

Для мікроконтролерів AVR з апаратним інтерфейсом USB (наприклад, AT90USB162) компанія Atmel пропонує фірмові завантажувачі по USB. Деякі мікроконтролери поставляються із заводу з уже прошитим в пам'ять завантажувачем (наприклад, все той же AT90USB162). Технології, що застосовуються для такого bootloader, називаються DFU і Flip. Детальніше див. [5].

[Різноманітність бутлоадер для AVR]

Багато AVR bootloader використовують COM-порт для з'єднання з PC. Це добре працює, якщо використовується апаратний міст USB-USART. Якщо пишеться бутлоадер самостійно, то не факт, що він відразу почне працювати. Обов'язково потрібно налагодження, і уважне читання документації на мікроконтролер. У списку можна побачити вже готові популярні бутлоадер, якими можна скористатися (список може бути і більшим):
* Atmex site: ladyada.net. COM, 19200bps, Assembler; JAvrProg (Java), ATtiny2313 (8-16Mhz);
* AVR Bootloader Programmer Peter Dannegger site: mikrocontroller.net. COM, Assembler; ATmega8 / 16/32/128;
* AVRProg-compatible Bootloader Martin Thomas site: siwawi.arubi.uni-kl.de. COM, WinAVR (C); AVRProg; Various AVRs and speeds;
* USBisp Bootloader Matthias Weisser site: matwei.de. USB, COM, AVR-GCC (C); AVRProg; STK-500; ATmega8, FT245BM; 6MHz;
* Bootloader ATmega8 AVR microprocessor site: stratoserver.net. COM, 19200bps, ASM, AVRProg; ATmega8 7.3728MHz;
* Chip45boot site: chip45.com. COM, 11500bps, WinAVR; HyperTerminal; Various AVR
* STK500-Bootloader Pascal Stang. COM, Hex; AVRProg; STK500; ATmega8-128; 7.3 - 22.1MHz
* AVR109 (AVR Butterfly) site: atmel.com. COM, IAR (C); ATmega series; 12MHz;
* AVRUSBBoot - USB bootloader for Atmel AVR controllers site: fischl.de. USB, AVR-GCC; ATmega8 (other Megas); 12MHz;
* Megaload site: microsyl.com. COM, 11500bps, ICCAVR (C); Megaload.NET; Various AVR;
* BootloadHID site: obdev.at. USB, HID, WinAVR; ATmega8;
* Crypto-Boot site: wikidot.com. USB, IAR (C); Crypted AES; ATmega32; 12MHz.

Більшість бутлоадер розраховане на COM-порт, який вже застарів і в сучасних комп'ютерах зустрічається рідко. Найбільш простий спосіб адаптувати ці бутлоадер на USB - використання апаратного моста USART <-> USB типу FT245BM. Але ймовірно більш зручно, коли USB підключений безпосередньо до мікроконтролера, і частина комунікації бутлоадер зроблена драйвером USB програмно-апаратних засобів.

Завантажувач (bootloader) - одна з основних речей, що відрізняє Adruino від простого мікроконтролера AVR компанії Atmel. Коли Ви збираєте свою плату, або коли випадково купили на ebay плату, що не прошиту загрузчиком, то Вам потрібен зовнішній програматор ISP, щоб прошити в пам'ять мікроконтролера завантажувач.

Завантажники (bootloader) для мікроконтролерів avr, avr, programming

Умова запуску завантажувача. Є завантажувачі, які відразу передають управління в програму користувача (без затримки), якщо не виконана умова завантаження. Це іноді робиться для того, щоб прискорити запуск програми користувача. Умова завантаження може бути різним, але найчастіше це перемичка, яка замикає на землю певний (відомий заздалегідь користувачеві) висновок мікроконтролера. Якщо перемичка встановлена, то умова завантаження виконується, і завантажувач чекає початку завантаження, не передаючи управління в програму користувача.

[На що потрібно звернути увагу при програмуванні завантажувача]

Вибір завантажувача. Оскільки можуть бути різні варіанти реалізації цільової системи - може бути застосована різна модель мікроконтролера (ATmega168, ATmega328, ATmega32U4 і т. П.). Завантажники для різних моделей мікроконтролерів можуть бути несумісними один з одним.

Частота кварцового резонатора. Обов'язково переконайтеся, що прошиває Вами завантажувач точно відповідає робочій частоті системи, різна частота кварцового резонатора (зазвичай 8 або 16 МГц, але можуть бути й інші варіанти). Робоча частота мікроконтролера зазвичай залежить від конфігурації фьюз і частоти зовнішнього кварцового або керамічного резонатора.

Фьюз. Для правильного функціонування завантажувача важливі 2 аспекти, які конфігуруються фьюз - вибір розміру секції завантаження (фьюз BOOTSZ1, BOOTSZ0), дозвіл роботи завантажувача (фьюз BOOTRST), а також конфігурація тактової частоти (фьюз, керуючі генератором тактової частоти і прескалером - CKDIV8, SUT1, SUT0, CKSEL3..0).

Якщо Ви неправильно прошиє фьюз BOOTSZ1, BOOTSZ0, BOOTRST, то код завантажувача НЕ буде запускатися, і завантажувач працювати не буде. Точно також якщо Ви неправильно сконфігуріруете фьюз тактовий генератор і прескалер, то мікроконтролер може заробити на тій частоті, на яку завантажувач не розрахований, і працездатність завантажувача також буде порушена. Для обчислення правильного значення фьюз Вам допоможе калькулятор фьюз [6].

У таблиці я привів найпопулярніші завантажувачі і конфігурації для них. Фьюз вказані в шістнадцятковому значенні, де HFUSE це старший байт фьюз, LFUSE молодший байт фьюз, EFUSE байт розширених фьюз.

Таблиця 4. Завантажники Arduino UART.

Прошивки загрузчиков Arduino можна знайти в папці, де встановлена ​​система розробки Arduino, зазвичай це папка з повним шляхом зразок c: \ Program Files \ Arduino1.0.6 \ hardware \ arduino \ bootloaders. Там же можна знайти вихідний код загрузчиков. Також готові прошивки і вихідний код всіх загрузчиков можете завантажити за посиланням [9], див. Папку arduino \ bootloaders \ HEX архіву, і шукайте там імена файлів прошивок, зазначені в таблицях 4, 5, 6 (ім'я файлу прошивки зазначено в стовпці Прошивка) .

Таблиця 5. Завантажники Atmel DFU.

Розмір секції завантаження, байт

Таблиця 6. Завантажники USBasp.

Розмір секції завантаження, байт

[Вихідний код загрузчиков]

У деяких випадках може знадобитися перекомпіляція прошивки завантажувача - наприклад, якщо Ви використовуєте особливу частоту кварцу, або якщо Вам необхідно внести корективи в поведінку завантажувача.

У таблиці я привів опис найпопулярніших загрузчиков, які використовуються в Arduino-сумісних платах. Вихідний код загрузчиков разом з готовими прошивками можна скачати за посиланням [9].

Таблиця 7. Різновиди загрузчиков, які можна використовувати для платформи розробки Arduino.

ATmega8, ATmega168, ATmega328 та інші

Використовується для більшості плат Arduino, коли код завантажується через міст USB-UART.

ATmega32U4 і інші

Застосовується для випадків, коли мікроконтролер AVR має на борту апаратний інтерфейс USB. Завантажувач заснований на протоколі Atmel DFU Flip і відкритої бібліотеці LUFA.

Застосовується для плат metaboard. Завантажувач заснований на відкритій бібліотеці V-USB, емулює поведінку популярного програматора USBasp.

Як компілювати. Для компіляції Вам потрібно тулчейн AVR-GCC, доступний для більшості операційних систем - Linux, Mac OS, Windows. На операційній системі Windows тулчейн можна отримати, якщо завантажити і встановити пакет WinAVR або середовище розробки Atmel Studio.

Компілюється завантажувач командами утиліти make. Зазвичай для цього потрібно зайти в каталог з вихідним кодом завантажувача, і виконати 2 команди:

Після цього в поточному каталозі з'явиться файл з розширенням HEX - готова прошивка завантажувача, яку потрібно записати в пам'ять мікроконтролера за допомогою звичайного ISP-програм (не забудьте також правильно встановити фьюз мікроконтролера!).

Настанови щодо збирання і настроюється опцій можна зазвичай отримати, вивчаючи вміст файлу Makefile проекту завантажувача, і супутні файли документації readme.txt.

[Приклад конфігурації завантажувача Arduino UART]

Процес отримання прошивки завантажувача складається з попереднього конфігурації Makefile. де налаштовуються опції (якщо це необхідно) і подальшої компіляції командами make clean і make. Звичайно ж, для компіляції у Вас повинен бути встановлений тулчейн (компілятор AVR GCC і бібліотеки). На операційній системі Windows тулчейн можна отримати, якщо встановити пакет розробки WinAVR або Atmel Studio.

Коли потрібно отримати завантажувач для Arduino, то найчастіше (в залежності від типу плати або Вашої конструкції) це мікроконтролер ATmega328, або рідше ATmega168, ATmega8, ATmega32U4. Тому спочатку потрібно вибрати, який завантажувач використовувати. Майже всі завантажувачі можна знайти в папці установки Arduino c: \ Program Files \ Arduino1.0.6 \ hardware \ arduino \ bootloaders, розподілені по підкаталогам atmega8, atmega і іншим.

Вибір завантажувача. Якщо Вам потрібен завантажувач для ATmega8, то його вихідний код і Makefile знаходиться в папці atmega8. Якщо потрібен завантажувач для ATmega168 або ATmega328, то см. Папку atmega. Якщо потрібен завантажувач для ATmega32U4, то його можна знайти в бібліотеці LUFA, см. Папку Bootloaders \ DFU.

Примітка: вихідний код і прошивки загрузчиков можна скачати за посиланням [9].

• DEFS. У цій опції вказана тактова частота системи через значення макропеременной F_CPU. Наприклад, якщо вказана опція:

то це означає, що прошивка буде скомпільована в розрахунку на тактову частоту 8 МГц. 8 МГц зазвичай використовується, якщо працює внутрішній RC-генератор мікроконтролера AVR. Якщо у Вас використовується інша тактова частота, що задається зовнішнім кварцовим резонатором, то вкажіть поруч з -DF_CPU = тактову частоту в Герцах. Найчастіше використовується тактова частота 16 МГц, т. Е. Потрібно вказати -DF_CPU = 16000000.

Примітка: важливо вказати правильну тактову частоту тому, що до цього значення прив'язана настройка послідовного порту UART, через який завантажувач отримує код від хоста (з системи розробки Arduino IDE за допомогою виклику утиліти програмування AVRDUDE). Неправильне налаштування UART призведе до того, що завантажувач не зможе отримати код програми користувача, і мікроконтролер НЕ буде перепрошивати через завантажувач.

На цьому конфігурація завантажувача можна вважати закінченим. Для отримання прошивки завантажувача залишилося виконати послідовність з двох команд:

Після компіляції вийде файл ATmegaBOOT.hex, який можна за допомогою програматора ISP записати в пам'ять мікроконтролера ATmega8. Не забудьте після програмування завантажувача правильно встановити фьюз мікроконтролера (див. Таблицю 4).

Таблиця 8. Вибір мети (target) в Makefile для ATmegaXX8.

Примітка: мета Target, зазначена в таблиці, підставляється як опція команди make при компіляції прошивки:

make clean
make <тут надо указать Target>

Перше, що Вам потрібно зробити, це вибрати мету для компіляції (варіант з шпальти Target таблиці 6) в залежності від плати, яка у Вас використовується. Припустимо, що у Вас саморобна плата на мікроконтролері ATmega328, для якої Ви збираєтеся зробити свій завантажувач. Тоді мета для компіляції у Вас буде atmega328, прошивка виходить виконанням 2 команд:

Якщо у Вас використовується інша тактова частота, то перевірте значення макропеременной AVR_FREQ (за замовчуванням для мети atmega328 задана тактова частота 16 МГц: AVR_FREQ = 16000000L). Після компіляції отримаєте прошивку ATmegaBOOT_168_atmega328.hex, яку можна записати в пам'ять Вашого мікроконтролера за допомогою програматора ISP. Увага, не забудьте також правильно встановити фьюз мікроконтролера (див. Таблицю 4).

До вашого списку можу додати бутлоадер, написаний для інтерфейсу RS-485. На сайті avr-assm.ru викладений исходник завантажувача на асемблері і програма для комп'ютера.

Добрий день.
А з софта на стороні РС що порадите? avrdude?
Щоб на нього gui потім навісити.
За сценарієм: замовник під'єднав пристрій, запустив програму оновлення софта, натиснув кнопку "ОК" і пристрій прошу?

microsin: так, avrdude найкраще. Над ним оболонка є, avrdude-gui. Якщо використовуєте завантажувач USBasp, то також підійдуть GUI-утиліти Khazama 1.6.2 і eXtreme Burner.

Спасибі всім, хто ділиться інформацією, особлива подяка ентузіастам, які підтримують роботу сайту! Якби не ваша допомога, послав би я замовників в довгий еротичний шлях, а тепер - підточив свої ASM-вихідні коди і підсунь під Ардуінкіну оболонку - ну хоче клієнт, що б було йому зрозуміло де setup, а де головний цикл програми loop)

Цитую Kaseiiro: І знову ж, суб'єктивно - bootloader для AVR НІ В ЯКОМУ РАЗІ НЕ ТРЕБА ПИСАТИ САМОСТІЙНО, оскільки краще, ніж вже вже понаписувано (причому стільки, що ні розгребе), Ви ніколи не напишете.
Я, мабуть, більшої дурниці, ніж ця, ще не чув. Пишу на чистому Асмі для AVR вже 10 років (писав і TCP-UDP), і завжди намагаюся все писати своє - в цьому і принадність контролера - за все можеш відповідати сам. І як же знайти завантажувач з шифруванням прошивки, що б передавати своїм клієнтам нові версії без можливості копипаста вашого пристрою, а?

microsin: це Ваш вибір - витрачати чи ні власні зусилля на винахід велосипеда. Адже багато програмують не те щоб для власного задоволення, як Ви, наприклад, а просто тупо виконують доручену роботу, т. Е. Вирішують поставлене завдання максимально ефективно. А коли і стеки TCP, і та бібліотеки для шифрування, і багато-багато іншого - вже є на блюдечку з блакитною облямівкою - ніхто при здоровому глузді не вирішиться витрачати даремно дорогоцінний робочий час.

Конче потрібен бутлоадер працює на ATmega16, але по rs485 інтерфейсу. Тобто бутлоадер повинен ще й дригати який-небудь ніжкою мікроконтролер а, щоб перемикати драйвер max485 то на прийом, то на передачу. Є такий?

microsin: думаю, Вам потрібно взяти за основу бутлоадер для COM-порту (RS232, USART) і трошки його доопрацювати, щоб перемикалася напрямок передачі даних. Бутлоадер RS232 для AVR знайти не проблема.

У мене питання по старту буту. Чи можна як-небудь зробити, щоб можна було обходиться без перемички? Т. е. Щоб просто підключив девайс до USB і сам USB хост повідомив йому, що треба стартанути бут? Наприклад в основному коді придумати як йому зробити рестарт, а перед рестартом ще в еепрому, наприклад, прапор якої-небудь встановити, щоб по рестарту він не виходив з буту, поки прошивки не поглине? Ну або якось так?

Чи є бутлоадер для утиліти AVRprog, що знаходиться в складі AVRStudio?

Компілятору-то навіщо знати про "менше пам'яті"? Самі помітите. А завантажувачу затирати себе можна і заборонити.
І все ж, суб'єктивно: завантажувач краще писати самостійно.

microsin: з приводу компілятора - Ви маєте рацію, якщо не замислюватися від тому, що НАСПРАВДІ хотіли запитати. А в іншому. Все в цьому світі з точки зору людини суб'єктивно. В тому числі, з моєї точки зору - завантажувачу краще нічого не забороняти, а зробити його якомога тупіше і менше за розміром. І знову ж таки, суб'єктивно - bootloader для AVR НІ В ЯКОМУ РАЗІ НЕ ТРЕБА ПИСАТИ САМОСТІЙНО, оскільки краще, ніж вже вже понаписувано (причому стільки, що ні розгребе), Ви ніколи не напишете.

Підкажіть будь ласка, що потрібно дописати, налаштувати в проекті WinAVR IAR CVAVR якщо програма створюється під бутлодер? Т. е. Як повідомити компілятору, що пам'яті доступно менше, ніж в обраному камушке?

microsin: Ви вказали цілих три системи проектування, тому для відповіді на питання доведеться написати цілу статтю. Будь ласка, задавайте конкретні питання, і ще краще - пишіть з цього приводу на на email. Обсяг пам'яті в загальному випадку задається в хедерах, що описують мікроконтролер. або в налаштуваннях проекту, або в опціях линкера.

Схожі статті