Целью данной статьи является обобщение доступной информации о методах и вариантах подготовки прошивок для MCU. В данной статье будут расмотренно несколько вариантов прошивки MCU.
Помните, нажимая Колокольчик и обновляя
Klipper
- Вы должны так же обновить прошивки всех MCU.
Иначе Вы и Ваш принтер могут стать мальчиками-колокольчиками, которые ни разу не Динь-Динь.
Прежде чем прошивать ту или иную плату MCU необходимо правильно подготовить для нее прошивку, а значит выбрать правильно архитекту процессора, смещение загрузчика, частоту кварца и метод управления платой.
Для начала подготовки прошивки выполним следующие команды:
cd ~/klipper
make clean
make menuconfig
При выполнении этих команд, сменится каталог на klipper
и уже в этом каталоге команда make
очистит предыдущие файлы (если они были) а так же вызовет меню конфигурации прошивки:
На изображении видно что на текущий момент, выбрана архитектура Atmega AVR и процессор atmega 2560.
Навигация по меню осуществяется стрелками и Enter для выбора. Чтобы выйти из меню конфигурации необходимо нажать Q
Для большинства, используемых в 3Д печати, плат есть готовые файлы конфигурации в шапке которых описано как конфигурировать их.
В файлах конфигурации для платы или для принтера, в самом начале идет блок:
# This file contains pin mappings for the stock 2020 Creality Ender 3
# V2. To use this config, during "make menuconfig" select the
# STM32F103 with a "28KiB bootloader" and serial (on USART1 PA10/PA9)
# communication.
# If you prefer a direct serial connection, in "make menuconfig"
# select "Enable extra low-level configuration options" and select
# serial (on USART3 PB11/PB10), which is broken out on the 10 pin IDC
# cable used for the LCD module as follows:
# 3: Tx, 4: Rx, 9: GND, 10: VCC
# Flash this firmware by copying "out/klipper.bin" to a SD card and
# turning on the printer with the card inserted. The firmware
# filename must end in ".bin" and must not match the last filename
# that was flashed.
# See docs/Config_Reference.md for a description of parameters.
Который в целом разбит на 4 Блока:
# STM32F103
"28KiB bootloader"
serial (on USART1 PA10/PA9)
и альтернативный, размещенный на блоке расширения EXT1:
serial (on USART3 PB11/PB10)
# Flash this firmware by copying "out/klipper.bin" to a SD card and
# turning on the printer with the card inserted. The firmware
# filename must end in ".bin" and must not match the last filename
# that was flashed.
В данном блоке указывается что необходимо делать с прошивкой после сборки. В конкретно данном случае необходимо только переименовать файл, так как загрузчик от Creality
запоминает предыдущее имя файла прошивки.
В рамках MCU для прошивки Klipper
могут выступать разные платы, основанные на разной архитектуре. Это и Atmega, и STM32, и LPC176x, а так же Linux process.
В выше приведенном блоке можно выделить строку:
select the STM32F103 with
Что означает выбрать как микроархитектуру: STMicroelectronics STM32
Выбрать модель процессора: STM32F103
Важно проверять модель процессора распаянного на Вашей плате, например плата Octopus 1.1 может поставляться в разных ревизиях, с процессором STM32F446, а так же с процессором STM32F429.
Если включить расширенный режим конфигурирования (Enable extra Low-level):
То будет доступна опция по выбору Reference clock
, если в блоке конфигурации для платы не указано иного - он составляет 8 Mhz
.
Проверить какой именно кварц стоит на вашей плате можно через принципиальную схему, размещенной на страничке изготовителя. Но это увы доступно далеко не для всех плат. Так же можно просто посмотреть на плату и прочесть цифры на кварце, если он не внутренний.
Выдержка из схемы BTT Octopus
Каждый процессор на MCU имеет свои характеристики. В том числе это доступный для записи объем данных:
Процессор | Объем EEPROM |
---|---|
Atmega 2560 | 4 Kbytes |
STM32 F103 | 64 Kbytes |
STM32 F446 | 512 Kbytes |
STM32 G0B1 | 512 Kbytes |
RP 2040 | 2048 Kbytes |
Таким образом прошивка ограничена размером, но не только размер самого Klipper
влияет на это, но и загрузчик который расположен в памяти MCU. Для плат оборудованных. В ряде случаев, для процессоров Atmega приходится дополнительно проводить оптимизацию кода, чтобы прошивка поместилась в память.
Во время загрузки, процессор переходит к адресу 0x08000000 и передает управление в эту область данных. В зависимости от того что там расположенно, проиходит магия загрузки и инициации MCU, ну или не происходит. Вообще ничего. Потому что данных либо нет, либо они содержат ошибку.
Платы на которых есть SD разъем в том числе имеют загрузчик от производителя, он служит для загрузки файла обновления с SD карты, а так же предъявляет требования к наименованию файла прошивки и тп. На изображении ниже показано размещение загрузчика размером 8 КiB.
В случае если на плате отсутствует разъем для SD карты памяти, необходимости в загрузчике нету.
Смещение загрузчика или Bootloader offset в меню сборки прошивки:
задает информацию на сколько нужно сместиться, чтобы не повредить данные загрузчика.
Таким образом выбор неправильного смещения загрузчика приведет ровно к двум сценариям, в каждом из которых MCU не будет работь, но есть нюансы:
Сценарий "Синий"
В данном случае смещение выбрано больше чем занимает загрузчик, таким образом между загрузчиком и прошивкой будет зона без данных или поврежденных данных. Но сам загрузчик не задет и не поврежден. Но ничего страшного и необратимого не произошло, достаточно собрать прошивку с правильным смещением.
Сценарий "Оранжевый"
В данном случае смещение выбрано меньше чем занимает загрузчик, таким образом данные загрузчика будут повреждены прошивкой. Теперь плату можно в 146% случаев считать кирпичом, лечится только программаторами и очень умными дядями которые умеют ими пользоваться.
Производитель плат для принтера сообщает данные о размерах загрузчика.
Например Creality 4.2.10
# This file contains pin mappings for the Creality "v4.2.10" board. To
# use this config, during "make menuconfig" select the STM32F103 with
# a "28KiB bootloader" and serial (on USART1 PA10/PA9) communication.
Явно говорит что для платы Creality 4.2.10 нужно выбрать смещение 28 KiB.
Внимательно читайте информацию к Вашей плате, ошибка в выборе правильного смещения - приведет к нарушению работоспособности платы.
Выбор интерфейса по которому Klipper
с хоста будет управлять MCU
. Вариантов в целом не то чтобы много, но есть нюансы. На текущий момент доступны следующие варианты:
У каждого из вариантов указаны название PINs
на которые идут RX/TX провода.
Например Creality Ender 3 v2 (MB Creality 4.2.2) :
# STM32F103 with a "28KiB bootloader" and serial (on USART1 PA10/PA9)
# communication.
# If you prefer a direct serial connection, in "make menuconfig"
# select "Enable extra low-level configuration options" and select
# serial (on USART3 PB11/PB10), which is broken out on the 10 pin IDC
Явно указывает что плата поддерживает только USART1 PA10/PA9
и USART3 PB11/PB10
режимы коммуникации, то что сама плата подключается обычным USB кабелем означает что на самой плате есть USB-USART конвертер. Либо если есть желание управлять принтером через USART, при этом подключая его по USB - можно просто купить данный конвертер, например на основе CH340 или на основе CH9121, но о последнем будет отдельная статья.
Как и было сказано выше, в данном блоке указываются действия которые следуют сразу после сборки прошивки через make
, но прешествуют самой прошивке.
На все том же примере Creality Ender 3 v2 (MB Creality 4.2.2) :
# Flash this firmware by copying "out/klipper.bin" to a SD card and
# turning on the printer with the card inserted. The firmware
# filename must end in ".bin" and must not match the last filename
# that was flashed.
В конкретно данном случае необходимо только переименовать файл, так как загрузчик от Creality
запоминает предыдущее имя файла прошивки. Скопировать его на флешку и прошить плату.
Иногда в данном блоке отвечающим за прошивку, могут встречаться дополнительные действия, на примере платы MKS Robin nano v1:
# Note that the "make flash" command does not work with MKS Robin
# boards. After running "make", run the following command:
# ./scripts/update_mks_robin.py out/klipper.bin out/Robin_nano.bin
# Copy the file out/Robin_nano.bin to an SD card and then restart the
# printer with that SD card.
В данном блоке указывается, что после выполнения сборки прошивки make
, пытаться прошить ее через make flash
бесполезно, кстати вообще все платы которые не используют USB
подключение, а так же вне режима DFU
- через make flash
не прошиваются.
Дополнительно необходимо выпонить скрипт: ./scripts/update_mks_robin.py out/klipper.bin out/Robin_nano.bin
из той же папки. А так же указывается конкретное имя файла прошивки. Более того, конкретно для MKS Robin Nano имеет значение подключен ли экран, и если он подключен то имя файла будет отличаться.
После сборки прошивки, файл прошивки будет размещаться в папке ~/klipper/out/
.
В зависимости от архитектуры процессора для которого собирался файл прошивки, он будет иметь разное расширение:
klipper.hex
- для архитектуры Atmega;klipper.bin
- для архитектур STM32, LPC176x;klipper.uf2
- для архитектуры RP2040.Для большинства плат используется два основных метода прошивки:
Так же для ряда плат есть третий, редко используемый но все же доступный:
Klipper
А так же есть дополнительный инструменты:
Самый простой способ, но при этом более требовательный к внимательности. Так как им легко убить загрузчик на MCU.
FAT32
.Чуть более сложный способ. Поддерживаются только платы у которых прямое USB
подключение, например EBB36 CAN V1.1 (STM32G0B1)
.
Основная сложность данного метода заключается в том, что-бы включить режим DFU необходимо на PIN Boot0
подать 3.3V (как правило делается перемычкой или кнопкой) и перезагрузить плату через кнопку или выключить (обесточить) и включить. При этом принтер к этому моменту уже собран, провода убраны и получить доступ к плате MCU достаточно сложно. Кстати это одна из причин почему появился загрузчик Katapult.
Выполняем в консоли следующую команду:
lsusb
Вывод команды будет примерно следующим:
видим что появилось устройство, значит мы все сделали правильно, запоминаем ID: 0483:df11
cd ~/klipper
make menuconfig
make flash FLASH_DEVICE=0483:df11
Как видим, прошивка прошла успешно, устройство было перезагружено.
Рассказ про SDCard updates, но это включать ендер3... Чуть позжи...
Прошивку с использованием kiauh
в данной статье расматривать пока что не буду, потому что он делает все то же самое что примеры ниже, только нажимая кнопки 1 и 2.
Выше уже упоминалось что самая большая сложность обновления прошивки MCU - это сложность доступа к MCU на уже собранном принтере. Для набирающему популярность интерфейсу CAN, в мире 3д печати, данную сложность обошли в загрузчике Katapult
.
К сожелению данный загрузчик создан для работы с CAN
, а уже потом для остальных интерфейсов.
Установим необходимые пакеты для работы Katapult
и скачаем его.
pip3 install pyserial
git clone https://github.com/Arksine/katapult
Так как Katapult
по сути прошивка, почти такая же как Klipper
, только Katapult
- то настройки для самой прошивки будут идентичными, но есть некоторые нюансы.
Katapult
записывается без смещения (идентично настройке No bootloader). Что в случае с CAN
устройствами в целом не вызывает проблем. Так как все они поддерживают DFU
и необходимости при прошивке общараться с SD Карте нету. Но этот нюанс необходимо знать.Klipper
. В случае если она находилась со смещением в 8KiB, 28KiB или 32KiB - это не имеет значения, но если до этого было нулевое смещение (идентично настройке No bootloader), то смещение придется задавать.Данный блок будет написан на примере EBB36 CAN V1.1 (STM32G0B1)
, освежим параметры в памяти:
For STM32G0B1 boards
"No bootloader"
"8MHz crystal" clock reference.
При этом мои настройки CAN
:
Can BUS Speed 500000
C учетом этих данных готовим прошивку Katapult
Обращаю внимание, что в графе Application start offset
указано 8KiB
- При подготовке прошивки Klipper
мы будем использовать это смещение.
Переводим плату в DFU режим, собираем прошивку и прошиваем:
cd ~/katapult
make menuconfig
make
sudo dfu-util -a 0 -D ~/katapult/out/katapult.bin --dfuse-address 0x08000000:force:mass-erase:leave -d 0483:df11
После прошивки опрашиваем CAN шину на наличие нашего нового устройства:
python3 ~/katapult/scripts/flashtool.py -i can0 -q
Прошивка прошла успешно и устройство опредилось с CAN ID 11d11eb5b129
Теперь готовим для нее прошивку Klipper
:
For STM32G0B1 boards
"8KiB bootloader"
"8MHz crystal" clock reference.
Can BUS Speed 500000
Обратите внимание
Application start offset
уKatapult
должен быть идентиченBootloader offset
вKlipper
. Иначе магии не случится.
Собираем прошивку и прошиваем ее с использованием Katapult
:
cd ~/klipper
make clean
make menuconfig
make
python3 ~/katapult/scripts/flashtool.py -i can0 -u 11d11eb5b129 -f ~/klipper/out/klipper.bin
В случае успешного выполнения вы увидите следующий результат:
После прошивки опрашиваем CAN шину на наличие нашего уже Klipper
устройства:
python3 ~/katapult/scripts/flashtool.py -i can0 -q
Все прошло успешно, в дальнейшем для обновления MCU будет необходимо просто выполнить последние шаги по подготовке прошивки Klipper
и её собственно прошиванию.
Данный блок представлен на основе платы BTT Octopus, который используется как USB-Bridge устройство, поэтому просто обновить его аналогично действиям с EBB36 CAN V1.1 (STM32G0B1)
уже не представляется возможным. Для таких случаев внутри Katapult
есть режим поддержки serial устройств, но работает это несколько сложнее и иначе.
Ниже приведена выдержка из настроек для BTT Octopus:
For STM32F446 boards
"32KiB bootloader"
"12MHz crystal" clock reference.
При этом мои настройки CAN
:
Can BUS Speed 500000
USB-TO CAN
CAN PB0/PB1
Переводим плату в DFU режим, собираем прошивку Katapult
и прошиваем:
cd ~/katapult
make menuconfig
Так как Katapult
по сути прошивка, почти такая же как Klipper
, только Katapult
- то настройки для самой прошивки будут идентичными:
Собираем прошивку и прошиваем ее:
make
sudo dfu-util -a 0 -D ~/katapult/out/katapult.bin --dfuse-address 0x08000000:force:mass-erase:leave -d 0483:df11
Аргумент
--dfuse-address 0x08000000:force:mass-erase:leave
Начинает запись по адресу0x08000000
и стирает все данные которые ранее были MCU, включая штатный загрузчик который раньше мог прошивать с SD карты.
После прошивки у нас появилось устройство: usb-katapult_stm32f446xx_130024000650534E4E313020-if00
Переходим к подготовке прошивки Klipper
cd ~/klipper
make clean
make menuconfig
После сборки прошивки, дальнейшие действия отличаются от привычных нам для Klipper
:
make
python3 ~/katapult/scripts/flashtool.py -f ~/klipper/out/klipper.bin -d /dev/serial/by-id/usb-katapult_stm32f446xx_130024000650534E4E313020-if00
Проверяем работоспособность CAN
:
Теперь у нас есть полностью рабочая плата которая работает в режиме USB-CAN Bridge
, и чтобы обновить ее необходимо выполнить в консоли:
python3 ~/katapult/scripts/flashtool.py -i can0 -u 45ecebfa5182 -r
Данные действия сбросят плату в режим USB
и она будет доступна для обновления под именем usb-katapult_stm32f446xx_130024000650534E4E313020-if00
, а как обновлять ее скриптом Вы уже знаете.