We may earn an affiliate commission when you visit our partners.
Israel Gbati

Are you tired of Copying and Pasting code you don't understand?

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.

So with that understood, let me tell you…

                                                                                     Exactly What You’re Getting

Read more

Are you tired of Copying and Pasting code you don't understand?

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.

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 :

  "So far this class has been awesome. I'm a C programmer that's been using Python a lot lately so this class helps to make my C code look a little more object oriented and class based. Also, he goes through how to transform some C code into C++ code which is pretty great"

Here is what another student had to say :

    "Absolutely it was a good match for me because I am new to the OOP in Embedded system and I have now gained good Understanding of C++ and OOP for Microcontrollers. Very detailed and nicely designed course I will regularly check for the new update. I think it is the best course about OOP on Embedded system."

If at least one of the following applies to you then keep reading if not then simply skip this course:

" Escape From "

  1. Copying/Pasting code you don’t understand

  2. Using third party libraries and header files like HAL, LL and StdPeriph

  3. Experiencing bugs you don’t understand

  4. Being afraid of technical documentations like the reference manual and datasheet of the chip

  5. Imposter syndrome

" Arrive At "

  1. Building every single line of code from scratch by writing to the microcontroller’s memory space directly.

  2. Using No third party libraries or header files

  3. Understanding and writing every single line of code yourself- no Copy/Paste

  4. Using the debugger effectively to analyze and resolve any bugs

  5. 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 Object-Oriented Concepts

Like:

  • Polymorphism

  • Inheritance

  • Encapsulation

                                                           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.

Enroll now

What's inside

Learning objectives

  • 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.
  • Build every single line of code from scratch by writing to the microcontroller’s memory space directly.
  • Use no third party libraries or header files
  • Understand and write every single line of code yourself- no copy/paste
  • Use the debugger effectively to analyze and resolve any bugs
  • Develop proficiency in your embedded development skills and confidently take the next steps
  • Define addresses for the different peripherals
  • Analyze the chip documentation
  • Create registers from the addresses
  • Show more
  • Show less

Syllabus

Introduction
Downloading Keil uVision
Installing Keil uVision 5
Installing Packs
Read more
Overview of Keil uVision 5
Changing the Compiler
Object-Oriented Firmware Programming
Coding : Developing a UART Driver for monitoring results
Source Code Download
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++
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
Notice
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 )
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 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 UART Library in C++ From Scratch
Coding : Developing the UART Library in C++
Developing an Object -Oriented SysTick Timer Library in C From Scratch
Coding : Implementing the SysTick Registers Structure
Coding : Testing the SysTick Driver
Coding : Implementing the SysTick Library C
Coding : Implementing the SysTick Library C++
Setting Up Option 2 - STM32CubeIDE
Download CubeIDE
Setting Up STM32CubeIDE
Installing Packages
Overview
Coding : Writing a GPIO Driver from Scratch (PART I)
Coding : Writing a GPIO Driver from Scratch (PART II)
Closing
Closing Remarks

Good to know

Know what's good
, what to watch for
, and possible dealbreakers
Focuses on writing drivers from scratch, which is valuable for engineers seeking a deeper understanding of hardware interactions
Teaches object-oriented programming in C and C++, which are industry-standard languages for embedded systems development
Covers the Cortex Microcontroller Interface Standard (CMSIS), which is widely used in professional firmware development
Uses Keil uVision 5, an IDE that is commonly used in embedded systems development, but learners should be aware of newer IDEs
Emphasizes writing code without third-party libraries, which may not reflect common industry practices that often rely on HAL and other libraries
Requires familiarity with reading chip documentation, which may be challenging for beginners without prior experience in hardware design

Save this course

Save Embedded Systems Object-Oriented Programming in C to your list so you can find it easily later:
Save

Activities

Be better prepared before your course. Deepen your understanding during and after it. Supplement your coursework and achieve mastery of the topics covered in Embedded Systems Object-Oriented Programming in C with these activities:
Review C/C++ Fundamentals
Solidify your understanding of C/C++ syntax, memory management, and object-oriented principles. This will provide a strong foundation for the course's embedded systems applications.
Browse courses on C++
Show steps
  • Review basic syntax and data types.
  • Practice pointer arithmetic and memory allocation.
  • Work through object-oriented programming examples.
Understand Embedded Systems Architecture
Gain a solid understanding of embedded systems architecture. This will help you make informed design decisions and optimize your code for performance.
Show steps
  • Read chapters on processor architecture and memory management.
  • Research the architecture of your target microcontroller.
Review 'Effective C++'
Gain a deeper understanding of effective C++ programming practices. This will improve the quality and maintainability of your embedded systems code.
Show steps
  • Read and summarize key chapters related to object design.
  • Implement examples from the book in a small project.
