
Like a README, you will know the amazing things you will get from this course
Download the game and extract it, then follow the instructions in the next lectures to run it.
You will know how to run the game on Windows
You will know how to run the game on Linux
Troubleshooting and contact for support
Know what board will be used in this course and its components
What document we need to write drivers and how to download them?
What software needed for development environment
How to install Keil uVision 5 - where we will build, download software and debug code
How to install VSCode - a powerful code editor in our course. We will mainly using it to write code.
How to install STLink driver - a driver to communicate with programmer and debugger
How to install Git - A must-know version control tool that helps us save our work safely!
Download and run Hercules - Tool to communicate with USART on the board
Install supported package for the board on Keil uVision 5
Initialize git for the project
"Hello World" project to test the installation and environment setup
Show you basic Git commands
Show the importance of the "Volatile" keyword through examples
Commit "Volatile" code and show you how to switch between commits
Overview architecture of the MCU - Where you can see how processor connects to peripherals through buses
Examples of how the processor writes data to or reads data from peripherals
A simplified version of the MCU architecture that gives a better view of how everything connects inside the MCU.
Bus matrix – an interconnect that directs data between masters and target slaves
The clock system in the MCU that provides the timing for it to operate.
The memory map provides addresses for all components in the MCU, so the processor knows exactly where to access data.
Explore gpio basics on stm32 f4 mcu. Read the reference manual for gpio registers and code a driver to led control, read a button, and generate dyno game's jump signal.
General Purpose Input/Output (GPIO) – a simple yet powerful peripheral for beginners to write their very first embedded driver from scratch.
Inside the output buffer
Inside the input buffer
Input buffer behavior when there is no external connection
Input buffer behavior with pull-up/pull-down resistors
Output buffer behavior in different configurations
How quickly the output buffer changes its signal levels
How GPIO in STM32F407 looks like
How input configuration works in the MCU
How output configuration works in the MCU
How a GPIO pin configured in alternate function mode works
How a GPIO pin configured in analog mode works
Some notes that show you how to learn this section affectively
An overview of all registers in a GPIO peripheral
A register that you can use to configure GPIO pin mode like input, output, alternate function or analog mode
A register that you can use to configure the output type like push-pull or open-drain
A register that you can use to enable or disable pull-up/pull-down register
A register that you can use to set the output speed
A register that you can read input data (0 or 1) of GPIO pins
A register that you can use to set output data (0 or 1) of GPIO pins
A register that you can use to set output data of a specific output pin
You can use this register to lock all configuration registers from modifying
A couple of registers that you can use to set the alternate function for a GPIO pin
Engage in a hands-on section that guides you through writing the first gpio driver line by line with explained steps. Pause and implement your code alongside the instructor.
How to use structure in C to access a set of registers of a peripheral
Define a GPIO register definition struct to access GPIO registers
Define base address of GPIO ports in the MCU
Define GPIO pin configuration struct to store your GPIO setting before write it to the registers
Define macros for configuration values so your driver is readable
Define basic function prototypes that we will need to run the GPIO driver
Write a GPIO initialization function
Write a GPIO initialization function
Implement a function to write data (0 or 1) to a specific output pin
Implement an application that blink an LED to test driver implementation
Define RCC register definition struct to enable peripheral's clock
Define macros enable peripheral's clock and retest the driver
Configure the Keil so that you can download the code and it will be automatically run
Commit your first driver code
Connect external leds to gpio pins with a resistor, configure and control them in code, and see a red led on PD 11 turns on when reset button is pressed.
Implement a function to read data (0 or 1) from a specific GPIO input pin
Implement an application to read the state of the User button and control the LED base on input values
Implement a function to toggle the state of a GPIO output pin (0 to 1 or 1 to 0)
Test the implementation of toggle pin function
Commit code and give you a coding challenge
The answer of the challenge
Implement a function to control the output value of a specific GPIO pin at bit level and test it
Implement a function to lock all configuration registers from modifying
Test the implementation of the lock configuration function by locking the GPIO mode register
How to comment your code properly you that you will not forget what you have done in the next few months
An overview of what you will learn in the interrupt sections
What is interrupt and how it works
A table that contents the address of interrupt service routines and IRQ numbers
Provide an overview of how the program responses to an interrupt event
Interrupt with GPIO and components that support GPIO interrupt
Inside the EXTI and how does it connect to the NVIC
Steps to setup interrupt for a GPIO pin
I started out as a beginner (or “snoop”), unsure where to start. Today, I confidently apply embedded knowledge in professional projects and take part in expert-level technical discussions. That’s why I know exactly which parts are confusing for beginners — and I’ve made it my mission to explain them simply and clearly.
Are you ready to stop relying on libraries and start writing your own embedded drivers from scratch?
This hands-on course is designed to teach you how to build essential embedded drivers — for GPIO, USART/UART, Timers — with no HAL, no abstraction, and no shortcuts. Whether you're a beginner or a self-taught enthusiast, this course will help you gain full control of the microcontroller by programming directly at the register level.
Instead of endless theory, we use a project-based learning approach. Throughout the course, you'll apply each driver you build to control a fun, interactive Dino game — a perfect way to instantly see the result of your code in action and stay motivated as you progress.
You don’t need any prior experience with low-level embedded programming. We’ll start from the very beginning: installing the necessary tools, setting up your environment, and writing your first embedded driver step-by-step.
To help you learn effectively, this course uses animations, graphs, and diagrams to break down complex ideas — instead of overwhelming you with text-heavy slides. I also use a live coding style throughout the course, so it’ll feel like you and I are sharing the same screen, learning side by side. You'll see exactly how I think, troubleshoot, and write real embedded code in action.
This course is carefully designed to be completed in around 8.5 hours, so you can finish it in one to two weeks — or even faster if you're a quick learner. You’ll walk away with practical skills, real project experience, and the confidence to build embedded systems without relying on pre-written libraries.
If you’re ready to take full control of embedded systems and actually see your code come to life, this course is for you.
Let’s build drivers — and make the Dino run!