Перейти к содержанию

Как записать загрузчик Arduino в новый ATmega328P?

Обновлено Редакция GAW

Голый ATmega328P с завода работает от внутреннего RC-генератора с делителем на 8, то есть на 1 МГц, и загрузчика в нём нет. Чтобы прошивать его по UART, как Arduino Uno, нужно записать фьюзы и сам загрузчик — Optiboot размером 512 байт в конце флеш-памяти, с адреса 0x7E00.

Что понадобится

  • Программатор ISP: USBasp, AVRISP mkII или вторая Arduino со скетчем ArduinoISP — см. ответ «Как прошить ATmega328P через другую Arduino?».
  • Кварц 16 МГц с двумя конденсаторами 18–22 пФ на XTAL1 и XTAL2 — фьюзы Uno выбирают именно внешний кварц.
  • Резистор 10 кОм от RESET к питанию — так собирает кристалл на макетной плате и сама Arduino.

Значения из boards.txt

ПараметрЗначениеЧто делает
low_fuses0xFFвнешний кварц 8–16 МГц, без деления на 8
high_fuses0xDEзагрузочная область 256 слов, старт с загрузчика, ISP включён
extended_fuses0xFDдетектор просадки питания на 2,7 В
lock_bits0x0Fзагрузчик защищён от записи из программы
файлoptiboot_atmega328.hexзагрузчик на 115 200 бит/с

Расшифровку каждого бита покажет калькулятор фьюзов AVR.

Команды avrdude

Порядок важен: сначала фьюзы на медленном такте, потом загрузчик.

avrdude -c usbasp -p m328p -B 8 -e -U lock:w:0x3F:m -U efuse:w:0xFD:m -U hfuse:w:0xDE:m -U lfuse:w:0xFF:m
avrdude -c usbasp -p m328p -U flash:w:optiboot_atmega328.hex:i -U lock:w:0x0F:m

Пункт Arduino IDE «Инструменты → Записать загрузчик» выполняет те же два шага с выбранным программатором. Ключи -U и -B разобраны в статье об avrdude, а устройство загрузчика — в статье о загрузчике.

Если что-то пошло не так

Если после записи low_fuses кристалл перестал отвечать, почти наверняка нет кварца или он не запустился: верните такт, подав внешний сигнал на XTAL1, и проверьте конденсаторы кварца. Высоковольтный программатор для этого не нужен — фьюзы ISP и RESET здесь не трогаются.

Похожие вопросы

Можно ли записать загрузчик без кварца на плате?

С фьюзами Uno — нет: low 0xFF выбирает внешний кварц, и после записи фьюзов кристалл без него остаётся без тактов и не отвечает программатору. Без кварца используют сборки загрузчика для внутреннего RC-генератора 8 МГц, где фьюзы оставляют внутренний генератор; Arduino описывает такую минимальную сборку на макетной плате.

Почему первая попытка записи фьюзов заканчивается ошибкой?

Новый кристалл работает на 1 МГц, а по даташиту уровни SCK должны длиться дольше двух тактов цели, то есть частота ISP должна быть меньше fck/4 — для 1 МГц меньше 250 кГц. Если программатор даёт больше, снизьте частоту ключом -B (например, -B 8 — период 8 мкс, 125 кГц), запишите фьюзы — после этого кристалл работает от кварца 16 МГц, и флеш-память можно писать быстрее.

Зачем lock_bits = 0x0F после записи загрузчика?

При 0x0F биты BLB12 и BLB11 равны нулю — это режим 3 таблицы 27-3 даташита: команда SPM не может писать в загрузочную область, а LPM из основной программы не может её читать. Скетч не испортит загрузчик случайно. Программатор ISP по-прежнему стирает кристалл целиком, вместе с битами защиты.

Источники

  1. Arduino. ArduinoCore-avr, коммит 11b9130: boards.txt, bootloaders/optiboot — uno.bootloader.low_fuses = 0xFF, high_fuses = 0xDE, extended_fuses = 0xFD, unlock_bits = 0x3F, lock_bits = 0x0F, file = optiboot/optiboot_atmega328.hex; uno.upload.maximum_size = 32256; Makefile optiboot — .text с адреса 0x7E00
  2. Microchip. ATmega48A/PA/88A/PA/168A/PA/328/P Data Sheet, DS40002061B, 2020 — табл. 28-9 — младший байт фьюзов, CKDIV8 запрограммирован с завода, CKSEL по умолчанию — внутренний RC 8 МГц; фьюзы не меняются при стирании кристалла; табл. 27-3 — режимы защиты загрузочной области BLB12:BLB11; табл. 29-12 — BODLEVEL 101: порог 2,5–2,9 В, типовой 2,7 В; 28.8 — для программирования по ISP нужен рабочий такт, выбранный фьюзами CKSEL, а низкий и высокий уровни SCK должны длиться дольше двух тактов процессора при fck < 12 МГц
  3. AVRDUDE 8.3. Страница руководства avrdude(1) — -U память:операция:файл:формат, тип m — значение прямо в командной строке; -B — период такта ISP; -e — стирание кристалла
  4. Arduino Docs. From Arduino to a Microcontroller on a Breadboard (репозиторий arduino/docs-content) — ATmega328P на макетной плате: кварц 16 МГц, резистор 10 кОм на RESET, два конденсатора 18–22 пФ; минимальный вариант — внутренний RC-генератор 8 МГц без кварца; при неверно выбранной плате с внешним тактом кристалл не заработает, пока такт не подключат

Нашли ошибку?