Four other activities
Expand to see all activities and additional details
Show all seven activities
Document Your Learning Journey
Create a blog or journal to document your learning process and share your insights. This will help you solidify your understanding and connect with other learners.
Show steps
  • Create a blog or online journal.
  • Write regular entries about your progress and challenges.
  • Share your blog with other students and seek feedback.
Implement Object-Oriented Design Patterns
Apply object-oriented design patterns to common embedded systems problems. This will improve your ability to create modular, reusable, and maintainable code.
Show steps
  • Study common design patterns like Singleton, Factory, and Observer.
  • Implement these patterns in a simulated embedded environment.
  • Refactor existing code to incorporate design patterns.
Develop a Simple RTOS Task Scheduler
Build a basic real-time operating system (RTOS) task scheduler from scratch. This will deepen your understanding of embedded systems concepts and object-oriented programming.
Show steps
  • Design the task scheduler architecture using object-oriented principles.
  • Implement task creation, deletion, and scheduling functions.
  • Test the scheduler with multiple tasks and priorities.
Contribute to an Embedded Systems Project
Contribute to an open-source embedded systems project. This will give you practical experience working with real-world code and collaborating with other developers.
Show steps
  • Find an open-source embedded systems project on GitHub.
  • Identify a bug or feature to work on.
  • Submit a pull request with your changes.

Career center

