BARE METAL
STM32 Bare-Metal Driver Library
Register-level drivers for RCC, GPIO, USART, SPI, I²C, timers and more — built without a HAL.
Learn embedded systems the way firmware engineers work: understand the architecture, configure the registers, write the driver, flash the target, measure the signal and debug the result.
Move from theory to real hardware with a workflow built around reference manuals, register-level code, flashing, measurement and debugging.
Understand how CPU, memory, buses, clocks and peripherals connect.
Write low-level code and drivers with explicit hardware behavior.
Connect sensors and devices using UART, SPI, I²C and CAN.
Work with interrupts, timers, scheduling and deterministic execution.
How computers, microcontrollers, memory, clocks and peripherals fit together.
Logic, signals, voltage levels, timing and digital building blocks.
Pointers, arrays, structures, memory, bit operations and debugging.
volatile, const, registers, linker concepts, startup and low-level code.
MCU architecture, clock trees, memory maps and peripheral blocks.
CPU, exceptions, NVIC, SysTick, stack, registers and debugging.
Addressing, memory-mapped I/O, linker scripts and register-level access.
Pin multiplexing, modes, pull-ups, outputs, inputs and hardware testing.
Interrupt flow, priorities, ISRs, latency and safe interrupt design.
Prescalers, counters, capture/compare, periodic interrupts and timing.
Duty cycle, frequency, timers, motor control and waveform verification.
Baud rate, frame format, registers, TX/RX and debugging with analyzers.
Clocking, CPOL/CPHA, chip select, registers and driver implementation.
Addressing, ACK/NACK, open-drain signaling, timing and bus recovery.
Frames, arbitration, bit timing, filters, errors and automotive networks.
Sampling, resolution, conversion timing, channels and calibration.
Peripheral transfers, descriptors, interrupts and CPU offloading.
Tasks, scheduling, synchronization, queues, timing and real-time design.
ECUs, networks, diagnostics, HIL, calibration and production constraints.
Software architecture, MCAL concepts, UDS, DTCs and integration.
Bootloaders, BMS, safety, performance, debugging and production systems.
Start with the concept and architecture.
Translate the concept into register-level C.
Verify signals with real hardware and tools.
Find the gap between expected and actual behavior.
Register-level drivers for RCC, GPIO, USART, SPI, I²C, timers and more — built without a HAL.
Understand frames, arbitration, bit timing, filters and practical debugging.
Explore BMS architecture, sensing, communication and embedded control concepts.
Every code example will connect the implementation to the hardware: register → bit → behavior → measurement.
Explore Code Library →void SPI_Init(void)
{
// Enable SPI peripheral clock
RCC->APB2ENR |= RCC_APB2ENR_SPI1EN;
// Configure master mode + clock
SPI1->CR1 |= SPI_CR1_MSTR;
SPI1->CR1 |= SPI_CR1_BR_0;
// Enable SPI
SPI1->CR1 |= SPI_CR1_SPE;
}