
Download stm32cubeide for stm32f3 bare-metal development by creating a free ST account, accepting the license, and logging in to start the download, available for Windows, Linux, and Mac.
Install the integrated development environment by extracting the package, running the installer, and choosing a drive with more space. Launch the ide, permit firewall access, and decide on usage statistics.
Acquire essential STM32F3 documentation—datasheet, reference manual, programming manual, and user guide for the SDM32F3 board—and prepare to begin bare-metal peripheral driver coding.
Configure a stm32f3 bare-metal project using the nuclear board, identify port a pin 5 led, and learn how clock gating on apb and ahp buses enables the peripheral before use.
Derive peripheral base addresses from the memory map, enable clocks via the racc (reset and clock control) module, and compute gpio register addresses using offsets.
Learn to create and configure registers from documentation, enable the RACC clock by setting bit 17, and set pin 5 as an output using the mode and output data registers.
Configure stm32f3 pins with created registers, enable clock, set output via mode register, and update output data register. Use toggle operator to blink an LED, preserving other bits.
Learn to model a microcontroller peripheral with a structure whose members represent registers. Access registers by typecasting the base address to this structure and using arrows to set specific bits.
Explore how microcontroller pins group into ports and become general-purpose inputs/outputs or alternate functions for peripherals such as UART and ADC, via GPA registers and hp/apb buses and clock options.
Create a gpio output driver for stm32 f3 using vendor header files to access registers directly, after downloading the f3 package and configuring include paths.
Develop a gpio input driver by enabling port c clock, configuring pc13 as input, and reading idr bit 13 to turn the lcd off when pressed and on when released.
Explore the UART protocol and serial versus parallel communication. Understand asynchronous and synchronous modes, baud rate, start and stop bits, parity, word length, flow control, and duplex options.
Develop a UART transmitter driver for the STM32F3. Enable the USART on APB1, configure PA pins to AF7, compute baud rate, and enable transmitter with proper control register settings.
Test the UART transmitter driver by writing data, waiting for the transmit data register empty flag in the status register, then transmit characters.
Retarget printf to the STM32F3 Ottati driver by implementing __io_putchar and wiring it to the UART write function, then use printf to display Hello from STM32F3 on the board.
Learn to modularize a STM32F3 bare-metal UART TX driver by refactoring into separate source and header files, exposing prototypes, updating includes, building, and flashing to the board.
Develop and initialize a UART RX driver for STM32F3 by enabling the GPIO clock, configuring pin 3 to alternate function mode, selecting AF7 for USART3, and enabling the receiver.
Master the UART rx driver by reading the receive data register only when not empty, using the read data register not empty flag to return the read data.
Explore the analog to digital converter, a data acquisition device, and how transducers convert physical quantities to voltage or current. Understand how ADC resolution and reference voltage set step size.
Explore adc independent modes on the STM32F3, including single and multi-channel options. Understand single channel and multi-channel conversions, continuous modes, injected conversion, 16 channels, and configurable sampling times.
Develop a bare-metal adc driver for stm32f3 by selecting adc modules, enabling access, configuring analog mode, and implementing init, activate, and read functions.
Enable adc clock and set analog mode for reliable conversions. Configure adc common parameters, trigger source, conversion mode, and sequence using the adc registers.
Develop and enable the STM32F3 ADC driver by configuring the internal voltage regulator and control register, then start conversions and read the data register for single and continuous modes.
Enable adc continuous conversion by setting the adc configuration register bits for continuous mode, then run the project on the board to observe continuous channel values.
simplify the ADC driver by reverting to direct register access, clearing bits 16 and 17 in the CCR to apply HCO divided by two, and using the default software trigger.
Explore the system tick timer, a 24-bit down counter in cortex microcontrollers used as the heartbeat of real-time systems, with reload and current value registers to compute delays.
Develop a precise delay function using the SysTick timer on a Cortex microcontroller, configuring the reload value, clock source, and enable bit, then wait for the current value flag.
Explore the overview of general purpose timers, including time base generation, input capture for measuring external frequency, and output compare with one powerless mode, plus auto reload and pre-schooler settings.
Develop a bare-metal general purpose timer driver by enabling the timer module on the APB bus, configuring the auto-reload value for a one-second interval, and polling the update interrupt flag.
Explore how interrupts switch the CPU from polling to event-driven service, implement interrupt service routines, understand vector table and NVIC, manage external interrupt lines, and configure priorities and states.
Develop a gpio interrupt driver for PC13 by enabling clock access, configuring PC13 as an input, unmasking irq line 13, setting falling-edge trigger, and enabling the nvic interrupt.
Test the input interrupt driver by implementing the exact interrupt handler named in the vector table, reading pending bit 13, and clearing the flag on a button press.
Develop a systick interrupt driver for stm32f3 by enabling the systick interrupt, loading eight million cycles for one second, and using a callback to print message and toggle an led.
Develop a timer interrupt driver for stm32f3 by enabling update interrupts, forcing update generation, and implementing a callback that executes code on each timer period, demonstrating a 1 Hz example.
Develop an adc interrupt driven driver for the atc module on stm32f3 bare-metal peripherals, enabling end-of-conversion interrupts, implementing an interrupt handler and adc data read with a callback and print.
Learn the spi protocol basics, including master-slave communication, mosi and miso lines, sclk and slave select, and single versus multiple slave configurations, with clock polarity and phase modes.
Develop a SPI driver to configure and read data from an accelerometer, handling gpio initialization, alternate function setup, pull-downs, and slave select on SPI1.
Configure the spi module by enabling its clock, setting baud rate to apb clock divided by four, enabling full duplex master mode with 8-bit data, and enabling software slave management.
Implement spi1 transmit and receive functions with a data register pointer, looping over the buffer and waiting for transmit buffer empty and receive buffer not empty, plus clearing overruns.
Learn to configure the ADXL345 accelerometer over SPI by using the memory map to set data format and power control, then read X, Y, Z data from the data registers.
Test the adxl345 accelerometer spi driver by enabling device, reading two data bytes, forming a 16-bit value, converting to g with 0.0078, and observing changes in live expressions while shaking.
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 STM32F33-NUCLEO which has an ARM Cortex-M4 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)
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.