EmbeddedExpertIO
Need Help? Contact us at:
support@embeddedexpert.io

Bare-Metal C/C++ Learning Path

3 courses | 47+ hours | Complete Source Code Included

         Your free gift is on its way to your inbox, but before you go 
check out this very special offer, just for you!

1. Modern Bare-Metal Embedded-C From Ground Up (STM32F4) :Old and               New Editions

        No Libraries used, Professional CMSIS Standard, ARM Cortex, ADC,UART,TIMERS, DMA,SPI,I2C,RTC,GPIO etc.
        25+ hours of quality training | Complete source code included
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 STM32F4-NUCLEO which has an ARM Cortex-M4 microcontoller.

By the end of this course you will be able configure microcontroller peripherals like ADC, UART,PWM, GPIO, TIMER,I2C, SPI, etc. You will also master the ARM architecture and how to build professional embedded firmware for ARM processors.

Please take a look at the full course curriculum.
I personally guarantee that by the end of this  course you will be able to accomplish the following
  • Master how to read datasheets of Microcontrollers
  • Understand the Cortex-M Architecture
  • Write bare-metal Analog-to-Digital Converter (ADC) drivers 
  • Write bare-metal Pulse Width Modulation ( PWM )drivers 
  • Write bare-metal Universal Asynchronous Receiver\Transmitter (UART) drivers 
  • Write bare-metal General Purpose Timer (GPTM) drivers 
  • Write bare-metal Interrupt drivers 
  • Write bare-metal Serial Peripheral Interface ( SPI) drivers 
  • Write bare-metal Inter-Integrated Circuit (I2C) drivers 
  • Write bare-metal DMA drivers  
  • Master the ARM-Cortex CMSIS standard
  • Introduction
  • ​Downloading the required documentation
  • ​Getting Started
  • ​Downloading CubeIDE
  • ​Installing Packages
  • ​Overview
  • Getting the right STM32 Package
  • ​General Purpose Input/Output Driver Development
  • ​​Overview of ARM Cortex-M General Purpose Input/Output Module
  • ​Coding : Developing a GPIO Output Driver
  • ​Coding : Developing a GPIO Input Driver
  • ​Universal Asynchronous-Synchronous Receiver-Transmitter (USART)
  • ​Overview of the UART Protocol
  • ​Coding : Developing a UART Transmitter
  • ​Coding : Developing a UART Receiver
  • Coding : Retargeting printf
  • ​General Purpose Timer Driver Development
  • ​Understanding the System Tick (SysTick) Timer
  • ​Coding : Configuring Systick
  • ​Understanding STM32 Timers
  • ​Coding : Creating timer delays
  • ​Coding : Timer output compare
  • ​Coding : Timer Input Capture
  • ​Analog-to-Digital Converters Driver Development
  • ​Understanding ADC Independents Modes
  • ​Coding : ADC basic driver
  • ​Coding : Transmitting ADC values through the UART
  • Interrupt Programming
  • ​Understanding Interrupts
  • ​Coding  : Developing the GPIO Interrupt Driver
  • ​Coding  : Testing the GPIO Interrupt Driver
  • ​Coding : Developing the UART Receiver Interrupt Driver
  • ​Coding : Developing the ADC Interrupt Driver
  • ​Coding : Developing the Systick Interrupt Driver
  • ​Coding : Developing the Timer Interrupt Driver
  • ​Direct Memory Access (DMA) Driver Development
  • ​Coding : Overview of the Direct Memory Access (DMA) Module
  • ​Coding : Developing the UART Transmitter DMA Driver Pt.1
  • ​Coding : Developing the UART Transmitter DMA Driver Pt.2
  • ​Coding : Testing the UART Transmitter DMA Driver
  • ​Inter-Integrated Circuit (I2C)
  • ​Introduction to I2C
  • ​Coding : Implementing the I2C Init function
  • ​Coding : Implementing the I2C Byte Read function
  • ​Coding : Implementing the I2C Burst Read function
  • ​Coding : Implementing the I2C Burst Write function
  • ​Coding : Configuring the ADXL345 Accelerometer using the I2C driver
  • ​Coding : Testing the ADXL345 Accelerometer using the I2C driver
  • ​Serial Peripheral Interface (SPI)
  • ​Introduction to Serial Peripheral Interface (SPI)
  • ​Coding : Implementing the SPI GPIO Initialization function
  • ​Coding : Configuring the SPI Parameters
  • ​Coding : Implementing the SPI Transmit
  • ​Coding : Implementing the SPI Receive
  • ​Coding : Configuring the ADXL345 Accelerometer using the SPI Driver
  • ​Coding : Testing our ADXL345 Driver

