<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>DFU on Vousten.dev</title><link>https://vousten.dev/tags/dfu/</link><description>Recent content in DFU on Vousten.dev</description><generator>Hugo -- gohugo.io</generator><language>en-gb</language><lastBuildDate>Sat, 20 Jun 2026 00:00:00 +0200</lastBuildDate><atom:link href="https://vousten.dev/tags/dfu/index.xml" rel="self" type="application/rss+xml"/><item><title>Easy Klipper update for the Voron 0 display</title><link>https://vousten.dev/blog/2026/06/easy-klipper-update-for-the-voron-0-display/</link><pubDate>Sat, 20 Jun 2026 00:00:00 +0200</pubDate><guid>https://vousten.dev/blog/2026/06/easy-klipper-update-for-the-voron-0-display/</guid><description>&lt;img src="https://vousten.dev/blog/2026/06/easy-klipper-update-for-the-voron-0-display/voron-0-display.jpg" alt="Featured image of post Easy Klipper update for the Voron 0 display" /&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;The display is a pretty simple device, so in general there probably aren&amp;rsquo;t any new features you need on your display.
However, when you update Klipper on your host, problems may occur due to a version mismatch even if the new features are not needed or even used on your display.&lt;/p&gt;
&lt;blockquote&gt;
 &lt;p&gt;Whenever you update Klipper on your host system, you should also update Klipper on all your MCUs.
This is because Klipper on your host system and Klipper on your MCUs need to use the same communication protocol.&lt;/p&gt;&lt;span class="cite"&gt;&lt;span&gt;― &lt;/span&gt;&lt;a href="#ZgotmplZ"&gt;&lt;cite&gt;Automating Klipper MCU Updates&lt;/cite&gt;&lt;/a&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p&gt;There are some easy ways to update the firmware.
For boards with an SD card, like the BTT SKR 1.3, there is a script called &lt;code&gt;flash-sdcard.sh&lt;/code&gt; for updates.
For boards like the BTT SKR Pico, an RP2040-based board, you can use the &lt;code&gt;make&lt;/code&gt; command: &lt;code&gt;make flash FLASH_DEVICE=&amp;lt;insert serial id here&amp;gt;&lt;/code&gt;.
However, for some MCUs, like the one used for the Voron 0 display, these methods are not easily usable.
To use the &lt;code&gt;make flash&lt;/code&gt; command you have to use the DFU device ID, so you have to put the MCU in DFU mode first.
This requires installing the boot jumper, which is hard to reach if the board is already installed in the Voron 0.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Installed boot-jumper pictured from below the printer" class="gallery-image" data-flex-basis="497px" data-flex-grow="207" height="1459" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://vousten.dev/blog/2026/06/easy-klipper-update-for-the-voron-0-display/boot-jumper.jpg" srcset="https://vousten.dev/blog/2026/06/easy-klipper-update-for-the-voron-0-display/boot-jumper_hu_93fd8c3f671a34ed.jpg 800w, https://vousten.dev/blog/2026/06/easy-klipper-update-for-the-voron-0-display/boot-jumper_hu_e891be83c98fbd1.jpg 1600w, https://vousten.dev/blog/2026/06/easy-klipper-update-for-the-voron-0-display/boot-jumper_hu_35992e38921e343d.jpg 2400w, https://vousten.dev/blog/2026/06/easy-klipper-update-for-the-voron-0-display/boot-jumper.jpg 3027w" width="3027"&gt;&lt;/p&gt;
&lt;h2 id="bootloader"&gt;Bootloader
&lt;/h2&gt;&lt;p&gt;Boards like the SKR Pico are easy to update because they have a bootloader preinstalled.
For the RP2040, this bootloader is baked into the chip.
This is explained in &lt;a class="link" href="https://pip-assets.raspberrypi.com/categories/814-rp2040/documents/RP-008371-DS-1-rp2040-datasheet.pdf#section_rom" target="_blank" rel="noopener"
 &gt;Section 2.6.1 (ROM)&lt;/a&gt; and &lt;a class="link" href="https://pip-assets.raspberrypi.com/categories/814-rp2040/documents/RP-008371-DS-1-rp2040-datasheet.pdf#section_bootrom" target="_blank" rel="noopener"
 &gt;Section 2.8 (Bootrom)&lt;/a&gt; of the RP2040 documentation.&lt;/p&gt;