Learners who complete Embedded Systems Object-Oriented Programming in C will develop knowledge and skills that may be useful to these careers:
Microcontroller Programmer
A Microcontroller Programmer specializes in writing software for microcontrollers, using languages such as C and C++. This course is a perfect fit, directly addressing the core skills required for this role. The course's focus on object-oriented programming in C and C++, writing drivers from scratch, and avoiding third-party libraries directly applies to the day-to-day activities of a microcontroller programmer. This course provides them with the experience of writing drivers for peripherals. The course also emphasizes the importance of debugging. This course helps a microcontroller programmer build a foundation in core microcontroller skills allowing them to confidently take the next steps in their careers.
Embedded Systems Engineer
An Embedded Systems Engineer designs, develops, and tests firmware for embedded systems, often working with microcontrollers and hardware interfaces. This course is particularly relevant, as it focuses on the application of object-oriented principles in embedded firmware development using C and C++, skills essential for creating robust and maintainable code in this field. The hands-on approach to writing drivers from scratch and analyzing chip documentation aligns perfectly with the practical demands of this role. Furthermore, the course emphasizes writing to the microcontroller's memory space directly and using no third-party libraries. This course helps engineers build a foundation in core embedded systems skills, allowing them to confidently take the next steps in their careers.
Firmware Developer
A Firmware Developer writes the low-level code that controls embedded systems, working closely with hardware and often using C or C++. This course is a great fit, providing instruction in applying object-oriented principles to firmware development in both languages. The emphasis on creating drivers from scratch and understanding chip documentation is highly relevant. The course's focus on avoiding copy-pasted code is important as a firmware developer takes ownership of their code. The understanding of the Cortex Microcontroller Interface Standard (CMSIS) also adds real world experience. The course helps a firmware developer build a foundation in core embedded systems knowledge, allowing them to confidently take the next steps in their careers.
Aerospace Software Engineer
An Aerospace Software Engineer develops software for aircraft and spacecraft, often working with embedded systems. This course is highly relevant due to its focus on object-oriented programming in C and C++, crucial for developing complex robust aerospace systems. The course's emphasis on low-level driver development and direct register access aligns well with the rigorous requirements of aerospace software. The course’s deep dives into chip documentation, understanding memory maps, and writing code from scratch will be important for an aerospace software engineer. This course helps an aerospace software engineer build a foundation in core embedded systems skills, allowing them to confidently take the next steps in their careers.
Automotive Embedded Software Engineer
An Automotive Embedded Software Engineer develops the software that controls various functions within a vehicle. This course is highly relevant due to its focus on object-oriented programming in embedded C and C++, crucial for developing complex automotive systems. The course's emphasis on low-level driver development and direct register access aligns well with the safety and performance critical requirements of automotive software. This course also helps them understand how to read the microcontrollers datasheet, a necessary skill in the automotive industry. This course helps an automotive embedded software engineer build a foundation in core embedded systems skills, allowing them to confidently take the next steps in their careers.
Medical Device Software Engineer
A Medical Device Software Engineer develops software for medical devices, often working with embedded systems critical to life support or patient monitoring. This course is a great fit, providing training in object-oriented programming in C and C++, essential for developing reliable and maintainable medical device software. The course’s low-level programming focus also aligns with the need to directly interface with hardware components. The course also emphasizes testing and debugging which are important in the medical industry. This course will help a medical device software engineer build a foundation in core embedded systems skills, allowing them to confidently take the next steps in their career.
Internet of Things Engineer
An Internet of Things Engineer designs and develops connected devices which often use embedded systems. This course is a great fit as it teaches firmware development for embedded devices, including the microcontrollers that power the base of IoT technology. This course emphasizes writing drivers from scratch which is critical for customizing IoT devices. The course also focuses on the use of object-oriented programming using C and C++, which are common languages for IoT devices. This course helps an internet of things engineer build a foundation in core embedded systems skills allowing them to confidently take the next steps in their career.
Robotics Engineer
A Robotics Engineer develops and maintains robotic systems, often requiring knowledge in both hardware and software. This course provides the software skills in object-oriented design, especially in C and C++, that control the embedded systems within robots. The course focuses on writing drivers from scratch, which is essential for customizing robot functionality. The course also provides crucial knowledge of embedded programming that is needed to program low level robotics systems. The emphasis on debugging and resolving issues will be relevant as the code integrates with mechanical and electrical components. This course helps a robotics engineer build a foundation in core embedded systems knowledge, allowing them to confidently take the next steps in their careers.
Control Systems Engineer
A Control Systems Engineer designs and develops control systems for various applications. While not always the primary focus, embedded systems are frequently used in control systems, making this course beneficial. The course introduces low level control of embedded systems, including how to write drivers for various peripherals. An understanding of object-oriented programming in C and C++ also helps these engineers create maintainable and well-organized code. This course may be helpful to a control systems engineer, and will help them understand the low level components they will use.
Hardware Engineer
A Hardware Engineer designs and develops physical hardware components and systems and often works closely with firmware developers. While not directly focused on hardware design, this course provides a crucial understanding of the low-level software that interacts with hardware. The course's focus on analyzing chip documentation and defining peripheral addresses is exceptionally useful to a hardware engineer who needs to understand microcontrollers at the register level. Furthermore, understanding the concepts of object-oriented design will enhance collaboration between hardware and firmware teams. This course may be helpful to a hardware engineer as it provides awareness of the software side of embedded systems.
Industrial Automation Engineer
An Industrial Automation Engineer designs and implements automated systems for manufacturing and industrial processes. This course is relevant as it provides a background in embedded systems, which are widely used in industrial automation. The course's emphasis on writing drivers from scratch is helpful as many industrial systems use custom devices. The course also provides fundamental knowledge of reading a chip's datasheet. This course may be helpful to an industrial automation engineer as it gives them background in the technology used in their field.
Research Scientist
A Research Scientist conducts research in various fields, often requiring custom hardware and software solutions. The course is a good fit if a researcher is working on hardware such as sensors or prototypes that need embedded software to function. The course teaches the principles of object-oriented design, which can help improve the organization and maintainability of a research project. The skills learned in this course may be helpful to a research scientist who is working on hardware that requires embedded systems software.
Test Engineer
A Test Engineer designs and executes tests to ensure the quality of software, hardware, or systems. This course is relevant as it provides an understanding of the process of developing drivers and other low level embedded software. They can apply the debugging techniques that they learn in this course to test embedded systems. It is helpful for them to see from the perspective of an embedded system developer. This course may be helpful to a Test Engineer and provides insight into the process of embedded software development.
Systems Analyst
A Systems Analyst analyzes and designs computer systems and works closely with developers. While this course is deeply technical in nature, it may be helpful for a systems analyst to be aware of the challenges of low level programming. This course will provide context about the development of embedded systems. A systems analyst who has worked through the lessons of this course may better understand the challenges of firmware development. This course may be helpful but is not directly related to the role of a systems analyst.
Software Architect
A Software Architect designs the overall structure and components of software systems. While this course is focused on embedded systems and low-level programming, it is useful for a software architect to have knowledge of how the software interacts with the hardware. The software architect may better design the architecture for their system by understanding the complexity of low level embedded development. This course may be helpful to a software architect who wants to learn about the challenges of developing low level systems.

Reading list

We've selected two books that we think will supplement your learning. Use these to develop background knowledge, enrich your coursework, and gain a deeper understanding of the topics covered in Embedded Systems Object-Oriented Programming in C.
Provides a comprehensive overview of embedded systems architecture. It covers topics such as processor selection, memory organization, and peripheral interfaces. Reading this book will give you a better understanding of the hardware aspects of embedded systems. It useful reference for understanding the underlying architecture.

Share

Help others find this course page by sharing it with your friends and followers:

Similar courses

Similar courses are unavailable at this time. Please try again later.
Our mission

OpenCourser helps millions of learners each year. People visit us to learn workspace skills, ace their exams, and nurture their curiosity.

Our extensive catalog contains over 50,000 courses and twice as many books. Browse by search, by topic, or even by career interests. We'll match you to the right resources quickly.

Find this site helpful? Tell a friend about us.

Affiliate disclosure

We're supported by our community of learners. When you purchase or subscribe to courses and programs or purchase books, we may earn a commission from our partners.

Your purchases help us maintain our catalog and keep our servers humming without ads.

Thank you for supporting OpenCourser.

© 2016 - 2025 OpenCourser