2.  Modern Bare-Metal Embedded-C++ From Ground Up 

         No Libraries used, Embedded C++, ARM Cortex, ADC,UART,TIMERS, GPIO,SPI,I2C, Template Programming etc.

        16+ hours of quality training | Complete source code included
This is a practical programming course on embedded systems programming using the C++ programming language. Key features of C++ such as template programming and object-oriented programming can greatly improve embedded software portability, in recent years this has made C++ very attractive to embedded developers.

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.

By the end of this course you will be able write drivers for peripherals like ADC, UART, PWM, GPIO, TIMER,I2C, SPI, etc. You will also master the ARM architecture and how to build professional embedded firmware for ARM processors.

Furthermore, you will master C++ key features like Object-Oriented methods, Template Programming, and optimization.
I personally guarantee that by the end of this  course you will be able to accomplish the following
  • Write Class Templates for accessing Microcontroller Registers
  • ​Write Object-Oriented Peripheral Drivers
  • ​Master Object-Oriented Techniques for Microcontrollers
  • ​Master C++ Templates for Microcontrollers
  • ​Master how to read Datasheets of Microcontrollers
  • ​Write Universal Asynchronous Receiver-Transmitter (UART) drivers using bare-metal Embedded-C++
  • ​Write Analog-to-Digital Converter (ADC) drivers using bare-metal Embedded-C++
  • ​Write General Purpose Timer (GPTM) drivers using bare-metal Embedded-C++
  • ​Write System Tick (SysTick) Timer drivers using bare-metal Embedded-C++
  • ​Write Pulse Width Modulation (PWM) drivers using bare-metal Embedded-C++
  • ​Write Serial Peripheral Interface (SPI) drivers using bare-metal Embedded-C++
  • ​Write Inter-Integrated Circuit (I2C) drivers using bare-metal Embedded-C++
