Voron Klipper MCU Flashing Guide — Bootloader, DFU, and SD Card Methods
Firmware Klipper Guide
Flashing Klipper firmware to your Voron's MCU (Microcontroller Unit) is a required step in every build. The process varies by board manufacturer — BTT, Fysetc, Mellow — and by connection method (USB DFU, SD card, or CAN bus). This guide covers every common Voron board, the Katapult/CANBoot bootloader system, troubleshooting failed flashes, and verifying a successful flash. Last updated: May 2025.
Flashing Methods by Board
BTT Octopus (Pro/F407/F429)
The BigTreeTech Octopus is one of the most popular Voron mainboards. It uses STM32 processors and supports DFU (Device Firmware Update) mode over USB.
- Enter DFU mode — Hold the BOOT button on the board, then press and release the RESET button. Continue holding BOOT for 2 seconds after releasing RESET, then release BOOT.
- Verify DFU mode — Run
lsusbin your terminal. You should see "STM32 Bootloader" or "STMicroelectronics STM Device in DFU Mode" in the list. - Build firmware — Run
make menuconfigin your Klipper directory. Select STM32F407 or STM32F429 (Octopus Pro), select "USB" for communication interface, and disable "USB for CAN bus bridging." Save and runmake. - Flash via DFU — Run
make flash FLASH_DEVICE=0483:df11(or the VID:PID shown by lsusb). The board will reboot automatically after flashing. - Verify — Run
ls /dev/serial/by-id/*and confirm you see the board listed (e.g.,/dev/serial/by-id/usb-Klipper_stm32f407xx_...if00).
If DFU mode is not detected, double-check the BOOT/RESET sequence timing. Some Octopus revs require a USB power cycle (disconnect and reconnect USB) while holding BOOT.
SKR v1.4 / SKR 3 / SKR E3
SKR boards use SD card flashing. No DFU mode needed.
- Build firmware — Run
make menuconfig. Select the correct processor (e.g., LPC1768 for SKR 1.4, STM32G0B1 for SKR 3). Set communication to USB. Save and runmake. - Rename and copy — The output file is
out/klipper.bin. Copy this file to a microSD card formatted as FAT32. Rename it tofirmware.binfor SKR boards (some needfirmware.cur— check your board documentation). - Insert and boot — Insert the SD card into the board and power it on. The board will detect the firmware file and flash it automatically. The file will be renamed to
firmware.curon success. - Verify — Check that the file on the SD card has been renamed to
firmware.cur. Then checkls /dev/serial/by-id/*.
Common mistake: copying the wrong file or forgetting to rename. The board will not flash if the filename is incorrect.
Fysetc Spider (v1.0, v2.2, Spider King)
The Fysetc Spider uses DFU mode similar to the Octopus. The Spider v2.2 uses an STM32F446.
- Hold the BOOT0 button, press and release RESET, then release BOOT0.
- Verify with
lsusb(look for STM32 bootloader). - Build firmware with
make menuconfig— select STM32F446, USB communication. - Flash with
make flash FLASH_DEVICE=0483:df11.
The Spider has a known issue where the DFU timeout is very short. If make flash fails with "cannot open DFU device," try entering DFU mode again immediately before running the flash command.
Manta M8P / Manta M5P (CB1 Integrated)
The Manta boards combine a main MCU (STM32) with an embedded Raspberry Pi-like CB1 module. The MCU is flashed differently because the CB1 handles the USB host.
- Option 1: DFU via CB1 — The CB1 can put the Manta MCU into DFU mode by writing to a GPIO pin. Use the
make flashcommand with the CB1's internal USB path. Check the BTT documentation for the exact command. - Option 2: Katapult/CANBoot — If you have Katapult already installed, you can flash over CAN bus (see Katapult section below).
- Option 3: SD card — Some Manta variants support SD card flashing. Copy
klipper.binto the SD card, insert, and power on.
Katapult (Formerly CANBoot) Bootloader
Katapult is a bootloader system that allows flashing Klipper firmware over CAN bus instead of requiring physical USB access. This is essential for CAN-based toolhead boards (EBB36, EBB42, SB2040, SB2209) that may not have accessible USB ports after installation.
How Katapult Works
- Initial flash — Flash the Katapult bootloader to the board (requires USB DFU or SWD on first install).
- CAN connection — Connect the board to your CAN network (CANH, CANL, 24V power).
- Build Klipper with CAN — In
make menuconfig, select "USB to CAN bus bridge" or "CAN bus" as the communication interface. - Flash over CAN — Use
python3 flash.py -d /dev/serial/by-id/...orpython3 flash_can.py -i can0 -qto query and-u UUIDto flash.
Boards Using Katapult
- EBB36 / EBB42 — BTT CAN toolhead boards. These come with a bootloader pre-installed or can be flashed via DFU first.
- SB2040 / SB2209 — Fysetc CAN toolhead boards integrated with Stealthburner PCB. Typically flashed over DFU on first install, then CAN for updates.
- Manta M8P — The main MCU can also use Katapult if you prefer CAN-based updates.
Query and Flash Over CAN
To flash a board already on the CAN network:
# Query CAN bus for Katapult devices
python3 ~/katapult/scripts/flash_can.py -i can0 -q
# Output example:
# Found CAN device: 1d50:617e 00:1a2b3c4d5e6f
# Application: Klipper
# Flash new Klipper firmware
python3 ~/katapult/scripts/flash_can.py -i can0 -f ~/klipper/out/klipper.bin -u 1a2b3c4d5e6f
Finding the MCU Serial
After a successful flash, the MCU appears as a serial device on your Raspberry Pi or CB1. Use the following command to find it:
ls /dev/serial/by-id/*
This will output something like:
/dev/serial/by-id/usb-Klipper_stm32f407xx_3A0019000553383538353630-if00
Use this full path in your printer.cfg file for the mcu section:
[mcu]
serial: /dev/serial/by-id/usb-Klipper_stm32f407xx_3A0019000553383538353630-if00
restart_method: command
If the by-id directory is empty, the MCU was not detected. Check your wiring, USB cable, and confirm the flash completed successfully.
Menuconfig Settings (Per Processor)
| Board | Processor | Communication | Clock Rate |
|---|---|---|---|
| BTT Octopus v1.1 | STM32F407 | USB (or CAN) | 8MHz crystal |
| BTT Octopus Pro | STM32F429 | USB (or CAN) | 8MHz crystal |
| BTT SKR 1.4 | LPC1768 | USB | 100MHz |
| BTT SKR 3 | STM32G0B1 | USB | 8MHz crystal |
| Fysetc Spider v2.2 | STM32F446 | USB | 8MHz crystal |
| Manta M8P v1.0 | STM32G0B1 | USB (internal to CB1) | 8MHz crystal |
| EBB36/42 (CAN) | STM32G0B1 | CAN bus | 8MHz crystal |
| SB2040 (CAN) | RP2040 | CAN bus | 12MHz crystal |
Flashing Command Reference
# Build firmware
cd ~/klipper
make menuconfig
make
# Flash DFU board (Octopus, Spider, etc.)
make flash FLASH_DEVICE=0483:df11
# Flash DFU with specific serial
make flash FLASH_DEVICE=/dev/serial/by-id/usb-xxx
# Flash Katapult over CAN
python3 ~/katapult/scripts/flash_can.py -i can0 -f ~/klipper/out/klipper.bin -u UUID
# Flash RP2040 (SB2040) via USB
make flash FLASH_DEVICE=2e8a:0003
Troubleshooting
No MCU Found
After flashing, the MCU does not appear in /dev/serial/by-id/.
- Check the USB cable — some cables are power-only. Use a known data-capable cable.
- Check the processor selection in menuconfig — wrong processor will produce a non-bootable firmware.
- Confirm the board has power (check LEDs). USB power alone may not be sufficient — connect 24V power.
- Try a different USB port on the Raspberry Pi. Some ports have power issues.
- Run
dmesg | tail -20after plugging in the board — look for USB recognition messages and errors.
Error During Flash
- "Cannot open DFU device" — The board is not in DFU mode. Re-enter DFU mode (hold BOOT, press RESET, release BOOT).
- "No DFU capable USB device available" — Run
lsusbto check. If the board is not listed, try a different USB cable or power cycle the board. - "Flash timed out" — Some boards (Spider) have short DFU windows. Run the flash command immediately after entering DFU mode.
- "verification failed" — Corrupted firmware build. Clean build with
make clean && makeand try again.
Board Bricked (Recovery Mode)
If the board does not respond and DFU mode does not activate:
- Short the BOOT0 pin to 3.3V or GND (depending on board) to force DFU mode. Check your board schematic for the correct pin.
- Use an ST-Link debugger — Connect SWDIO, SWCLK, GND to the board's SWD header and flash directly. This works even on a completely bricked board.
- SD card recovery — For SKR boards, you can sometimes force re-flash by placing a valid firmware.bin on the SD card and power cycling.
Pre-Built Configs
Voron maintains sample printer.cfg files for common board configurations. Check the Voron GitHub repository for pre-built configs that include the correct pin mappings, stepper configurations, and heater/thermistor definitions. These can be used as a starting point for menuconfig if the exact settings for your board are published.
Verifying Flash
After a successful flash, verify the connection from within Klipper:
- Update printer.cfg — Set the
serial:path to the MCU's/dev/serial/by-id/...entry. - Restart Klipper — Issue
RESTARTin the Klipper console (Mainsail/Fluidd or via Moonraker API). - Check status — Issue
STATUSin the console. A successful connection shows "Klipper state: Ready" and the MCU temperature. - Firmware version — Check the Klipper logs or the Mainsail/Fluidd dashboard for the firmware version string, which confirms the build date and configuration.
If the MCU is connected over CAN bus, verify with ~/klipper/scripts/flash_can.py -i can0 -q and check that the application is listed as "Klipper."