We may earn an affiliate commission when you visit our partners.
Course image
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

Traffic lights

Read about what's good
what should give you pause
and possible dealbreakers
Focuses on writing firmware from scratch, which can be valuable for engineers seeking a deeper understanding of hardware interactions
Teaches object-oriented programming principles in C and C++, which are valuable skills for designing modular and maintainable embedded systems
Covers the Cortex Microcontroller Interface Standard (CMSIS), which is widely used in professional firmware development
Requires learners to download and install Keil uVision 5, which may require a license depending on the scale of development
Emphasizes writing code without third-party libraries, which may not reflect common industry practices that often rely on HAL, LL, and StdPeriph
Uses STM32 microcontrollers, so learners should ensure that these microcontrollers are relevant to their projects and learning goals

Save this course

Create your own learning path. Save this course to your list so you can find it easily later.
Save

Reviews summary

Embedded oop: from scratch in c/c++

According to learners, this course offers a deep dive into embedded systems programming, focusing on a 'from scratch' approach. Students appreciate learning to interact directly with hardware registers and analyze chip documentation, enabling them to understand exactly what their code does without relying on abstract third-party libraries like HAL. The application of object-oriented principles in C and C++ for embedded development is highlighted as a core strength, providing a solid foundation for building drivers and libraries. While the methodology is praised for building a profound understanding, some note that it requires significant effort and potentially prior experience, especially with C/C++.
Setup instructions provided for tools.
"Instructions for setting up Keil uVision and STM32CubeIDE are included, which is helpful."
"The course covers using industry-standard tools for embedded development."
Clear explanations of complex topics.
"The instructor explains complex topics like register interaction and OOP principles very clearly."
"His detailed explanations of *why* things are done this way are incredibly valuable."
"The lectures break down difficult concepts into understandable steps."
"Patient and thorough explanations throughout the course modules."
Hands-on labs for building drivers.
"Developing drivers like GPIO and UART from scratch through hands-on coding is the strongest part for me."
"The practical coding exercises and projects solidify the theoretical concepts effectively."
"Building library functions step-by-step in the coding sessions was very helpful for learning."
"Watching the instructor write code and explain register interaction made it much clearer."
Effectively teaches OOP principles for firmware.
"The course effectively demonstrates how to apply OOP concepts like polymorphism and inheritance in a constrained embedded environment."
"Applying object-oriented principles to C and C++ for embedded systems is a unique and valuable skill taught here."
"It helped me transition my C code towards a more object-oriented and class-based structure."
"Learning OOP for microcontrollers was precisely what I needed, and this course delivered."
Builds deep understanding by avoiding libraries.
"Building every line from scratch by writing directly to memory space gives me a profound understanding."
"I learned how to interface with hardware by reading documentation and writing register-level code, not just using APIs."
"The focus on avoiding third-party libraries like HAL is excellent for truly understanding the hardware."
"This approach is challenging initially but provides a solid foundation you don't get elsewhere."
Demanding content, assumes C/C++ familiarity.
"This course is challenging and assumes a good understanding of C/C++ before starting."
"The low-level register manipulation requires significant concentration and effort to follow."
"It's not for absolute beginners; some prior embedded or low-level programming knowledge is beneficial."
"Might need to rewatch lectures multiple times to fully grasp the concepts."

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