Загрузчик (Bootloader)
Загрузчик — это небольшая программа, которая позволяет загружать скетчи на плату Arduino. Она предустановлена в микроконтроллерах на платах Arduino.
Что такое загрузчик?
Микроконтроллеры обычно программируются с помощью программатора, если только в вашем микроконтроллере нет прошивки, которая позволяет устанавливать новую прошивку без внешнего программатора. Такая прошивка называется загрузчиком (bootloader).
Работа без загрузчика
Если вы хотите использовать всё программное пространство (flash) чипа или избежать задержки загрузчика, вы можете записывать ваши скетчи с помощью внешнего программатора.
Запись загрузчика
Для записи загрузчика вам потребуется приобрести AVR-ISP (внутрисхемный программатор), USBtinyISP или собрать параллельный программатор. Программатор подключается к выводам ICSP (разъём 2x3) — убедитесь, что вставляете его правильной стороной. Плата должна быть запитана от внешнего источника питания или через USB-порт.
Убедитесь, что в меню Tools | Board выбрана правильная плата. Затем просто запустите соответствующую команду из меню Tools > Burn Bootloader среды Arduino. Запись загрузчика может занять 15 секунд и более, так что наберитесь терпения.
Загрузка загрузчика в Arduino Mini
Вот инструкции по загрузке загрузчика в 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 КБ flash-памяти ATmega168. Единственные различия — это время ожидания загрузчиком новой программы и количество миганий светодиода на пине 13 при запуске. Благодаря автоматическому сбросу на Diecimila, его загрузчик ждёт очень короткое время (менее секунды) — для экономии времени он также мигает светодиодом на пине 13 один раз. Загрузчик NG ожидает около 6–8 секунд и мигает светодиодом три раза.
Загрузчик, который фактически поставлялся с Arduino NG, немного отличается. Он включает внутренний подтягивающий резистор на пине 6 и не включает внутренний подтягивающий резистор на пине RX. Он также не завершает работу по тайм-ауту при получении некорректных данных, поэтому если вы отправите данные на плату сразу после сброса, ваш скетч никогда не запустится.
Загрузчик Arduino BT выполняет начальную настройку модуля Bluetooth.
Загрузчик ATmega8 занимает всего 1 КБ flash-памяти. Он не завершает работу по тайм-ауту при получении некорректных данных — вам нужно убедиться, что данные не отправляются на плату в течение 6–8 секунд, пока работает загрузчик.
Некоторые старые версии загрузчика работают на скорости 9600 бод (вместо 19200). Чтобы успешно загрузить скетчи на платы с таким загрузчиком, вам нужно изменить параметр serial.download_rate в файле настроек на 9600.
Сторонние разработчики также работали над загрузчиком. Эта страница содержит ссылки на другие разработки загрузчиков.
Как это работает?
Команды «Burn Bootloader» в среде Arduino используют открытый инструмент avrdude. Процесс состоит из четырёх шагов: разблокировка секции загрузчика чипа, установка фьюзов чипа, загрузка кода загрузчика в чип и блокировка секции загрузчика чипа. Эти параметры контролируются рядом настроек в файле настроек Arduino.
Для загрузчика 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) — путь (относительно директории приложения Arduino), содержащий предварительно скомпилированный загрузчик.bootloader.atmega8.file(значение по умолчанию: ATmegaBOOT.hex) — имя файла, содержащего предварительно скомпилированный код загрузчика (в bootloader.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) — путь (относительно директории приложения Arduino), содержащий предварительно скомпилированный загрузчик.bootloader.atmega168-<BOARD>.file(значение по умолчанию: ATmegaBOOT_168_<BOARD>.hex) — имя файла, содержащего предварительно скомпилированный код загрузчика (в bootloader.path).bootloader.atmega168-<BOARD>.lock_bits(значение по умолчанию: 0x0F) — значение, записываемое в байт блокировки ATmega168 для блокировки секции загрузчика (чтобы она не была случайно перезаписана при загрузке скетча).
Исходный код
Доступны исходный код загрузчика AVR и исходный код загрузчика SAMD.