Arduino:Хакинг/Загрузчик
Содержание | Знакомство с Arduino | Продукты | Основы | Справочник языка Arduino | Примеры | Библиотеки | Хакинг | Изменения | Сравнение языков Arduino и Processing |
Загрузчик[1]
Что такое загрузчик?
Микроконтроллеры программируются, как правило, при помощи программаторов, за исключением случаев, когда на микроконтроллер загружен небольшой код, позволяющий устанавливать новую прошивку без использования внешнего программатора. Этот код и называют загрузчиком.
Прошивка без загрузчика
Если вы хотите использовать всю программную (flash) память чипа и избежать задержки, которая возникает при использовании загрузчика, то скетчи можно загружать при помощи внешнего программатора.
Запись загрузчика
Чтобы записать загрузчик, вам нужно будет купить AVR-ISP (внутрисхемный программатор), USBtinyISP или собрать собственный программатор, использующий параллельный порт. Программатор нужно подключить к контактам ICSP-гребешка (его размеры составляют 2 на 3 контакта), а затем убедиться, что все подключено правильно. Плату нужно запитать либо от внешнего источника питания, либо от USB-порта.
Также убедитесь, что вы выбрали правильный пункт в меню Инструменты > Плата. Затем кликните на Инструменты > Записать загрузчик. Запись загрузчика может потребовать около 15 секунд или даже больше, так что будьте терпеливы.
Запись загрузчика на Arduino Mini
Соответствующие инструкции можно почитать здесь – спасибо Джану Пабло Виламилу (Gian Pablo Vilamil).
По-прежнему не работает! (параллельный программатор на Windows XP)
Windows XP, возможно, будет опрашивать параллельный порт, нарушая процесс записи загрузчика. Вам понадобится заплатка регистра:
[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\Parport\Parameters]
"DisableWarmPoll"=dword:00000001
Более подробно читайте в этом посте на форуме.
Версии загрузчика
Загрузчик бывает разных версий – для работы с разным «железом» (поскольку оно постоянно меняется).
Загрузчики последней версии (те, что идут в Arduino 0009) почти идентичны загрузчикам для Diecimila или NG (с ATmega168). Оба работают на скорости 19200 бод и занимают 2 Кб в памяти чипа ATmega168.
Единственное отличие в том, сколько времени загрузчик ждет прибытия нового скетча, а также в том, сколько раз мигает светодиод на контакте 13. Плата Diecimila оснащена автоматическим сбросом, поэтому у загрузчика очень короткий период ожидания (меньше секунды), а светодиод на контакте 13 мигает лишь единожды. Загрузчик NG ждет примерно 6-8 секунд и мигает светодиодом три раза.
Загрузчик, который идет вместе с Arduino NG, устроен немного по-другому. Он включает внутренний подтягивающий резистор на контакте 6 и не включает внутренний подтягивающий резистор на контакте RX. Кроме того, получив неправильные данные, он не запустит таймаут, поэтому если вы отправите ему данные сразу же после сброса, ваш скетч никогда не запустится.
Загрузчик Arduino BT частично выполняет начальную конфигурацию Bluetooth-модуля.
Загрузчик ATmega8 занимает лишь 1 Кб flash-памяти. У него не запускается таймаут при получении неверных данных, поэтому нужно сделать так, чтобы на плату не посылалось никаких данных в течение 6-8 секунд, во время которых работает загрузчик.
Некоторые старые версии этого загрузчика работают на 9600 бодах (вместо 19200). Чтобы успешно загружать скетчи на плату при помощи этого загрузчика, вам нужно поменять настройку serial.download_rate в файле «preferences.txt» на «9600».
Над загрузчиком Arduino работают не только сотрудники Arduino, но и сторонние разработчики. О разработке загрузчика можно почитать по этой ссылке.
Как это работает?
Команда «Записать Загрузчик» в IDE Arduino использует avrdude – это инструмент с открытым кодом. Запись выполняется в 4 шага: разблокировка секции для загрузчика на чипе, настройка фьюз-битов на чипе, загрузка кода загрузчика на чип, блокировка секции для загрузчика на чипе. Все это управляется при помощи настроек в файле «preferences.txt».
Для загрузчика ATmega8 используются следующие настройки:
- bootloader.atmega8.programmer (значение по умолчанию: stk500): протокол, используемый загрузчиком.
- bootloader.atmega8.unlock_bits (значение по умолчанию: 0xFF): значение, которое нужно вписать в блокирующий байт ATmega8, чтобы разблокировать секцию для загрузчика.
- bootloader.atmega8.high_fuses (значение по умолчанию: 0xca): значение, которое нужно записать в старший байт фьюз-битов ATmega8.
- bootloader.atmega8.low_fuses (значение по умолчанию: 0xdf): значение, которое нужно записать в младший байт фьюз-битов ATmega8.
- bootloader.atmega8.path (значение по умолчанию: bootloader): путь (относительно папки, куда установлена IDE Arduino), по которому находится предварительно откомпилированный загрузчик.
- bootloader.atmega8.file (значение по умолчанию: ATmegaBOOT.hex): название файла, содержащего код для предварительно откомпилированного загрузчика (находится в bootloader.atmega8.path).
- bootloader.atmega8.lock_bits (значение по умолчанию: 0x0F): значение, которое нужно вписать в блокирующий байт ATmega8, чтобы заблокировать секцию для загрузчика (чтобы его нельзя было случайно перезаписать при загрузке скетча).
Для загрузчика ATmega168 используются следующие настройки (здесь вместо <BOARD> будет стоять diecimila или ng):
- bootloader.atmega168-<BOARD>.programmer (значение по умолчанию: avrispmkii): протокол, используемый загрузчиком.
- bootloader.atmega168-<BOARD>.unlock_bits (значение по умолчанию: 0x3F): значение, которое нужно записать в блокирующий байт ATmega168, чтобы разблокировать секцию для загрузчика.
- bootloader.atmega168-<BOARD>.extended_fuses (значение по умолчанию: 0x00): значение, которое нужно вписать в дополнительный байт фьюз-битов ATmega168.
- bootloader.atmega168-<BOARD>.high_fuses (значение по умолчанию: 0xdd): значение, которое нужно вписать в старший байт фьюз-битов ATmega168.
- bootloader.atmega168-<BOARD>.low_fuses (значение по умолчанию: 0xff): значение, которое нужно записать в младший байт фьюз-битов ATmega168.
- bootloader.atmega168-<BOARD>.path (значение по умолчанию: bootloader168): путь (относительно папки, в которую установлена IDE Arduino), по которому находится предварительно откомпилированный загрузчик.
- bootloader.atmega168-<BOARD>.file (значение по умолчанию: ATmegaBOOT_168_<BOARD>.hex): название файла, содержащего предварительно откомпилированный загрузчик (находится в bootloader.atmega168-<BOARD>path).
- bootloader.atmega168-<BOARD>.lock_bits (значение по умолчанию: 0x0F): значение, которое нужно вписать в блокирующий байт ATmega168, чтобы заблокировать секцию для загрузчика (чтобы случайно не перезаписать его при загрузке нового скетча).
Исходный код
Здесь можно скачать исходный код для загрузчика AVR, а здесь – для загрузчика SAMD.
См.также
Внешние ссылки
Arduino продукты | |
---|---|
Начальный уровень | Arduino Uno • Arduino Leonardo • Arduino 101 • Arduino Robot • Arduino Esplora • Arduino Micro • Arduino Nano • Arduino Mini • Arduino Starter Kit • Arduino Basic Kit • MKR2UNO • TFT-дисплей Arduino |
Продвинутые функции | Arduino Mega 2560 • Arduino Zero • Arduino Due • Arduino Mega ADK • Arduino Pro • Arduino Motor Shield • Arduino USB Host Shield • Arduino Proto Shield • MKR Proto Shield • MKR Proto Large Shield • Arduino ISP • Arduino USB 2 Serial Micro • Arduino Mini USB Serial Adapter |
Интернет вещей | Arduino Yun • Arduino Ethernet • Arduino MKR1000 • Arduino WiFi 101 Shield • Arduino GSM Shield V2 • Arduino WiFi Shield • Arduino Wireless SD Shield • Arduino Wireless Proto Shield • Arduino Ethernet Shield V2 • Arduino Yun Shield • Arduino MKR1000 Bundle |
Носимые устройства | Arduino Gemma • Lilypad Arduino Simple • Lilypad Arduino Main Board • Lilypad Arduino USB • LilyPad Arduino SimpleSnap |
3D-печать | Arduino Materia 101 |
Устаревшие устройства | - |
Примеры Arduino | |
---|---|
Стандартные функции | |
Основы |
|
Цифровой сигнал |
|
Аналоговый сигнал |
|
Связь |
|
Управляющие структуры |
|
Датчики |
|
Дисплей |
Примеры, объясняющие основы управления дисплеем:
|
Строки |
|
USB (для Leonardo, Micro и Due плат) |
В этой секции имеют место примеры, которые демонстрируют использование библиотек, уникальных для плат Leonardo, Micro и Due.
|
Клавиатура |
|
Мышь |
|
Разное |