Что такое загрузчик?
Обычно микроконтроллеры программируются с помощью программатора. Но есть возможность прошить в микроконтроллер некую программу, которая позволит программировать его без использования внешнего программатора. Такая программа называется загрузчиком.
Если загрузчик не используется
Если вы хотите полностью использовать программное пространство (Flash-память) чипа или не хотите тратить время на загрузчик, то вы можете записать свои эскизы с помощью внешнего программатора .
Прошивка загрузчика
Чтобы записать программу-загрузчик в новый микроконтроллер, вам нужно купить программатор: AVR-ISP (внутрисхемный программатор), USBtinyISP или сделать программатор самому . Программатор должен быть подключен к контактам ICSP (2-контактный штыревой разъем). Убедитесь, что вы правильно его подключили. Плата должна питаться от внешнего источника питания или USB-порта.
Убедитесь, что вы выбрали правильный пункт в меню «Инструменты» -> «Плата». Затем просто запустите команду в меню «Инструменты» -> «Записать загрузчик» в среде Arduino. Запись загрузчика может занять 15 секунд и более, поэтому будьте терпеливы.
Пример по прошивке Arduino Mini
Вот несколько инструкций по прошивке на примере использования Arduino Mini
Версии загрузчика
Существуют различные версии загрузчика, как для работы на разных аппаратных средствах, так и из-за того, что они со временем меняются.
Текущие версии загрузчиков (то есть те, которые включены в Arduino 0009), почти идентичны для Diecimila и NG (с ATmega168 ). Они оба работают на скорости 19200 бод и занимают 2 КБ флэш-памяти на ATmega168 . Единственное различие — время, в течение которого загрузчик ожидает появления новой программы, и количества раз мигания светодиодом на Pin 13 при его запуске. Из-за автоматического сброса на Diecimila загрузчик находится в ожидании очень короткое время (менее секунды). При этом светодиод на Pin13 мигает один раз. Загрузчик NG ждет около 6-8 секунд и три раза мигает светодиодом.
Загрузчик, фактически прошитый на Arduino NG, немного отличается. Он разрешает встроенный подтягивающий резистор на Pin6 и не разрешает встроенное подтягивание на выводе RX. Кроме того, он не прекращает работу после получения недействительных данных, поэтому, если вы отправляете данные сразу после сброса, ваша программа никогда не будет работать.
Загрузчик Arduino BT выполняет начальную настройку модуля bluetooth.
Загрузчик ATmega8 занимает 1 Кбайт флэш-памяти. Он не отключается, когда получает недопустимые данные. Поэтому вам необходимо убедиться, что данные не загружаются на плату в течение 6-8 секунд после запуска загрузчика.
Некоторые очень старые версии загрузчика работают со скоростью 9600 бод (вместо 19200). Чтобы успешно загружать программы на платы с помощью таких загрузчиков, вам необходимо изменить строчку serial.download_rate в файле настроек на 9600.
Как это работает?
Команда «Записать Загрузчик» в среде Arduino использует инструмент с открытым исходным кодом — avrdude. Существует четыре этапа: разблокировка сектора загрузки чипа, установка fuse-битов, загрузка кода загрузчика в чип и блокировка загрузочного сектора. Этапы контролируются рядом настроек в файле настроек Arduino .
Для загрузчика ATmega8 это:
- bootloader.atmega8.programmer (значение по умолчанию: stk500) — это протокол, используемый загрузчиком.
- bootloader.atmega8.unlock_bits (значение по умолчанию: 0xFF) — это значение для записи в байт блокировки ATmega8, чтобы разблокировать раздел загрузчика.
- bootloader.atmega8.high_fuses (значение по умолчанию: 0xCA) — это значение для записи в старший байт fuse-битов ATmega8.
- bootloader.atmega8.low_fuses (значение по умолчанию: 0xDF) — это значение для записи в младший байт fuse-битов 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) — это значение для записи в старший байт fuse-битов ATmega168.
- bootloader.atmega168- <BOARD> .high_fuses (значение по умолчанию: 0xDD) — это значение для записи в старший байт fuse-битов ATmega168 .
- bootloader.atmega168- <BOARD> .low_fuses (значение по умолчанию: 0xFF) — это значение для записи младшего байта fuse-битов ATmega168 .
- bootloader.atmega168- <BOARD> .path (значение по умолчанию: bootloader168) — это путь (относительно каталога с приложением Arduino), содержащий предварительно скомпилированный загрузчик.
- bootloader.atmega168- <BOARD> .file (значение по умолчанию: ATmegaBOOT _168_ <BOARD> .hex) — это имя файла, содержащего предварительно скомпилированный код загрузчика (в bootloader.path).
- bootloader.atmega168- <BOARD> .lock_bits (значение по умолчанию: 0x0F) — это значение для записи в байт блокировки ATmega168, чтобы заблокировать секцию загрузчика (чтобы она не была случайно перезаписана при загрузке программы).