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

Загрузчик (bootloader)

Загрузчик — небольшая программа, которая запускается после сброса и умеет записать в микроконтроллер новую прошивку через обычный интерфейс: UART, USB или CAN. Благодаря ему Arduino прошивается по USB-кабелю, а STM32 — через переходник USB–UART.

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

Загрузчик (bootloader) — программа, которая выполняется первой после сброса микроконтроллера и умеет принять новую прошивку по одному из обычных интерфейсов — UART, USB, CAN — и записать её во флеш-память. Если обновлять прошивку не нужно, загрузчик передаёт управление основной программе. Так микроконтроллер можно прошивать без отдельного программатора — кабелем, через который плата и так подключена к компьютеру.

Два вида загрузчиков

  • Встроенный (системный). Записан производителем в отдельную область памяти и не стирается. У STM32 он запускается, если при сбросе на выводе BOOT0 единица, а BOOT1 — ноль; у STM32F103 и STM32F407 работает через USART1 по протоколу AN3155: хост посылает 0x7F, загрузчик отвечает 0x79. Режимы загрузки, организация флеш-памяти и защита — в статье Flash и загрузчик STM32.
  • Пользовательский. Записывается в специальную область флеш-памяти, как обычная программа. У ATmega328P загрузочная секция находится в конце флеш-памяти, её размер задают фьюзы BOOTSZ, а фьюз BOOTRST переводит вектор сброса в её начало. Код в этой секции может перезаписывать остальную память командой SPM. Пример — Optiboot в Arduino Uno.

Как прошивают через загрузчик

Для Arduino прошивку отправляет avrdude с программатором типа arduino на скорости 115 200 бод; сброс перед загрузкой делает сигнал DTR преобразователя USB–UART. Для STM32 используют STM32CubeProgrammer или другие утилиты с протоколом AN3155. Способы прошивки AVR, в том числе без загрузчика — через ISP и UPDI, — разобраны в статье «Как прошить AVR».

Частые вопросы

Как прошивается Arduino Uno без программатора?

Загрузчиком Optiboot, который занимает конец флеш-памяти и после сброса некоторое время слушает UART. Он понимает подмножество протокола STK500 версии 1, поэтому в avrdude выбирают программатор типа arduino на скорости 115 200 бод. Сброс перед загрузкой делает сигнал DTR преобразователя USB–UART.

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

Подать на вывод BOOT0 единицу и сбросить микроконтроллер: при BOOT0 = 1 и BOOT1 = 0 он стартует из системной памяти, где ST записала загрузчик. У STM32F103 и STM32F407 загрузчик работает через USART1 на выводах PA9 и PA10; хост начинает обмен байтом 0x7F, загрузчик отвечает 0x79.

Можно ли стереть загрузчик Arduino?

Да — если записать программу через ISP-программатор, а не через загрузчик, флеш-память, включая загрузочную секцию, стирается. После этого плата перестанет прошиваться по USB, пока загрузчик не запишут заново тем же программатором.

Источники

  1. STMicroelectronics. RM0008 Rev 21. Reference manual: STM32F101xx–STM32F107xx — 3.4 — режимы загрузки (таблица 9), встроенный загрузчик через USART1
  2. STMicroelectronics. AN3155 Rev 22. USART protocol used in the STM32 bootloader — синхронизация байтом 0x7F, чётность even, ответ 0x79; скорость 1200–115 200 бит/с
  3. Microchip. ATmega48A/PA/88A/PA/168A/PA/328/P Data Sheet (DS40002061B) — гл. 27 — загрузочная секция, самопрограммирование командой SPM, таблица 27-13 (BOOTSZ)

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