Arduino:Хакинг/Загрузчик

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску

Перевод: Максим Кузьмин
Проверка/Оформление/Редактирование: Мякишев Е.А.



Загрузчик[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.

См.также

Внешние ссылки