My  courses have been reviewed by 1000+ students
Here are some of the reviews
  • Getting Started with Embedded C++
  • ​Creating a simple LED Class (PART I)
  • ​Creating a simple LED Class (PART II)
  • ​C++ Essential Training for C Developers
  • ​Configuring our UART driver for displaying results (Part I)
  • ​Configuring our UART driver for displaying results (Part II)
  • ​Understanding Classes and Objects
  • ​Dynamic Allocation
  • ​Variable References
  • ​Understanding Function Templates
  • ​Using Default Arguments
  • ​Understanding Pass by Reference and Pass by Value
  • ​Understanding Pass by Address
  • ​Return by Address
  • ​Class Property Functions
  • ​Class Constructors
  • ​Understanding Scope Resolution
  • ​Understanding "this" Pointer
  • ​Differences between Class and Struct
  • ​The function "friend"
  • ​Class Inheritance
  • ​Understanding Access Specifiers
  • ​Class Pointers
  • ​Function Overriding
  • ​Virtual Functions
  • ​Polymorphism (Part I)
  • ​Polymorphism (Part II)
  • ​The class "friend"
  • ​Static Variables
  • ​Static Functions
  • ​Class Template
  • ​Understanding namespaces
  • ​Class destructors
  • ​Class virtual destructors
  • ​Microcontroller C++ Template Programming
  • ​​Introduction to Microcontroller Template Programming
  • ​Developing a Template for accessing Microcontroller Registers (Version 1)
  • ​Developing a Template for accessing Microcontroller Registers (Version 2)
  • ​​Register Bit-mapping (Part I)
  • ​​Register Bit-mapping (Part II)
  • ​​Applying Register Bit-mapping to Register Access Class Template
  • ​​Developing a Microcontroller Port Class Template

  • ​General Purpose Input/Output(GPIO) C++ Driver Development
  • ​Overview of ARM Cortex-M General Purpose Input/Output Module
  • ​Developing a GPIO Output Driver using information from the datasheet
  • ​Developing a GPIO Output Driver using the BSRR Register
  • ​Developing a GPIO Input Driver
  • ​Universal Asynchronous Receiver-Transmitter(UART) C++ Driver Development
  • ​Overview of the UART Protocol
  • ​Developing the UART Driver Using Information from the datasheet
  • ​Receiving Data with the UART
  • ​Two-way UART Communication
  • ​UART std::cout Retargeting
  • ​System Tick and General Purpose Timers C++ Driver Development
  • ​Overview of the System Tick Timer
  • ​Overview of General Purpose Timers
  • ​Developing the System Tick Timer Driver using information from the datasheet
  • ​Creating a Delay Function using the System Tick Timer
  • ​Analyzing General Purpose Timer registers
  • ​Developing the General Purpose Timer driver
  • ​Writing a driver for a different timer module
  • ​Developing the Timer Compare Mode Driver
  • ​Analog -to- Digital Converter (ADC) Driver Development
  • ​Introduction to Analog to Digital Conversion
  • ​Developing the ADC Driver
  • ​Inter-Integrated Circuit (I2C)
  • ​Introduction to I2C
  • ​Analyzing the DS1307 Realtime Clock
  • ​Creating I2C Registers
  • ​Writing the I2C Initialization function
  • ​Writing the I2C Read and Write Functions
  • ​Testing our I2C Driver
  • ​Serial Peripheral Interface (SPI)
  • ​Introduction to SPI
  • ​Creating SPI Registers
  • ​Writing a basic SPI Driver
  • ​Developing an SPI Library (PART I)
  • ​Developing an SPI Library (PART II)
  • ​Testing the SPI Library

3.  Embedded Systems Object-Oriented Programming in C 

        End-to-End Firmware and Driver Development: UART,GPIO,TIMER, etc. From Datasheet to Embedded C 

        12+ hours of quality training | Complete source code included
This course is for anyone seeking to improve their embedded firmware development skills. This course focuses on how to apply object-oriented principles to embedded firmware development.