&lt;p&gt;The SKR 1.3, &lt;a class="link" href="https://www.klipper3d.org/Bootloaders.html#lpc176x-micro-controllers-smoothieboards" target="_blank" rel="noopener"
 &gt;like many LPC176x-based boards&lt;/a&gt;, has a &lt;a class="link" href="https://github.com/triffid/LPC17xx-DFU-Bootloader" target="_blank" rel="noopener"
 &gt;DFU bootloader&lt;/a&gt; installed.
This is why boards like this need a bootloader offset.
Otherwise, the bootloader would be overwritten.
Those boards can then usually use Klipper&amp;rsquo;s &lt;code&gt;flash-sdcard.sh&lt;/code&gt; script.&lt;/p&gt;
&lt;p&gt;So we need a bootloader to update the software without entering DFU mode.
For this, we use &lt;a class="link" href="https://github.com/Arksine/katapult" target="_blank" rel="noopener"
 &gt;Katapult&lt;/a&gt;, previously known as &lt;em&gt;CanBoot&lt;/em&gt;.
It is mainly used to update boards connected via CAN bus, but it is also useful for boards connected via USB, like the V0 display.&lt;/p&gt;
&lt;h3 id="esoterical-guide"&gt;Esoterical Guide
&lt;/h3&gt;&lt;p&gt;Because I used Katapult for CAN before, I adapted the installation process from the &lt;a class="link" href="https://canbus.esoterical.online/" target="_blank" rel="noopener"
 &gt;Esoterical CANBus Guide&lt;/a&gt;.
However, there is an even better resource, called the &lt;a class="link" href="https://usb.esoterical.online/" target="_blank" rel="noopener"
 &gt;Esoterical USB Flash Guide&lt;/a&gt;.
The author even replaces the &amp;ldquo;stock&amp;rdquo; bootloader to make updates easier, but in my opinion this is not really necessary.
However, if you need to do anything manually on the board, like pressing buttons or setting jumpers, I strongly recommend switching to Katapult.
This allows updating without any physical interaction.&lt;/p&gt;
&lt;p&gt;This also applies to the Voron 0 display, and the guide even has an article about &lt;a class="link" href="https://usb.esoterical.online/initial_stm32.html" target="_blank" rel="noopener"
 &gt;STM32-based boards&lt;/a&gt;.
However, this is for a generic STM32-based board, and it needs to be adapted.
To adapt it, you would use the Klipper config for your board to set the hardware options.
But I already did this, so you can just follow these instructions.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Note: A lot was copied over from the Esoterical Guide.&lt;/em&gt;&lt;/p&gt;
&lt;h3 id="install-katapult"&gt;Install Katapult
&lt;/h3&gt;&lt;p&gt;Make sure everything is up to date and requirements are met.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt update
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt upgrade
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt install python3 python3-serial
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Download Katapult:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;test&lt;/span&gt; -e ~/katapult &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; ~/katapult &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; git pull&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; ~ &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; git clone https://github.com/Arksine/katapult&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nb"&gt;cd&lt;/span&gt; ~
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;We can then configure Katapult for the Voron 0 display.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; ~/katapult
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;make menuconfig
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;We need to set the &lt;code&gt;Micro-controller Architectures&lt;/code&gt;, &lt;code&gt;Processor model&lt;/code&gt;, &lt;code&gt;Clock Reference&lt;/code&gt;, and &lt;code&gt;Communication interface&lt;/code&gt; to the same values as for the &lt;a class="link" href="https://github.com/VoronDesign/Voron-Hardware/blob/5e5fca5761380576a8bb77f7301cdee90afa0e6e/V0_Display/Documentation/Setup_and_Flashing_Guide.md" target="_blank" rel="noopener"
 &gt;Voron 0 display&lt;/a&gt;.
