
Download stm32cubeide from the stm32 cube ide website for Windows, Linux, or macOS, create a free account, log in, and start the download.
Extract the downloaded package, run the installer, choose the installation location with enough space, ensure GST linked drivers, then create a desktop shortcut, launch the IDE, and allow firewall access.
Learn bare-metal STM32 F7 development by gathering chip documentation, including datasheet, reference manual, and user guide, to build drivers from scratch for a Nucleo board.
Locate ports and pins on the nucleo board using the user guide and layout to map pb7 blue LCD and pb0 green LED connections, and interpret bridges and default states.
Define peripheral addresses from the memory map to access gpio port b registers and build base and offset addresses from the peripheral base across apb and ahb regions.
Learn to enable GPIO clocks via the RCC, gate clocks to save power, and configure PB pins as outputs using MODER and the ODR to drive them.
Configure pins by enabling port B clock, setting PB pins as outputs, and driving the led via odr writes with or operations, using friendly read-modify-write updates.
Learn to create registers from structure members by defining peripheral structures, mapping base addresses, and accessing volatile registers via pointers to set mode to output and write data.
Develop a gpio output driver using a pre-defined ST header file that defines all registers, then test and flash the code to the board to toggle the gpio.
Learn to control gpio outputs on STM32F7 hardware using the bit set/reset register (bsrr) to set and reset pins, with precise bit positions for turning leds on and off.
Develop a gpio input driver by enabling port c clock, configuring pc13 as input, reading idr bit 13 to detect a push button, and driving leds accordingly.
Explore the UART protocol, comparing serial versus parallel and synchronous versus asynchronous transmission. Learn baud rate, start/stop bits, parity, word length, and duplex and flow control for UART setup.
Develop a uart transmitter driver by configuring alternate function mapping for USART3 on port d pin 8, enable APB1 clock, and modularize code using helper set/clear bit functions.
Develop the uart transmitter driver by enabling apb and gpio clocks, configuring pins to alternate function mode, and implementing a generic set-mode function using a modify-register pattern.
Develop the UART transmitter driver by configuring pin eight for alternate function using the high and low alternate function registers, and enable the USART3 clock on APB1.
Develop the UART transmitter driver by configuring parity, word length, and stop bits via USART CR1 and CR2, using a modify register function to clear and set bits.
Compute the UART baud rate divider from the system clock and peripheral clock, and the desired baud rate, enable the UART transmitter, and prepare to test with a real-time tool.
Test the uart transmitter driver by waiting for the transmit data register to become empty, then write to the tdr and enable the transmitter via the te bit in cr1.
Retarget printf to the UAT driver by reimplementing the put function and calling the write routine, then print Hello from SDM 32 F7 to the board.
Modularize uart tx driver by creating separate source and header files, exposing prototypes, and marking static helpers. Build and flash to test the module and prepare for the receive driver.
Copy the prior project, configure pd9 for af7, enable the port clock, and implement reading the received data register when data is available.
Test the UART RX driver by wiring LEDs to GPIO pins, initializing clocks and pin modes, and using a switch on received characters to control individual LEDs.
Discover how analog to digital converters translate sensor signals into digital numbers, with resolution and step size defined by ADC bit depth and a reference voltage.
Explore ADC independent modes in STM32F7: single channel single conversion, multi-channel single conversion, single channel continuous, multi-channel continuous, and injected continuous conversion, with 16 channels and configurable sampling times.
Develop an adc driver by locating the adc bus, selecting adc1, and configuring pins and the adc module for continuous or single conversion; start and read data after conversion.
Implement the ADC init function by enabling the clock, selecting continuous mode, and configuring the conversion sequence and channels; enable, start, wait for end-of-conversion, and read data.
Develop a single conversion ADC driver for STM32 in bare-metal, adding a start conversion function and integrating it into the main loop to trigger and restart conversions as needed.
Explore the Cortex-M SysTick timer, a 24-bit down counter driven by the system clock, with the reload and current value registers to generate precise ticks and RTOS time bases.
Develop a systick driver for precise millisecond delays on cortex-m7 by configuring and enabling systick timer, using a 16 megahertz clock and a loop until the count flag is set.
Explore how general-purpose timers on STM32 M7 enable time bases, input capture, and output compare through auto-reload and prescaler settings.
Develop a general purpose timer (GPTM) driver for STM32F7, enabling APB clock, configuring prescaler and auto-reload, enabling timer 1, and polling the status flag for timeouts.
Compare polling and interrupt modes; learn how interrupts trigger an isr, managed by the cortex-m7 nvic, with a vector table, external lines, and configurable priority levels.
Develop a gpio interrupt driver for the stm32f7 push button by configuring pc13 as input, mapping exti13 to port c, unmasking exti13, selecting a falling edge trigger, and enabling nvic.
Demonstrates testing a gpio interrupt driver by wiring the interrupt service routine to the vector table, clearing pending bits, and toggling leds on button presses.
Develop a timer interrupt driver for arm cortex-m7 stm32f7 by enabling the timer and nvic, forcing update generation, and handling the update flag in the isr without a busy loop.
Develop the systick interrupt driver by enabling the systick interrupt and implementing a systick handler that prints every second using a 16,000 preload value.
Develop the ADC interrupt driver for STM32F7 bare-metal programming by enabling end-of-conversion interrupts, implementing the interrupt handler, and reading the ADC data register non-blocking.
Develop the uart transmitter interrupt driver by enabling the TXI interrupt and implementing the interrupt service routine. Write to the transmit data register when the transmit buffer is empty.
Develop a UART receiver interrupt driver by enabling RX interrupts, handling the ISR to store incoming data in a global variable, and using a foreground loop to process data.
Learn the I2C two-wire protocol, including master and slave roles, start and stop conditions, address and data frames with MSB first, and clock speeds from standard to high speed.
Configure the I2C slave on stm32f7: select pb10/pb11 as open-drain alternate function pins with pull-ups, set a seven-bit address, enable clocks and interrupts, and set the address register.
Configure the I2C master by enabling clocks to I2C1, setting pins to alternate function open-drain with pull-ups, and establishing the I2C timing value from the board clock for master operation.
Configure I2C master on a Cortex-M7 STM32F7, set slave address and addressing mode, prepare tx/rx buffers, and manage start, transfer size, and stop flags.
Implement the I2C slave interrupt handler, check the address match, clear the flag via ICR, enable receiver interrupts, and manage slave reception and transmission complete callbacks.
Learn the serial peripheral interface (spi) basics: master and multiple slaves, mosi and miso lines, sck clock, and slave select; explore clock polarity, phase, and four modes.
Develop an SPI driver and implement the SPI master configuration to enable master-slave communication on STM32F7 boards, including pin setup, alternate function mapping, and clock configuration.
Configure the spi three module as a slave, setting its pins, clock, speed, and misalign settings. Implement activation functions to enable spi one and spi three.
Test the SPI driver by configuring SPI1 as master and SPI3 as slave, using interrupt-driven transmit and receive buffers to exchange data between two boards, a 'hello from SPI' demo.
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 STM32F7-NUCLEO which has an ARM Cortex-M7 microcontroller.
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 lose.