The 4.2.2 trap: your Ender's "STM32" might be a GD32
By Tess · thought-leadership-writer · 17 June 2026 · 8 min read
Half the guides on the internet tell you the Creality 4.2.2 board runs an STM32F103. For a lot of boards shipped since 2022, that is simply not true — the chip under the heatsink is a GD32F303, a pin-compatible look-alike that Creality doesn't advertise and often laser-blacks the marking on. It runs Klipper's comms, heaters and sensors flawlessly, then refuses to turn a single motor. This is the field guide we wish we'd had on ender-pi: how to spot the swap, why it bites exactly where it does, and what to flash instead.
The bait and switch
"4.2.2" is a board revision, not a chip. Creality has shipped that same silkscreen with at least two different microcontrollers: a genuine STMicro STM32F103, and a GigaDevice GD32F303RET6. The GD32 turns up across the Ender 3 line — it's been seen on Ender 3 Pro boards and inside Ender 3 V2 / V2 Neo machines — and there is no reliable way to know which one you bought from the listing. Community firmware maintainers have been fielding "which chip do I have?" questions for years precisely because the answer is a coin toss per production run.
Worse, the marking is frequently obscured. On our board it was laser-darkened — which, once you know the game, reads less like a manufacturing artefact and more like a confession. The honest tell isn't on the chip at all: Creality publishes two separate stock-firmware downloads, one for the ARM/STM32 boards and one whose filename is prefixed GD- for the GigaDevice boards. If a vendor ships a "GD-" firmware for your printer, that's your answer.
How to tell which chip you actually have
- Read the silkscreen under raking light. Tilt a bright light low across the MCU — the largest square chip on the board. You're looking for
STM32F103versusGD32F303 RET6. The print is often faint or smudged; a phone macro lens helps. (maintainer guidance.) - Check which stock firmware Creality offers for your serial/board. A
GD-prefixed.binmeans a GigaDevice MCU. An ARM-labelled build means STM32. They are not interchangeable (more on that below). - If the marking is unreadable, assume GD32 and plan accordingly. A blacked-out 4.2.2 in 2022-or-later is far more likely to be the GD32 than not. Planning for the harder case costs you nothing; assuming STM32 and being wrong costs you an evening.
Why "pin-compatible" is a trap, not a promise
The GD32F303 is sold as a drop-in for the STM32F103, and at the board level it is: same footprint, same pinout, the firmware mostly runs. But "mostly runs" is the whole problem. The two parts are not the same silicon. The STM32F103 is an ARM Cortex-M3 at 72 MHz; the GD32F303 is a Cortex-M4 that clocks to 120 MHz, with a zero-wait-state flash design that makes it markedly faster, different flash-erase timing, and a narrower operating-voltage window (GigaDevice spec; GD↔ST migration notes). Embedded folks have been warning for years that these clones drop into the socket and then fail in the corner cases nobody re-tested. On a 3D printer mainboard, the corner case is motion.
The signature symptom: everything works except the motors
Here's what the trap looks like in practice, and it's disorienting because nothing looks broken. We flashed stock Klipper firmware built for the STM32F103 target, and:
- Comms — perfect. Host and MCU handshook on the same version.
- Thermistors — perfect. Live, sane temperatures.
- Heaters — perfect. The bed climbed to setpoint.
- Endstops — perfect. Every switch read correctly.
- Stepper enable — fine. Energise a motor and it locks with holding torque.
- Stepper motion — dead. Command a move and the motor holds, twitches, turns nothing. On all four axes.
That pattern is impossible to pin on wiring — loose connectors don't take out four independent step signals identically while leaving enable, heaters and sensors untouched. The only common element is the firmware's step generation, the most timing-sensitive thing the MCU does. A build tuned for one chip's timers and clock tree, running on a faster part it was never compiled for, is exactly where "mostly compatible" stops being good enough.
What to flash instead — two honest routes
This is fixable. There are two legitimate paths, and which you pick depends on whether you actually need Klipper.
Route A — make Klipper GD32-aware
You do not flash a "GD32 Klipper". Klipper has no GD32F303 target; the community consensus is that the GD32F303 is "still a compatible chip of STM32F103", so you build the stm32f103 target — but with the right options for these Creality boards (Klipper forum thread; issue #6181). In make menuconfig the working recipe people report is:
- Processor model: STMicroelectronics STM32F103 (not F303).
- Bootloader offset: 28KiB — to sit behind Creality's stock bootloader.
- Communication interface: USB (on PA11/PA12), or a serial USART if you're wiring it directly.
- Disable SWD at startup, per the thread, on boards that need those pins freed.
Get those right and the steppers come alive. This is the path if input shaping and pressure advance are the reason you're here. Treat the exact flags as version-dependent and follow the current forum thread rather than this list verbatim.
Route B — leave the firmware alone (what we did)
On ender-pi we didn't actually need Klipper's motion planner; we wanted a networked print server. So we flashed Creality's GD-prefixed stock Marlin — the build made for this exact chip — and the printer came straight back: normal LCD, every axis homing, standalone SD printing restored. Then we got the remote half by pointing OctoPrint at it over USB. OctoPrint doesn't replace the firmware; it streams G-code to the stock Marlin already on the board, so the GD32-vs-STM32 question never comes up. You keep both worlds — browser control and standalone printing. For a board that fights Klipper, that's not the consolation prize; it's the cleaner architecture. The full saga is in the brick post, and the layer-by-layer view of what Klipper would have given us is in the Klipper stack explainer.
The mistake that turns a chip swap into a brick
One warning that matters more than all the menuconfig flags: do not cross the firmware branches. Flashing an ARM/STM32 build onto a GD32 board (or the reverse) can corrupt the bootloader, after which the printer can't even read a firmware card to recover — the failure shows up as the maddening "Update failed, No SD/TF-Card" screen (maintainer discussion). That's the same error a Mac-formatted card produces for an entirely different reason, which is how one afternoon becomes two evenings of chasing the wrong ghost. Match the firmware to the chip, and — separately — never format the card on a Mac.
The takeaways
- "4.2.2" tells you the board, not the chip. Confirm STM32F103 vs GD32F303 before you trust any guide that names one.
- A blacked-out marking is a GD32 until proven otherwise. The
GD-firmware download is the reliable tell. - GD32 + everything-works-but-the-motors is a known signature, not a hardware fault. Don't replace the board over it.
- Klipper can run on the GD32 — as an stm32f103 build with the right bootloader offset and comms — or skip it entirely with stock Marlin + OctoPrint.
- Never flash across the ARM/GD firmware split. That's how a working printer becomes an actual brick.
The deeper lesson is the one that cost us the most time: the part you were sure about — the chip the label and half the internet promised you — is exactly the part worth checking first. A clone wearing someone else's silkscreen will run just enough to convince you the problem is somewhere else.
Start here / further reading
- Klipper forum — Support for new Creality 4.2.2 boards with GD32F303 (the working menuconfig recipe)
- Klipper issue #6181 — GD32F303 on Ender 3 V2 Neo
- mriscoc/Ender3V2S1 — GD32F303 RET6 support & the ARM-vs-GD firmware split
- TH3D — Creality V4.2.X GD32 CPU testing update
- EEVblog — PSA: GD32F303 is not a drop-in substitute · GigaDevice GD32F30x series