Then set &lt;code&gt;Build Katapult deployment application&lt;/code&gt; to &lt;code&gt;8KiB bootloader&lt;/code&gt;.
I tried the 4KiB bootloader, but this did not work, so 8KiB it is.
You also have to set the &lt;code&gt;Application start offset&lt;/code&gt; to the same value.
Also enable &lt;code&gt;Support bootloader entry on rapid double click of reset button&lt;/code&gt;, so reflashing gets easier.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Katapult config screenshot for the Voron 0 display" class="gallery-image" data-flex-basis="549px" data-flex-grow="228" height="421" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://vousten.dev/blog/2026/06/easy-klipper-update-for-the-voron-0-display/katapult-voron-0-display.png" srcset="https://vousten.dev/blog/2026/06/easy-klipper-update-for-the-voron-0-display/katapult-voron-0-display_hu_64f2debd2265c5df.png 800w, https://vousten.dev/blog/2026/06/easy-klipper-update-for-the-voron-0-display/katapult-voron-0-display.png 964w" width="964"&gt;&lt;/p&gt;
&lt;p&gt;To leave and save the config press &lt;kbd&gt;Q&lt;/kbd&gt;.
Run &lt;code&gt;make clean&lt;/code&gt; to clean up the environment.&lt;/p&gt;
&lt;p&gt;Katapult is now prepared, but to flash it we have to put the display into DFU mode first.
To do this, install the boot jumper.
Hopefully your display is not yet installed in the printer.
If not, good luck with getting the jumper installed.
I already lost one this way.
Reset the board and use &lt;code&gt;lsusb&lt;/code&gt; to check whether the STM32 is in DFU mode.&lt;/p&gt;
&lt;p&gt;&lt;img alt="STM32 listed in DFU mode via lsusb" class="gallery-image" data-flex-basis="3156px" data-flex-grow="1315" height="80" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://vousten.dev/blog/2026/06/easy-klipper-update-for-the-voron-0-display/stm32-dfu-mode.png" srcset="https://vousten.dev/blog/2026/06/easy-klipper-update-for-the-voron-0-display/stm32-dfu-mode_hu_15e2cfacf79e12cb.png 800w, https://vousten.dev/blog/2026/06/easy-klipper-update-for-the-voron-0-display/stm32-dfu-mode.png 1052w" width="1052"&gt;&lt;/p&gt;
&lt;p&gt;We then run &lt;code&gt;dfu-util --list&lt;/code&gt; and get the ID in the format &lt;code&gt;[xxxx:yyyy]&lt;/code&gt;.
In my case this is &lt;code&gt;[0483:df11]&lt;/code&gt;, so the same as listed via &lt;code&gt;lsusb&lt;/code&gt;.
But better to make sure.&lt;/p&gt;
&lt;blockquote class="alert alert-note"&gt;
 &lt;div class="alert-header"&gt;
 &lt;span class="alert-icon"&gt;📝&lt;/span&gt;
 &lt;span class="alert-title"&gt;Note&lt;/span&gt;
 &lt;/div&gt;
 &lt;div class="alert-body"&gt;
 &lt;p&gt;Katapult recommends doing a full chip erase.
However, I also had success via a simple &lt;code&gt;make flash FLASH_DEVICE=xxxx:yyyy&lt;/code&gt; like the &lt;a class="link" href="https://github.com/VoronDesign/Voron-Hardware/blob/5e5fca5761380576a8bb77f7301cdee90afa0e6e/V0_Display/Documentation/Setup_and_Flashing_Guide.md" target="_blank" rel="noopener"
 &gt;Voron 0 display guide&lt;/a&gt; does.
But for this guide we go with the recommended way.&lt;/p&gt;
 &lt;/div&gt;
 &lt;/blockquote&gt;
&lt;blockquote&gt;
 &lt;p&gt;NOTE: Prior to flashing Katapult it is recommended to do a full chip erase.
Doing so allows Katapult to detect that no application is present and enter the bootloader.
This is required to enter the bootloader if you have not configured an alternative method of entry.&lt;/p&gt;&lt;span class="cite"&gt;&lt;span&gt;― &lt;/span&gt;&lt;a href="#ZgotmplZ"&gt;&lt;cite&gt;Katapult README&lt;/cite&gt;&lt;/a&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p&gt;So we now need to run the following commands:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; ~/katapult
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;make
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo dfu-util -R -a &lt;span class="m"&gt;0&lt;/span&gt; -s 0x08000000:mass-erase:force:leave -D ~/katapult/out/katapult.bin -d 0483:df11
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;It might show an error like &amp;ldquo;Error during download get_status&amp;rdquo;, but if it still lists &amp;ldquo;File downloaded successfully&amp;rdquo;, everything is ok.
However, if you get a different error and &amp;ldquo;File downloaded successfully&amp;rdquo;, &lt;a class="link" href="https://usb.esoterical.online/initial_stm32.html" target="_blank" rel="noopener"
 &gt;Esoterical USB Flash Guide&lt;/a&gt; recommends using &lt;code&gt;sudo dfu-util -R -a 0 -s 0x08000000:leave -D ~/katapult/out/katapult.bin -d 0483:df11&lt;/code&gt; instead.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Successful Flashing without any error" class="gallery-image" data-flex-basis="1189px" data-flex-grow="495" height="197" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://vousten.dev/blog/2026/06/easy-klipper-update-for-the-voron-0-display/katapult-flashing.png" srcset="https://vousten.dev/blog/2026/06/easy-klipper-update-for-the-voron-0-display/katapult-flashing_hu_a6e4acf985b17a7d.png 800w, https://vousten.dev/blog/2026/06/easy-klipper-update-for-the-voron-0-display/katapult-flashing.png 976w" width="976"&gt;&lt;/p&gt;
