I2C vs SPI vs UART: Wiring, Speed, and How to Choose

A side-by-side comparison of the three serial buses every microcontroller project runs into — I2C, SPI and UART — across four axes: number of signal lines, speed, how many devices you can hang off them, and wiring distance. Includes a decision flow and what to look for on a scope.

July 20, 2026 · 20 min · 

STM32 Series #12: Optimization and Assembly in C

The compiler transforms code while preserving meaning — but forget volatile and it changes the meaning too. See how assembly changes between -O0 and -O2 with objdump, and close out 12 episodes with the ‘conditions for embedded mastery.’

May 8, 2026 · 26 min · 

STM32 Series #11: Linker Scripts and Map Files Explained

“RAM is full!” “A variable is changing on its own…” The answer is in the map file. This episode covers what .text/.data/.bss really are, how to read a linker script, how to stop stack overflows — and what the 512,000-line Claude Code leak teaches us about map file hygiene.

May 2, 2026 · 19 min · 

STM32 Series #10: DMA — Transfers That Free the CPU

Stop having the CPU send bytes one at a time — let DMA handle everything. By DMA-ifying UART transmission, the CPU is freed to do real work. Episode 10 builds intuition for throughput, latency, and bus contention.

April 30, 2026 · 16 min · 

STM32 Series #9: Interrupt Design Anti-Patterns

printf in ISR, missing volatile, heavy processing, forgotten flag clear — we deliberately trigger every classic embedded landmine and watch them fail. Applies to Arduino, ESP32, Renesas, PIC — every MCU with interrupts.

April 26, 2026 · 18 min · 

STM32 Series #8: Interrupts — Vector Table, NVIC, Context

Why does polling fail when you need to ‘do something every 1ms’? Understand the vector table, NVIC, and context saving — then implement a 1ms periodic event with TIM2 interrupts.

April 17, 2026 · 24 min · 

STM32 Series #7: The Weight of a Single Clock Cycle

How many CPU cycles does ‘wait 1 second’ actually consume? Learn to measure execution time in µs using DWT CYCCNT, and internalize the embedded engineer’s iron rule: ‘you can’t discuss it without measuring it.’

April 8, 2026 · 20 min · 

STM32 Series #6: The Complete Pointer Accident Handbook

NULL dereference, dangling pointers, out-of-bounds array access, undefined behavior — we deliberately trigger the classic pointer land mines of embedded development and observe them under the debugger. Knowing how things break is the most powerful way to learn.

March 28, 2026 · 29 min · 

STM32 Series #5: Pointers as Typed Addresses

Demystify C’s most feared concept — pointers — from the core principle of ’typed addresses.’ What casts mean, how memory-mapped I/O connects to pointers, and what CMSIS headers are actually doing. Stop fearing pointers and start using them as a weapon.

March 25, 2026 · Updated: March 29, 2026 · 28 min · 

STM32 Series #4: The World of Bits — Register Ops and BSRR

From mask/shift basics to the RMW problem to STM32’s elegant BSRR design. Learn to read registers as bit collections, practice register-direct LED blinking through GPIO, and measure the speed difference between HAL and direct register access.

March 14, 2026 · 23 min · 

STM32 Series #3: Struct Padding and Alignment in Memory

Use the STM32 debugger Memory view to observe struct padding and alignment in C. See why sizeof() doesn’t always equal the sum of member sizes, learn how to reduce RAM usage by reordering members, and understand volatile through actual byte-level inspection.

March 6, 2026 · Updated: March 12, 2026 · 19 min · 

STM32 Series #2: Where Variables Live — Flash, RAM, and the Stack

C variable declarations (const, global, local) determine which memory region data lands in. Use the debugger to verify actual addresses and understand the difference and purpose of Flash, SRAM, and the Stack.

March 1, 2026 · 17 min · 

STM32 Series #1: The Microcontroller as an Address World

Use the STM32CubeIDE debugger to observe the microcontroller’s internal state as your program runs. Understand the physical ‘address’ coordinates underlying C code — program counter, memory map, register writes — and experience the embedded address world through real measurements.

February 23, 2026 · 13 min · 

STM32 Series #0: Why Embedded Programming Looks Hard — Place and Time

Embedded programming looks hard because it requires awareness of ‘place’ (memory) and ’time’ (execution timing). What does it mean to operate hardware directly without an OS protecting you? This article explains the core mental model.

February 17, 2026 · 10 min · 

13-Part Series: The Embedded World Beyond Pointers

The next step after Arduino! Serious embedded programming with the STM32 microcontroller. Addresses, bits, and time — understand the essence of embedded systems step by step, building a solid mental model that applies to any platform.

February 12, 2026 · Updated: April 8, 2026 · 11 min ·