COURSE HUB
Embedded Systems & Microcontrollers
Original, from-scratch lessons on how microcontrollers work and how to program them in C, C++ and Assembly. More pages are being added in batches.
- 01 — What Is an Embedded System?
- 02 — Microcontroller vs Microprocessor
- 03 — MCU Memory: Flash, SRAM and EEPROM
- 04 — Clocks and Reset
- 05 — GPIO: General-Purpose Input/Output
- 06 — C: The Standard Language for Firmware
- 07 — C++ for Embedded Systems and Arduino
- 08 — Assembly Language Basics
- 09 — Interrupts
- 10 — Timers and Counters
- 11 — Analog-to-Digital Conversion
- 12 — PWM: Pulse Width Modulation
- 13 — UART Serial Communication
- 14 — The I2C Bus
- 15 — The SPI Bus
- 16 — Watchdog Timer and Sleep Modes
- 17 — State Machines in Firmware
- 18 — Debugging Firmware
- 19 — The PIC Microcontroller Family
- 20 — The AVR Microcontroller Family
- 21 — ARM Cortex-M Microcontrollers
- 22 — Arduino Boards in Context
- 23 — ESP32: Microcontrollers with Wi-Fi
- 24 — Bit Manipulation in C
- 25 — Pointers and Memory-Mapped Registers
- 26 — The Microcontroller Memory Map
- 27 — Assembly: Registers and Status Flags
- 28 — Programming the Chip: Bootloaders and Programmers
- 29 — Power Management for Microcontrollers
- 30 — Connecting Sensors
- 31 — Debouncing Buttons
- 32 — Driving LEDs and Seven-Segment Displays
- 33 — Controlling Motors
- 34 — Circular Buffers
- 35 — Fixed-Point Maths
- 36 — Real-Time Operating System Basics
- 37 — Embedded C++: Templates and constexpr
- 38 — Defensive Firmware Practices
- 39 — Character LCD Displays
- 40 — External Storage: Flash Chips and Memory Cards
- 41 — Real-Time Clocks
- 42 — CAN Bus and RS-485
- 43 — Wireless Modules for Microcontrollers
- 44 — USB and Serial Bridges
- 45 — Testing Firmware
- 46 — Project: Blink an LED with Timer Interrupts
- 47 — Project: Temperature Logger
- 48 — Project: Temperature-Controlled Fan
- 49 — Structs, Unions and Bit-Fields
- 50 — Function Pointers and Callbacks
- 51 — Macros vs Inline Functions
- 52 — Start-Up Code and the Linker
- 53 — Stack and Heap Usage
- 54 — C++ Hardware Abstraction Layers
- 55 — Inline Assembly in C
- 56 — Assembly: Subroutines and the Stack
- 57 — Low-Power Design Techniques
- 58 — Project: Ultrasonic Distance Meter
- 59 — Firmware Security Basics
- 60 — Over-the-Air Firmware Updates
- 61 — Decoupling Capacitors and Power Rails
- 62 — Crystals and Clock Circuits
- 63 — ESD and EMC Protection
- 64 — Assembly: Exact Timing Loops
- 65 — Assembly: Writing an Interrupt Routine
- 66 — Endianness and Data Formats
- 67 — Project: RGB Mood Lamp
- 68 — Project: Keypad Door Alarm
- 69 — PIC Configuration Bits and Oscillator Setup
- 70 — AVR-Style Ports: Direction, Output and Input Registers
- 71 — ARM Cortex-M Interrupt Priorities
- 72 — ESP32: Wi-Fi Connection and Deep Sleep
- 73 — Arduino Sketch Structure and Libraries
- 74 — Direct Memory Access (DMA)
- 75 — Comparators and DAC Outputs
- 76 — Rotary Encoders and Other Inputs
- 77 — Project: Mini Weather Station
- 78 — Project: Closed-Loop Motor Speed Control
- 79 — Microcontroller or Single-Board Computer?
- 80 — PIC Peripherals in Practice: ADC and PWM
- 81 — The ARM Vector Table and Reset Sequence
- 82 — ESP32 Tasks and Dual Cores
- 83 — From Arduino Code to Bare-Metal
- 84 — C Coding Style for Firmware
- 85 — C Pitfalls: Undefined Behaviour and Overflow
- 86 — C++ RAII for Peripherals
- 87 — C or C++? Code Size and Speed
- 88 — Assembly: Shifts, Multiply and Divide
- 89 — Reading Compiler Output
- 90 — Optimisation and Profiling
- 91 — Version Control and Build Systems
- 92 — Documenting Firmware
- 93 — PCB Layout for Microcontroller Boards
- 94 — Drawing the Microcontroller Schematic
- 95 — Reading a Microcontroller Datasheet and Manual
- 96 — Production Programming and Testing
- 97 — Troubleshooting Checklist
- 98 — Project: Battery-Powered Sensor Node
- 99 — Project: A Tiny Serial Command Shell
- 100 — Course Summary and Next Steps