
Extract the downloaded package, run the STM32CubeIDE installer, and follow prompts to install on a drive with more space, then launch the IDE and set a workspace.
Download and review the stm32l4 datasheet and reference manual to understand registers and bits. Access the Nucleo board user guide to map board connections and plan your bare-metal development.
Learn to locate stm32l4 ports and pins on the Nucleo board, identify Port A pin 5 as the user led, and build peripheral addresses from scratch for a bare-metal project.
Trace the memory map to locate a peripheral address by identifying the peripheral region and APB/AHP buses, then define the base address with offsets and enable clock access via RCC/RACC.
Locate peripheral base addresses, compute register addresses from offsets, and configure pins using mode and output data registers. Enable peripheral clocks via the RCC peripheral clock enable register.
Configure STM32L4 bare-metal pins by enabling RCC, setting MODER bits for pin 5 via bitwise operations, and driving ODR to toggle the LED in an infinite loop with a delay.
Map peripheral registers using a struct, align offsets, and access via base address casts to volatile pointers; demonstrate with RCC and GPO peripherals.
Explore GPA basics, including pins organized into ports and alternate functions. Review the direction and data registers, HP and APB buses and RC, crystal, PLL.
Develop a GPIO output driver by leveraging ST's pre-defined register headers, downloading the sdm32l4 package, and integrating the device header to configure registers efficiently.
Explore controlling STM32L4 GPIO outputs with the bit set/reset register (BSRR), using set and reset operations to blink a LED via specific pin bits.
Develop a GPIO input driver for the stm32l4 board by enabling GPIOC clock, configuring PC13 as input, and reading the IDR bit 13 to detect an active-low push button.
Master the uart protocol basics, serial vs parallel, synchronous versus asynchronous transmission, framing with start and stop bits, baud rate, parity, and word length.
Develop and test a uart transmitter driver by implementing modular usart write function that waits for the transmit data register to be empty, then writes to tdr, with realterm verification.
Retarget printf for the stm32l4 by implementing the UTX driver's _putchar function, copy and adapt the project, build it, and verify serial output on the board.
Modularize the uart tx driver by separating it into its own files, exposing only the necessary function, and including the header in the main program.
Develop a UART receiver driver for STM32L4 by adapting project, enabling PA3 as AF7, and implementing a read function that waits for the receive data register and returns the byte.
Test the UART receiver driver on STM32L4 bare-metal by enabling clock access, configuring output pins, reading user input, and validating LED on/off responses via a switch, debugger, and real-time port.
Understand how analog signals from transducers convert to digital numbers with ADCs, enabling microcontrollers to read sensors, and how 8–24 bit resolutions and Vref affect step size.
Explore adc independent modes on stm32l4 by comparing single channel single conversion, multi-channel single conversion, single channel continuous conversion, multi-channel continuous conversion, and injected continuous conversion.
Develop an adc driver by configuring clock access to the adc modules and GPA pins as adc inputs, select channel nine, calibrate, enable the regulator, and read data after conversion.
Develop an stm32l4 adc driver init by enabling clocks and configuring analog mode, and connecting the analog switch. Calibrate, enable, start conversion, and read end-of-conversion flag from the data register.
Develop the adc single conversion driver by configuring the adc to single conversion mode and observing that the conversion runs once and then stops.
Understand the Cortex system tick timer, a 24-bit down counter that drives the real-time heartbeat, with current value, reload value, and system control registers managing clock source and interrupts.
Learn to implement a precise system tick timer driver on a Cortex-M4, configuring systick for millisecond delays using reload and count flags, with internal or external clock sources.
Develop a general purpose timer driver by selecting a timer, configuring the APB clock, and setting prescaler and auto-reload values to achieve one hertz and enable the timer.
Develop a timer output compare driver by configuring timer 2 channel 1 in output compare mode, enabling APB1 clock and alternate function, and starting the counter for 1 Hz beeps.
Understand how interrupts notify the cpu to service modules via the interrupt service routine. Explore how the nvic, vector table, external interrupt lines, and priority configuration enable ISR execution.
Develop a GPIO interrupt driver for STM32L4 by configuring PC13 as external interrupt, enabling clocks, setting GPIO mode, unmasking the interrupt, and selecting a falling-edge trigger.
Test the STM32L4 bare-metal GPIO interrupt driver by configuring input and output, handling the interrupt in the handler, clearing the pending register, and printing status with printf.
Develop a systick interrupt driver for stm32l4 bare-metal. Enable the systick, configure a 1 hz timer from a 4 mhz clock, and implement the interrupt callback that prints a message.
Develop a timer interrupt driver for a general-purpose timer by enabling the timer, configuring auto-reload values, enabling update interrupts, and wiring a time1 interrupt to a callback.
Master the I2C two-wire protocol, with SCL and SDA lines and pull-up resistors; learn start/stop conditions, address and data frames, MSB first, and clock speeds from 100 kHz to 3.4 MHz.
Implement the I2C slave configuration in a STM32L4 bare-metal project by enabling clocks, mapping pins to I2C, enabling pull-ups, setting the device address, and enabling interrupts.
Implement the i2c master configuration function by enabling gpio and i2c clocks, configuring pc0 and pc1 as alternate function open-drain with pull-ups, and setting i2c timing for master operation.
Implement the I2C master communication sequence by configuring slave and master, setting seven-bit addressing, transfer size, transmitting data via TXDR with TXI, and clearing stop flags with the ICR.
Implement an I2C slave interrupt handler on STM32L4, validate the address, enable IREX, read data from the I2C receive data register, and trigger a completion callback.
Explore the serial peripheral interface (spi) basics, including master-slave configurations, clock polarity and phase, mosi/miso data lines, ss selection, and full-duplex data transfer.
Configure the SPI peripheral by enabling its clock, selecting the SPI unit, and setting polarity, phase, duplex mode, 8-bit data, master mode, and slave management before enabling transmit and receive.
Implement SPI master configuration function by setting SPI1 as master and SPI3 as slave, enabling clocks, configuring pins for alternate functions, establishing clock polarity and phase, speed, and interrupts.
Configure and test an SPI rx/tx driver between master and slave, implementing interrupt-driven callbacks, data buffers, and cross-device wiring to verify communication.
Are you tired of Copying and Pasting code you don't understand?
With a programming based approach, this course is designed to give you a solid foundation in bare-metal firmware development for ARM-based microcontrollers . The goal of this course is to teach you how to navigate the microcontroller reference manual and datasheet to extract the right information to professionally build peripheral drivers and firmware. To achieve this goal, no libraries are used in this course, purely bare-metal embedded-c and register manipulations.
Still keeping it simple, this course comes in different ARM Cortex-M development boards so that students can put the techniques to practice using an ARM Cortex-M development board of their choice. This version of the course uses the STMicroelectronics STM32L4-NUCLEO which has an ARM Cortex-M4 microcontoller.
So with that understood, let me tell you…
Exactly What You’re Getting
This is dramatically different from any course you have ever taken because it’s more of a professional hands-on “field guide” to stm32 bare metal firmware development.
The reason why is because there’s no fluff or filler. It immediately gets down to the actual subject, showing you exactly what to do, how to do it, and why.
Plus, it’s easy.
And you’ll immediately “get” the entire mythology I personally use to build firmware for consumer devices in my professional life.
It's About MORE Than Just Getting the Code to Work
See, this course will change your professional life forever. Here is what one student had to say about the 1st version (STM32F4) of the course :
"I would suggest this course for all the beginners. The concepts have been covered in the right sequence.And also the best part of this lecture series is getting to know how to explore the reference manual and datasheets."
Here is what another student had to say :
"Extremly helpful to get to understand the uC programming deeper! For me it is much easier from now to develop code because I undertstand the base behind, so I'm more confident and more experienced to develop and debug the code. Really, this course is very useful to link the hardware knowledge with the coding skills. This fills the gap between them. Thanks for it! :)"
A third student :
"I am a professional semiconductor chipset application engineer with 30 years in global embedded product design in system applications. I can say this teacher is very straight forward by sharing his many years knowledge to the students with his true heart. Yes. I love his teaching pace and style!"
The First Version (STM32F4) is being Taken by 5000+ Students with 1000+ Reviews
If at least one of the following applies to you then keep reading if not then simply skip this course:
" Escape From "
Copying/Pasting code you don’t understand
Using third party libraries and header files like HAL, LL and StdPeriph
Experiencing bugs you don’t understand
Being afraid of technical documentations like the reference manual and datasheet of the chip
Imposter syndrome
" Arrive At "
Building every single line of code from scratch by writing to the microcontroller’s memory space directly.
Using No third party libraries or header files
Understanding and writing every single line of code yourself- no Copy/Paste
Using the debugger effectively to analyze and resolve any bugs
Developing proficiency in your embedded development skills and confidently take the next steps
So like I said, there’s more than just getting each piece of code to work.
Here’s an overview of what you’re getting...
Analyzing the chip documentations:
Before developing the firmware for any chip you have to learn how to read the documentation provided by the chip manufacturer.
Defining Peripheral address
All components on the microcontroller have an address range. To write to a component or read from a component you need to locate its address range in the documentation and properly define the addresses in your code.
Creating registers from the address:
The addresses in the address range of a component represent the registers of that component. To access these registers you have effectively typecast the addresses.
Understanding CMSIS:
Cortex-Microcontroller Interface Standard (CMSIS)CMSIS is a standard developed by Arm for all Cortex-Microcontrollers. This is the standard used in professional firmware development
But it gets better because you’re also getting…
Deep Lessons on Developing Peripheral Drivers
You will learn how to develop bare-metal drivers for the following peripherals :
Analog-to-Digital Converter (ADC)
Serial Peripheral Interface (SPI)
Inter-Integrated Circuit (I2C)
Nested Vector Interrupt Controller (NVIC)
General Purpose Timers (TIM)
System Tick Timer (SysTick)
General Purpose Input/Output (GPIO)
Specially Designed For People Who Hate Copy/Paste
Listen. If you don’t like “Copy/Paste” you’re not alone. I can’t stand it either. I’d literally rather have a piece of code that I wrote from scratch that doesn’t work than someone else’s working code I copied and pasted.
And that’s why I’ve spent months designing and recording this course in which I show you how to locate every single register used and the meaning of every hexadecimal value written into the register.
Also it comes with a money back guarantee so you have nothing to loose.