&lt;p&gt;Katapult should now be flashed successfully and we have to put the STM32 out of DFU mode.
So remove the jumper now and restart the board.
To check whether Katapult is running, execute the following command:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ls /dev/serial/by-id/*
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;img alt="Katapult shows up via ls" class="gallery-image" data-flex-basis="4551px" data-flex-grow="1896" height="54" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://vousten.dev/blog/2026/06/easy-klipper-update-for-the-voron-0-display/katapult-ls.png" srcset="https://vousten.dev/blog/2026/06/easy-klipper-update-for-the-voron-0-display/katapult-ls_hu_c8cfe5ed1f850b17.png 800w, https://vousten.dev/blog/2026/06/easy-klipper-update-for-the-voron-0-display/katapult-ls.png 1024w" width="1024"&gt;&lt;/p&gt;
&lt;p&gt;If Katapult is not visible, double-press the reset button to see whether the MCU enters Katapult.
You need to check via &lt;code&gt;ls /dev/serial/by-id/*&lt;/code&gt; again.&lt;/p&gt;
&lt;h2 id="install-klipper-via-katapult"&gt;Install Klipper via Katapult
&lt;/h2&gt;&lt;p&gt;This step is pretty similar to any other Klipper installation.
We have to stop Klipper, configure it for the targeted hardware and then flash it.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo service klipper stop
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; ~/klipper
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;make menuconfig
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;This time the config is identical to the &lt;a class="link" href="https://github.com/VoronDesign/Voron-Hardware/blob/5e5fca5761380576a8bb77f7301cdee90afa0e6e/V0_Display/Documentation/Setup_and_Flashing_Guide.md" target="_blank" rel="noopener"
 &gt;Display Documentation&lt;/a&gt; except for the &lt;code&gt;Bootloader offset&lt;/code&gt; option.
Here we have to set it to &lt;code&gt;8KiB bootloader&lt;/code&gt; similar to what we configured for Katapult.
Remember to set the &amp;ldquo;Optional&amp;rdquo; features too.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Klipper config screenshot for the Voron 0 display" class="gallery-image" data-flex-basis="637px" data-flex-grow="265" height="357" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://vousten.dev/blog/2026/06/easy-klipper-update-for-the-voron-0-display/klipper-voron-0-display.png" srcset="https://vousten.dev/blog/2026/06/easy-klipper-update-for-the-voron-0-display/klipper-voron-0-display_hu_362d68b870969149.png 800w, https://vousten.dev/blog/2026/06/easy-klipper-update-for-the-voron-0-display/klipper-voron-0-display.png 948w" width="948"&gt;
&lt;img alt="Config screenshot for the optional features" class="gallery-image" data-flex-basis="246px" data-flex-grow="102" height="851" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://vousten.dev/blog/2026/06/easy-klipper-update-for-the-voron-0-display/klipper-voron-0-display-optional.png" srcset="https://vousten.dev/blog/2026/06/easy-klipper-update-for-the-voron-0-display/klipper-voron-0-display-optional_hu_78f8eb4c1c568c.png 800w, https://vousten.dev/blog/2026/06/easy-klipper-update-for-the-voron-0-display/klipper-voron-0-display-optional.png 875w" width="875"&gt;&lt;/p&gt;
&lt;p&gt;To exit and save the config we have to press &lt;kbd&gt;Q&lt;/kbd&gt; again.&lt;/p&gt;
&lt;p&gt;We can now flash the display with the ID we found before.
This can be done via the simple &lt;code&gt;make flash&lt;/code&gt; command.
So in my case this would result in a command like this:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;make flash &lt;span class="nv"&gt;FLASH_DEVICE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/dev/serial/by-id/usb-katapult_stm32f042x6_16002D000843304146393720-if00
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;blockquote class="alert alert-warning"&gt;
 &lt;div class="alert-header"&gt;
 &lt;span class="alert-icon"&gt;⚠️&lt;/span&gt;
 &lt;span class="alert-title"&gt;Warning&lt;/span&gt;
 &lt;/div&gt;
 &lt;div class="alert-body"&gt;
 &lt;p&gt;This is only for the initial Klipper install.
Note that there is a &lt;code&gt;katapult&lt;/code&gt; in the ID.
Afterwards, this is replaced with &lt;code&gt;Klipper&lt;/code&gt;.
So the command has to be adapted!&lt;/p&gt;
 &lt;/div&gt;
 &lt;/blockquote&gt;
&lt;p&gt;Klipper should now be installed.
To check we can use &lt;code&gt;ls /dev/serial/by-id/*&lt;/code&gt; again.
In my case &lt;code&gt;/dev/serial/by-id/usb-Klipper_stm32f042x6_16002D000843304146393720-if00&lt;/code&gt; is listed, which shows that Klipper was installed.
This ID can then be used inside your printer config.&lt;/p&gt;
&lt;p&gt;Restart Klipper and your display is running again.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo service klipper start
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="update-klipper"&gt;Update Klipper
&lt;/h2&gt;&lt;p&gt;Updating Klipper is now pretty easy.
Stop Klipper, check or change the config again, flash the firmware and restart Klipper.
You do not have to set the boot jumper or put the MCU into DFU mode.
&lt;strong&gt;Remember to update the device ID.&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo service klipper stop
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; ~/klipper
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;make menuconfig
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;make flash &lt;span class="nv"&gt;FLASH_DEVICE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/dev/serial/by-id/usb-Klipper_stm32f042x6_16002D000843304146393720-if00
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo service klipper start
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="automatic-updates-and-alternative-flashing"&gt;Automatic updates and alternative flashing
&lt;/h2&gt;&lt;p&gt;You can save the config so you can reuse this later.
There is also a handy &lt;a class="link" href="https://docs.vorondesign.com/community/howto/drachenkatze/automating_klipper_mcu_updates.html" target="_blank" rel="noopener"
 &gt;user guide&lt;/a&gt; hosted on the Voron Documentation for automatic Klipper updates.
So in our case this might look like this:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;span class="lnt"&gt;9
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo service klipper stop
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; ~/klipper
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;make clean &lt;span class="nv"&gt;KCONFIG_CONFIG&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;config.display
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;make menuconfig &lt;span class="nv"&gt;KCONFIG_CONFIG&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;config.display
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;make &lt;span class="nv"&gt;KCONFIG_CONFIG&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;config.display
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;make flash &lt;span class="nv"&gt;KCONFIG_CONFIG&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;config.display &lt;span class="nv"&gt;FLASH_DEVICE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/dev/serial/by-id/usb-Klipper_stm32f042x6_16002D000843304146393720-if00
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo service klipper start
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;em&gt;Note that you have to create &lt;code&gt;config.display&lt;/code&gt; first.&lt;/em&gt;
&lt;em&gt;You can do this via a simple copy.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;There also is an &lt;a class="link" href="https://github.com/crysxd/KlipperAutoUpdate" target="_blank" rel="noopener"
 &gt;automatic update script&lt;/a&gt;, which makes this much easier.
You do not have to write the script yourself, but can use an easy config file.
However, this is only applicable to devices running Katapult, because the script does not support &lt;code&gt;make flash FLASH_DEVICE=...&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;This script uses Katapult&amp;rsquo;s &lt;code&gt;scripts/flashtool.py&lt;/code&gt;, which is used if you want to update firmware via CAN bus.
However, it can also be used over USB.
So if you don&amp;rsquo;t want to use &lt;code&gt;make flash FLASH_DEVICE=...&lt;/code&gt; like we did before, you can run the following command after running &lt;code&gt;make&lt;/code&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;python3 ~/katapult/scripts/flashtool.py -f ~/klipper/out/klipper.bin -d /dev/serial/by-id/usb-Klipper_stm32f042x6_16002D000843304146393720-if00
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="conclusion"&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;We have looked into why other boards can be easily updated, but not the Voron 0 display.
To fix this, we installed a bootloader called Katapult onto the MCU and then installed Klipper.
Updating Klipper can now be done without setting jumpers and even without any physical interaction.
We have also seen how this can be updated and briefly looked at an alternative to &lt;code&gt;make flash&lt;/code&gt;.
Updating your Voron 0 display is now hassle-free.&lt;/p&gt;</description></item></channel></rss>