all writing

The Tronxy that didn't want to live: a Klipper conversion

I spent three evenings fighting the undocumented v10 board to prove I could — the board that just worked in one try had been in storage the whole time.

Dark editorial cover: a dense tangle of jumper wire connector pins in near-black charcoal, with a single electric lime wire tracing a glowing path through the center toward one luminous contact point against a void.

I bought a Creality K2 Plus and it ruined me. Not because it’s bad — because it’s good. Fast, quiet, running Klipper with a Moonraker API I could poke from a browser. I started printing parts and almost immediately started wondering why the Tronxy XY2 Pro gathering dust in the corner couldn’t have the same setup.

The Tronxy is a good little printer. Decade old, a bit rattly, but it prints. I’d already upgraded it with a glass bed and a new touch sensor. It deserved better than stock Marlin.

How hard could it be.

Act I: The SD card that did nothing

The v10 board I was running supposedly supports firmware updates via SD card. You copy the file, power cycle, and it flashes. Simple.

I tried this. The file did not flash. I ejected the card, checked it, reinserted it, power cycled again. Nothing. No indication that anything happened. The board booted as if the SD card wasn’t there.

A Raspberry Pi 4 and an STM programmer arrived two days later. Time to do this properly.

Act II: The jumper that wouldn’t jump

To flash firmware directly over USB you need to get the STM32 into DFU bootloader mode. You do this by pulling the BOOT0 pin high before power-on. There’s a jumper header for it. Simple in theory.

I tried every combination. Jumper on. Jumper off. Power cycle. Connect programmer. Nothing. More combinations. I got the multimeter out and started tracing pins. Found JP1. Connected it to 3.3V. The ST-Link stopped detecting the board entirely. Removed it — detection came back.

Hours of this.

Eventually — through a combination of stubbornness and desperation — I found the trick: you have to connect both JP1 (BOOT0) and the adjacent B1 pin to VCC, and do it while the board is powering on. Not one pin. Both. Timed to the power cycle. I still don’t fully understand why. I stopped asking questions.

The programmer connected. I was in.

Act III: The chip erase heard round the workshop

Inside the ROM, I could finally write firmware. I built Klipper, connected the programmer, and sent it.

To the wrong address.

The STM32 has a Tronxy bootloader at the start of flash. Klipper needs to live at an offset so it doesn’t overwrite it. I missed this, flashed to the base address, and the programmer ran a mass erase first. The bootloader was gone.

I stared at the board for a bit.

Then I realised: I still had the programmer connected. The chip was still accessible. I reflashed Klipper to the correct offset and restored the original bootloader to address zero. The board came back. Crisis averted, mostly by luck.

Act IV: Serial connection closed

Klipper was on the board. Verified at the right address. The serial port showed up on the Pi. Klipper just… wouldn’t talk to it.

mcu 'mcu': Wait for identify_response
Serial connection closed

I tried every clock speed. 8 MHz. 12 MHz. 16 MHz. The v10 board is labelled “CXY-446” which implies an STM32F446 — 12 MHz crystal, Cortex-M4. But the close-up photo I’d taken of the chip showed markings that looked like an F103. I built firmware for both. Neither connected. The serial port received data — all null bytes — and Klipper couldn’t make sense of any of it.

I never definitively identified which chip I actually had. That is, in hindsight, the root of the whole problem. You cannot build firmware for an MCU you haven’t confirmed.

I thought about Gandhi. I decided that if he’d worked in tech, he would have developed an eye twitch.

Act V: The v6 board in storage

Somewhere deep in this process, I remembered: I had a CXY-V6 board sitting in storage. Bought as a spare years ago, never used.

The v6 has a proper bootloader. You drop a .cbd file onto an SD card and power on. Same method that failed on the v10 — except the v6 actually does it.

I swapped the boards. Copied the file. Powered on.

First try.

I sat there for a moment, oscillating between relief and low-grade fury. Days of effort. The answer was in a box on the shelf the entire time. I wanted to be the person who made the v10 work — not for any practical reason, just because it wasn’t well documented and I thought I could figure it out. That instinct cost me several evenings.

It’s not a bad instinct. But it needs a time limit.

The payoff

The Tronxy now runs Mainsail, managed from the same dashboard as the K2 Plus. It’s my overflow printer — the K2 gets the engineering parts and anything time-sensitive, and the Tronxy handles the “I just want to try this shape” prints. The Pi sits on the side doing its job.

It works well. No complaints.

The conversion is worth doing. Just do it on the v6 board.

Jacques Bronkhorst
Principal engineer who ships across the stack — enterprise .NET by day, an over-engineered home lab by night. Writes it all down at jcqb.dev.
next up
Trust in AI is at an all-time low and your tests are why