May 14, 2026

Blink and you’ll miss the meltdown

Bare-metal STM32: vector table, linker script, and startup code from scratch

Programmer ditches the training wheels and the comments instantly turn it into an ESP32 roast

TLDR: A developer made a basic blinking-light program on an STM32 chip without any helper framework, just to expose all the hidden setup most tools do for you. Commenters were especially hooked by the swipe at ESP32, with at least one admitting the criticism was painfully true.

A developer tried the most gloriously nerdy version of "keeping it simple": making a tiny light blink on an STM32 board from absolute scratch, with no helper tools, no prebuilt shortcuts, and no comforting safety net. Instead of using the usual ready-made software layers, they went old-school and built the setup themselves just to see what’s normally hidden behind the curtain. The big revelation? The "easy" version is only easy because a mountain of complicated stuff is being quietly handled for you.

But the real fireworks came from the crowd. One commenter zeroed in on the article’s side-swipe at Espressif’s ESP32 chips and basically delivered a reluctant confession: they were ready to argue, then had to admit the author had a point. That little U-turn is the whole mood of the thread — equal parts denial, respect, and "ugh, fine." The hot take is that some microcontrollers feel wonderfully free and low-level, while others still keep you tied to the official toolkit whether you like it or not.

There’s also a delicious identity crisis running through the piece: the author works in embedded software — software meant to be close to the machine — but admits that modern industry stacks can be so layered that they’re not as "close to the metal" as people love to brag. That honesty landed hard. The joke underneath it all? Even a blinking light, the electronics version of Hello World, can turn into a full-on existential meltdown about who’s really in control: the programmer, the framework, or the giant pile of hidden setup code.

Key Points

  • The article uses a blinking LED on an STM32 Nucleo-F446ZE as an embedded "Hello World" to study the complete low-level build and startup path.
  • It contrasts a concise Rust implementation based on cortex-m-rt and stm32f4xx_hal with a C implementation that avoids HAL, CMSIS, and vendor frameworks.
  • The Rust example relies on runtime support for the vector table, reset handler, .data copying, and .bss zeroing, with the linker configured through a small memory.x file.
  • The author’s goal is to understand what abstraction layers provide by rebuilding the same functionality from the reference manual and compiler alone.
  • For the bare-metal C version, the article identifies the core steps as enabling the GPIOB clock, configuring PB0 as an output, and toggling the output register in a loop.

Hottest takes

"was about to disagree, but after one second's thought, the author is right" — mianos
"you’re always tied to ESP-IDF" — article sentiment echoed by commenters
"simple is almost never really simple" — article line fueling the thread mood
Made with <3 by @siedrix and @shesho from CDMX. Powered by Forge&Hive.