Сборка прошивки#

Прошивку MCU (Katapult + Klipper) можно собрать либо на самом хосте принтера, либо на Mac / Linux-машине, а потом скопировать .bin. Оба дают идентичные образы — выбирай, что под рукой.

Тулчейн#

На хосте принтера (Allwinner H616 платы Sovol Zero, Debian aarch64)#

arm-none-eabi-gcc уже установлен — это вендорская же цепочка сборки. Клонируй исходники и собирай на месте; никакой доп-настройки и ни одной из macOS-причуд ниже:

make CROSS_PREFIX=arm-none-eabi-

На macOS#

brew install --cask gcc-arm-embedded

Он ставится в /Applications/ArmGNUToolchain/<version>/arm-none-eabi/bin/ (например, 15.2.rel1) и не добавляется в PATH. Собирай с полным префиксом и переопредели CPP:

TC=/Applications/ArmGNUToolchain/<version>/arm-none-eabi/bin
make CROSS_PREFIX=$TC/arm-none-eabi- CPP=$TC/arm-none-eabi-cpp

Переопределение CPP на macOS обязательно: Makefile Klipper препроцессит linker-скрипт через cpp, а это там clang, и он падает с cc: error: no input files. На хосте это не нужно (там cpp — это gcc).

Что собирать#

Собери все четыре образа из одного и того же коммита Klipper master (и совпадающего чекаута Arksine/katapult). Затравку каждого .config бери из вендорского на диске и поправь офсет — вендорские файлы .config* заявляют 0x8000000, что устарело.

ОбразТаргет / затравкаОпция офсетаАдрес приложенияСохрани вывод как
Katapult тулхедаF103, CANSERIAL, 8 MHz, CAN PB8/PB9 — затравка .config1030x8000000katapult-f103.bin
Klipper тулхедаF103, затравка .config103STM32_FLASH_START_20000x8002000klipper-f103.bin
Katapult deployer мейнбордаMACH_STM32H743 (+ BUILD_DEPLOYER)STM32_FLASH_START_200000x8020000deployer-mainboard.bin
Klipper мейнбордаMACH_STM32H743, затравка .config750STM32_FLASH_START_200000x8020000klipper-mainboard.bin

Каждая сборка перезаписывает out/klipper.bin (или out/katapult.bin / out/deployer.bin), так что копируй вывод под отдельным именем перед следующей сборкой — иначе четыре образа затрут друг друга, и ты рискуешь прошить F103-образ тулхеда на мейнборд или наоборот. Шаги прошивки в Миграции MCU используют имена из колонки «Сохрани вывод как» выше.

Мейнборд: собирай как STM32H743 (валидированный клок 400 МГц)#

Выбирай MACH_STM32H743, а не H750. На текущем master Klipper оба таргета дают офсет 0x8020000 (STM32_FLASH_START_20000) стоковой опцией меню, так что ни один не требует патча — но они различаются клоком: H750 по умолчанию 480 МГц, H743 — 400 МГц, и 400 МГц — та скорость, на которой этот мейнборд валидирован (и вендор, и asnajder/zero-config гоняют его на 400). Сборка как H743 даёт проверенный клок из стокового таргета. Гнаться за 480 МГц тут незачем: ворклоад мейнборда Klipper на 400 не упирается в клок, а 480 МГц на H750 всё равно зависит от ревизии кремния (партии rev-Y капятся на 400 МГц и требуют overdrive VOS0), так что 480 — это риск без выигрыша, а 400 проверено и достаточно. Через make menuconfig:

  • processor model STM32H743
  • кварц 25 MHz
  • application offset 128 KiB (→ 0x8020000)
  • USB-to-CAN-bus bridge, USB на PA11/PA12, CAN на PB8/PB9
  • GPIO pins to set at startup: !PE11,!PB0 — держит вспомогательный/выхлопной вентиляторы в низком уровне, пока Klipper не перехватит, вместо того чтобы гонять их на полную через окно загрузки

Собери Katapult deployer для мейнборда с теми же настройками H743 плюс BUILD_DEPLOYER=y (включается автоматически, когда офсет приложения отличается от офсета загрузчика). Он выдаёт deployer.bin рядом с katapult.bin; deployer — это то, что ставит mainline Katapult по USB без SWD (см. Миграцию MCU).

Katapult тулхеда: держи его CANSERIAL#

Затравку .config для Katapult тулхеда бери из вендорского .config103 и меняй только офсет. Голая/руками написанная затравка заставляет olddefconfig выставить интерфейс связи в USB по умолчанию, и получается Katapult, который входит в загрузчик, но молчит на CAN-шине. CANSERIAL — это то, что делает тулхед CAN-прошиваемым после одного SWD-бутстрапа.

Сноска: сборка как H750#

На текущем master MACH_STM32H750 тоже достаёт офсет 0x8020000, так что и ему патч не нужен — поддержка из Klipper3d/klipper#7219 приехала на master коммитом 666781a6 2026-06-09. Отдельный коммит в тот же день разделил дефолт клока на H750 → 480 МГц / H743 → 400 МГц; до этого H750 тоже по умолчанию брал 400 МГц. Так что на свежем чекауте единственное, что разделяет два таргета, — это дефолт клока, и брать H750 тут по-прежнему незачем. Однострочный Kconfig-патч, который раньше включал офсет в меню, важен только если ты пинишь Klipper старше 2026-06-09 — чего этот отслеживающий master гайд не делает.

Проверь перед прошивкой#

Проверь, что reset-handler каждого .bin — байты 4–7, little-endian — попадает в целевой офсет:

python3 -c "d=open('out/klipper.bin','rb').read(8); print(hex(int.from_bytes(d[4:8],'little')))"
  • F103 на 0x8002000 → ожидай 0x08002xxx (значение 0x08000xxx означает, что собрано под 0x8000000, неверно).
  • Мейнборд на 0x8020000 → ожидай 0x0802xxxx (значение 0x0800xxxx означает неверный офсет — окирпичит мост).