By the end of this course you will be able to write Objected-Oriented Embedded-C Applications as well as Objected-Oriented Embedded-C++ Applications.
I personally guarantee that by the end of this  course you will be able to accomplish the following
  • Apply Objected-Oriented Principles to Firmware development
  • Write Objected-Oriented Embedded-C Applications
  • Write Objected-Oriented Embedded-C++ Applications
  • Write Embedded Systems Drivers and Libraries using Objected Oriented C and C++
  • Write firmware by applying Object-Oriented principles like Polymorphism, Inheritance and Encapsulation in C and C++
  • Write embedded drivers from scratch in C++ using information from the datasheet. E.g. GPIO drivers, TIMERS drivers, UART drivers etc.
  • Write embedded drivers from scratch in object-oriented C using information from the datasheet. E.g. GPIO drivers, TIMERS drivers, UART drivers etc.
  •  Setting Up Keil uVision 5
  • ​Download Keil uVision 5
  • ​Installing Keil uVision 5
  • ​Installing Packs
  • ​Changing the Compiler
  • ​Object-Oriented Firmware Programming
  • ​Coding : Developing a UART Driver for monitoring results
  • ​Coding : Creating an LED class in Object-Oriented C (Part I)
  • ​Coding : Creating an LED class in Object-Oriented C (Part II)
  • Coding : Creating an LED class in C++
  • ​Implementing Inheritance in Embedded-C and C++
  • ​​Coding : Inheriting a Class in Object-Oriented C (Part 1)
  • ​Coding : Inheriting a Class in Object-Oriented C (Part 2)
  • ​Coding : Inheriting a Class in Object-Oriented C (Part 3)
  • Coding : Implementing Inheritance in C++
  • ​More General Purpose Input/Output (GPIO) Features (Optional)
  • ​Coding : Extending the GPIO Library for handling Alternate Functions
  • ​Developing an Object -Oriented GPIO Driver and Library in C++ From Scratch
  • ​Coding : Developing our General Purpose Input / Output Library in C++
  • ​Developing an Object -Oriented UART Library in C++ From Scratch
  • ​Coding : Developing the UART Library in C++
  • ​Developing an Object -Oriented GPIO Driver and Library in C From Scratch
  • ​Coding : Implementing a Structure to hold Registers
  • Coding : Implementing the RCC Registers Structure
  • ​Coding : Testing the Driver
  • ​Coding : Adding all GPIO Ports to the Driver
  • ​Coding : Creating the Interface and Implementation  files
  • ​Coding : Implementing the Library
  • ​Coding : Implementing the Library Functions
  • ​Coding : Testing the Library
  • ​Implementing Polymorphism in Embedded-C and C++
  • ​Coding : Another class to our firmware in C
  • ​Coding : Implementing Polymorphism in C (Part I )
  • ​Coding : Implementing Polymorphism in C (Part II )
  • ​Developing an Object -Oriented UART Driver and Library in C From Scratch
  • ​Coding : Implementing the UART Registers Structure
  • ​Coding : Developing the UART Driver
  • ​Coding : Developing the UART Library (PART I)
  • ​Coding : Developing the UART Library (PART II)
  • ​Coding : Testing the UART Library
  • ​Developing an Object -Oriented SysTick Timer Library in C From Scratch
  • ​Coding : Implementing the SysTick Registers Structure
  • ​Coding : Implementing the SysTick Library C
  • ​Coding : Implementing the SysTick Library C++
NOT UNDERSTANDING THE CODE


Sometimes I could get my firmware to work but I couldn’t understand a large portion of the code.

I didn’t know what some of the registers were doing. "Why do we write this hexadecimal number into that particular register ?" I would often ask.
CODE NOT WORKING - WASTED TIME

Other times I could understand every line of code in the firmware but couldn’t get the firmware to work.
CANNOT BUILD ANYTHING NEW -LACK OF CONFIDENCE, IMPOSTER

Because I wasn’t good enough, I couldn’t build exactly what I wanted if there were no already made drivers and libraries out there that I could use. Worst of all I couldn’t even get another microcontroller to work apart from the microcontroller used in class.
Long story short, I overcame all of this....
I devised a plan to master the fundamentals...
Quickly read the sections of interest in the datasheet...
Created my own firmware development checklist...
Created my own study guide...

I started creating courses to help other people like yourself master embedded systems development in the most efficient way possible, no waste of time, no frustrations. There is no need for you to go through the same roadblocks and frustrations I went through  some years ago.
 30 Day Money Back Guarantee
Our  courses have been reviewed by 1000+ students
Here are some of the reviews

Now it's time for you also to benefit from the...

Modern Embedded-C 
From Ground Up

Here's a recap of

EVERYTHING You'll Get

When You Purchase This AMAZING Offer!

  • 1. Modern Bare-Metal Embedded-C From Ground Up (STM32F4)  ($49.99 Value)
  • ​2. Modern Bare-Metal Embedded-C++ From Ground Up ($59.99 Value)
  • 3. Embedded Systems Object-Oriented Programming in C  ($49.99 Value)
Total Value: $159.97
But today, you're getting all of this...
For Only $89.78

 30 Day Money Back Guarantee

Remember, I have no doubt you will love the training but should in case you are not completely satisfied you can request a refund within 30 days of purchase and you shall be fully refunded with no questions asked.

Sounds fair ? 
I know there are some websites out there that offer you something cool for a low price, but then stick you into some program that charges your card every month.
This isn't one of them. There's NO hidden cost.

Thanks for taking the time to read this letter and I hope you enjoy the training!

-Israel N Gbati