Klipper Firmware Update – Step-by-Step Guide (2026)
Flash all MCUs synchronously: Octopus Pro, Eddy, CAN Toolboard and Raspberry Pi
# Why a Complete Firmware Update is Necessary
Here is the translation: Klipper consists of several components: the host software on the Raspberry Pi and the firmware on each connected MCU. When updating, all MCUs must receive exactly the same firmware version. If the versions do not match, Klipper will terminate its service with the dreaded "Protocol Error".
This guide shows the complete process using a typical setup as an example:
- Mainboard: BTT Octopus Pro (STM32F429) via USB (This is a technical specification/product name that remains the same in English, as it contains no translatable words - it's a proper noun/model name with technical abbreviations.)
- Probe: BTT Eddy USB (RP2040) via USB (This term is a technical product name/designation and remains unchanged in English, as it refers to a specific hardware probe device.)
- Toolboard: EBB / SB2209 or similar (STM32G0B1) via CAN bus
- Host-MCU: Raspberry Pi (Linux process) (This text is already in English and does not require translation.)
Tip: If your setup uses different hardware, adjust the processor and interface settings accordingly – the basic structure remains identical.
Step 1: Update the host system (Raspberry Pi)
Before the hardware is flashed, the Klipper software on the Pi must be up to date. Always update the host first, then the MCUs.
1.1 Installing the Klipper Update
Here is the translation: "Change to the Klipper home directory, pull the latest updates from the repository, and restart the Klipper service with administrator privileges." **Note:** The original text consists of **command-line instructions**, not natural language. These commands are already in a universal format used in Linux/Unix systems and do not require translation, as they are the same in all languages. However, here is an explanation of what each command does: - `cd ~/klipper` → Navigate to the Klipper directory - `git pull` → Download and integrate the latest updates - `sudo service klipper restart` → Restart the Klipper service with root privileges
## 1.2 Flashing the Linux MCU ([mcu rpi])
Here is the translation: Many setups use the Pi itself as an MCU – e.g. for ADXL345 accelerometer sensors or GPIO control. This MCU also needs to be recompiled, otherwise a protocol error will occur.
cd ~/klipper make menuconfig (This is a command-line instruction and does not require translation, as it is a technical command used in a terminal/shell environment.)
menuconfig settings:
Setting Value Micro-controller Architecture Linux process
Here is the translation: "This is the only option – there are no further submenus here. Confirm and save."
Here is the translation: "make clean && make make flash" **Note:** This text appears to be a technical command/code snippet (likely a build system command). It doesn't require translation as it is already in a technical/programming language that is universally used regardless of the spoken language. The text remains the same in English.
Here is the translation: The Pi flashes itself with it. No restart needed, Klipper will automatically load the new version.
Step 2: Flashing the Mainboard (BTT Octopus Pro – STM32F429)
Here is the translation: The Octopus Pro is connected to the Pi via USB. It uses an STM32F429 chip with a 32 KiB bootloader.
## 2.1 Configure menuconfig
cd ~/klipper make menuconfig (This is a command-line instruction and does not require translation, as it is a technical command used in a terminal/shell environment.)
menuconfig settings in detail:
Here is the translation: Setting Value Explanation Micro-controller Architecture STMicroelectronics STM32 The STM32 family by ST Processor model STM32F429 The chip on the Octopus Pro. For the Octopus V1.1, for example, it would be STM32F446 Bootloader offset 32KiB bootloader The Octopus Pro has a 32 KiB bootloader. Incorrect offset = board won't boot! Clock Reference 8 MHz crystal External crystal on the board. Some boards use 12 MHz – check board documentation Communication interface USB (on PA11/PA12) The USB pins of the Octopus Pro. Other boards may use different pins (e.g. PA9/PA10)
Why is the bootloader offset important? The bootloader occupies the first bytes of the flash memory. Klipper needs to know at which address the actual firmware begins. An incorrect offset overwrites the bootloader and the board will no longer boot (recovery is then only possible via DFU or ST-Link).
## 2.2 Compiling and Flashing (SD Card Method)
"make clean && make" This is a technical command (used in software development/build systems) and does not require translation, as it is universal programming syntax. It means: first execute `make clean` (to remove previously compiled files), and if that is successful, then execute `make` (to recompile/rebuild the project).
The finished firmware is located at out/klipper.bin.
**Flashing process:**
- Copy out/klipper.bin from the Pi to your PC (e.g. via SCP/SFTP).
- Rename the file to firmware.bin – the name is important!
- Copy to a FAT32-formatted SD card (max. 32 GB recommended).
- Insert the SD card into the slot on the Octopus.
- Reset button on the board press (or briefly disconnect the power supply).
- Wait approx. 5 seconds, then check SD card.
Verification of success: The file on the SD card is now named FIRMWARE.CUR instead of firmware.bin. This confirms that the bootloader has flashed the firmware.
Alternative: You can also flash directly via USB if you know the serial ID: bash make flash FLASH_DEVICE=/dev/serial/by-id/usb-Klipper_stm32f429xx_... However, the SD method is the most reliable and also works with corrupted firmware.
Step 3: Flash the probe (BTT Eddy USB – RP2040)
Here is the translation: The BTT Eddy is an inductive probe with its own RP2040 chip and permanent USB connection. It also requires the appropriate Klipper firmware.
## 3.1 Configure menuconfig
cd ~/klipper make menuconfig (This is a command-line instruction and does not require translation, as it is a technical command used in a terminal/shell environment.)
menuconfig settings in detail:
Setting Value Explanation Micro-controller Architecture Raspberry Pi RP2040 The chip in the Eddy (and many other boards such as the Pi Pico) Bootloader No bootloader The RP2040 has no permanent bootloader in the traditional sense – it is flashed in UF2 boot mode Flash chip W25Q080 with generic 03h SPI Standard flash chip on the Eddy. Correct for most RP2040 boards Communication interface USB The Eddy is permanently connected to the Pi via USB
Why "No bootloader"? With the RP2040, the firmware is written directly to the flash memory. The chip's boot ROM takes over the bootloader function – you just need to manually activate the boot mode.
3.2 Compiling and flashing
"make clean && make" This is a technical command (used in software development/build systems) and does not require translation, as it is universal programming syntax. It means: first execute `make clean` (to remove previously compiled files), and if that is successful, then execute `make` (to recompile/rebuild the project).
Boot mode activate:
- Disconnect the USB cable from the Eddy (or unplug it from the Pi).
- Hold down the boot button on the Eddy.
- Plug the USB cable back in (keep holding the button).
- Release the button – the Eddy now registers itself as a USB bootloader device.
Here is the translation: make flash FLASH_DEVICE=2e8a:0003 --- *(Note: This is a technical command/code string that does not require translation, as it is a programming/terminal command that remains the same in all languages.)*
The ID 2e8a:0003 is the USB ID of the RP2040 in boot mode. If unsure:
Here is the translation: lsusb | grep -i "2e8a" --- **Note:** This is a Linux command and does not require translation, as it is a technical command that remains the same in all languages. It lists USB devices and filters the output for the string "2e8a" (case-insensitive).
After the flash, the Eddy automatically starts up with the new firmware.
Step 4: Flashing the Toolboard (STM32G0B1 via CAN Bus)
The toolboard (e.g. BTT EBB36/42, SB2209, Mellow FLY-SB2040) is connected to the CAN bus. Here, the CAN bit rate must match exactly.
## 4.1 Configure menuconfig
cd ~/klipper make menuconfig (This is a command-line instruction and does not require translation, as it is a technical command used in a terminal/shell environment.)
menuconfig settings in detail:
Here is the translation: Setting Value Explanation Micro-controller Architecture STMicroelectronics STM32 STM32 family Processor model STM32G0B1 The chip on the toolboard. For the EBB36 v1.2, for example, also STM32G0B1; older versions may use STM32F072 Bootloader offset No bootloader No separate bootloader – Klipper is flashed directly. If Katapult is installed: 8KiB bootloader Clock Reference 8 MHz crystal Standard for most STM32 toolboards Communication interface CAN bus (on PB0/PB1) The CAN pins of the toolboard. Always check the schematic – wrong pins = no communication CAN bus speed 1000000 Your CAN bitrate. Must be identical on all CAN nodes! Common values: 250000, 500000, 1000000
CAN pins – common boards: - BTT EBB36/42 v1.2: PB0/PB1 - BTT SB2209: PB0/PB1 - Mellow FLY-SB2040: Uses RP2040 with its own CAN configuration
Wrong pins are the most common mistake in CAN setup! Always check the pin assignment of the specific board revision.
On the CAN bit rate: All devices on the CAN bus must use the same bit rate – the toolboard, the host interface (can0 on the Pi), and optionally a CAN bridge board. Typical values are 500000 (500k) or 1000000 (1M). Higher bit rates allow more throughput, but require short, properly terminated cables.
4.2 Compiling and flashing
"make clean && make" This is a technical command (used in software development/build systems) and does not require translation, as it is universal programming syntax. It means: first execute `make clean` (to remove previously compiled files), and if that is successful, then execute `make` (to recompile/rebuild the project).
Recommended: Flash via USB (rescue path)
Flashing via CAN does not always work reliably – especially without the Katapult bootloader. Therefore, connect the toolboard once via USB directly to the Pi:
- Disconnect the CAN cable from the tool board.
- Connect the USB cable between the toolboard and the Pi.
- **Determine Serial ID:**
This is not a text that needs to be translated — it is a **Linux command**. `ls /dev/serial/by-id/*` This command lists all entries in the directory `/dev/serial/by-id/`, which contains symbolic links to serial devices (e.g., USB-to-serial adapters) identified by their unique hardware IDs. --- If you meant a **different text**, please provide it and I will translate it for you.
It seems like your message got cut off — you wrote "Beispielausgabe" (which means "example output") but didn't include the actual text to be translated. Could you please provide the text you'd like me to translate into English? 😊
/dev/serial/by-id/usb-Klipper_stm32g0b1xx_12345678-if00 This is a technical path/identifier (a Linux device file path for a USB serial device) and does not require translation, as it is a system-specific string that remains the same in any language.
- "Flashing:" (Note: "Flashen" in German refers to the process of flashing/updating firmware or software onto a device, such as a router, microcontroller, or other hardware. The English equivalent is simply "Flashing:" - the act of writing firmware/software to a device's memory.)
Here is the translation: make flash FLASH_DEVICE=/dev/serial/by-id/usb-Klipper_stm32g0b1xx_YOUR_ID
- Disconnect the USB cable, reconnect the CAN cable.
Alternative: Flash via CAN (with Katapult/CanBoot bootloader)
If Katapult is installed on the toolboard, you can flash directly via the CAN bus:
python3 ~/katapult/scripts/flash_can.py -i can0 -u YOUR_CAN_UUID -f ~/klipper/out/klipper.bin
You can find the CAN UUID with:
~/klippy-env/bin/python ~/klipper/scripts/canbus_query.py can0 (This is a command-line instruction/code and does not require translation, as it is a technical command that remains the same in all languages.)
Please provide the text you would like me to translate. You've only shared the heading "Zusammenfassung: Beispiel-Setup" so far. The translation of this heading would be: **Summary: Example Setup** Please share the full text you'd like me to translate!
Here is the translation: Component Chip Connection Identification BTT Octopus Pro STM32F429 USB /dev/serial/by-id/usb-Klipper_stm32f429xx_... BTT Eddy USB RP2040 USB /dev/serial/by-id/usb-Klipper_rp2040_... Toolboard (EBB/SB) STM32G0B1 CAN (1M) UUID (e.g. 5e654f097xxx) Raspberry Pi Linux Internal n/a
Checklist after flashing
1. Start Klipper service
"sudo service klipper start" This is a command-line instruction and does not require translation, as it is a technical command used in Linux/Unix-based operating systems. It starts the Klipper service with administrator privileges.
2. Check firmware versions
Open Mainsail or Fluidd → Machine → System Information. All MCUs must display the identical version identifier, e.g.:
mcu: Klipper v0.13.0-xxx mcu rpi: Klipper v0.13.0-xxx mcu EBBCan: Klipper v0.13.0-xxx mcu eddy: Klipper v0.13.0-xxx *(Note: This text consists of technical/software version information and proper names/identifiers that do not require translation, as they are universal technical terms and software designations.)*
Translating the text: "If a version differs, this MCU was not flashed correctly."
3. Check CAN interface
ip -details link show can0 (This is a Linux command and does not require translation, as it is a technical command that remains the same in all languages.)
Please provide the text you would like me to translate. You've only shared the instruction "Erwartete Ausgabe:" (which means "Expected output:") but no actual text to translate. Please share the full text and I'll be happy to translate it for you.
can0: <NOARP,UP,LOWER_UP,ECHO> mtu 16 qdisc pfifo_fast state UP ... bitrate 1000000 sample-point 0.750
(Note: This text is a network interface status output, typically from the Linux command `ip link show` or `ifconfig`. It is already in English/technical notation and does not require translation, as it consists of technical terms, flags, and numerical values that are universally used in networking contexts.)
If can0 is not active, check /etc/network/interfaces.d/can0:
Here is the translation of the text into English: "allow-hotplug can0 iface can0 can static bitrate 1000000 up ifconfig $IFACE txqueuelen 1024" **Note:** This text is a network configuration snippet (likely from a Linux `/etc/network/interfaces` file) used to configure a CAN (Controller Area Network) interface. It is a technical/code text and does not require translation, as it is already in a universal technical language. However, here is an explanation of its meaning in English: - **allow-hotplug can0** – Allow the CAN interface `can0` to be automatically activated when it is detected (hotplugged). - **iface can0 can static** – Define the interface `can0` as a CAN interface with a static configuration. - **bitrate 1000000** – Set the bitrate of the CAN interface to 1,000,000 bits per second (1 Mbit/s). - **up ifconfig $IFACE txqueuelen 1024** – When the interface is brought up, set the transmit queue length (`txqueuelen`) of the interface to 1024 packets.
Adjust the bitrate to your setup and restart the interface:
sudo ifdown can0 && sudo ifup can0
4. Homing Test
Execute G28 (Home All) – keep your finger on the emergency stop! This way you can check whether the endstops and probe are working correctly.
5. Probe Calibration
After a firmware update, offsets may change slightly. Perform the calibration again:
PROBE_CALIBRATE BED_MESH_CALIBRATE (These are technical commands/terms that remain unchanged in English, as they are specific Klipper 3D printer firmware commands that do not require translation.)
Troubleshooting
Here is the translation: | Problem | Cause | Solution | |---|---|---| | "Protocol Error" after update | Firmware versions do not match | Flash all MCUs to the identical version | | CAN toolboard does not respond | Bit rate does not match or interface is down | Check ip link show can0, compare bit rate | | SD card: file remains firmware.bin | Board has not flashed | Try a different SD card, format as FAT32, press reset again | | make flash on RP2040 fails | Boot mode not active | Hold button while plugging in, check lsusb | | make flash on toolboard via USB: "No device found" | Wrong device path | Check ls /dev/serial/by-id/* again, test USB cable | | Eddy delivers incorrect values after update | Calibration is missing | Run PROBE_CALIBRATE and, if necessary, redo the Eddy-specific calibration |
menuconfig Quick Reference
For a quick overview – all four configurations at a glance:
Pi (Linux-MCU):
[*] Linux process (The text is already in English — "Linux process" is a technical term that remains the same in both German and English contexts. The "[*]" symbol is kept as is.)
Octopus Pro (STM32F429):
[*] STMicroelectronics STM32 Processor: STM32F429 Bootloader: 32KiB bootloader Clock: 8 MHz crystal Interface: USB (on PA11/PA12) The text is already in English, so no translation is needed. The content describes technical specifications for an STMicroelectronics STM32 microcontroller, specifically the STM32F429 model, featuring a 32KiB bootloader, an 8 MHz crystal clock, and a USB interface connected to pins PA11 and PA12.
Eddy USB (RP2040):
[*] Raspberry Pi RP2040 Bootloader: No bootloader Interface: USB (This text is already in English and does not require translation, as it consists of technical terms and product names that remain the same in both German and English.)
Toolboard CAN (STM32G0B1):
[*] STMicroelectronics STM32 Processor: STM32G0B1 Bootloader: No bootloader Interface: CAN bus (on PB0/PB1) CAN speed: 1000000 (This text is already in English and requires no translation, as it consists of technical specifications and proper nouns that remain the same in all languages.)
Here is the translation: "If all firmware versions in Mainsail/Fluidd are green and identical, your printer is running in sync again. Good luck with the update!"