We may earn an affiliate commission when you visit our partners.
Course image
Israel Gbati and BHM Engineering Academy

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

Read more

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  STM32F4-NUCLEO which has an ARM Cortex-M4 microcontoller.

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 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. "

                                                                               Taken by 8000+ 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 "

  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 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)

  • Direct Memory Access (DMA)

  • 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.

Enroll now

What's inside

Learning objectives

  • Write firmware using only bare-metal embedded-c
  • Understand the cortex-m architecture
  • Write analog-to-digital converter (adc) drivers using bare-metal embedded-c
  • Write pwm drivers using bare-metal embedded-c
  • Write uart drivers using bare-metal embedded-c
  • Write timer drivers using bare-metal embedded-c
  • Write interrupt drivers using bare-metal embedded-c
  • Write spi drivers using bare-metal embedded-c
  • Write i2c drivers using bare-metal embedded-c
  • Master the arm-cortex cmsis standard
  • Write dma drivers using bare-metal embedded-c
  • 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

Getting Started - Constructing Peripheral Registers from Memory Addresses
Downloading our Integrated Development Environment (IDE)
Installing our Integrated Development Environment (IDE)
Read more
Getting the right Documentation for Bare-Metal Development
Coding : Locating the Ports and Pins of Components on the Nucleo board
Coding : Defining Addresses of Modules using information from the Documentation
Coding : Creating required Registers using Information from Documentation
Coding : Configuring Pins using the Registers we Created
Coding : Creating Registers from Structure Members
Notice
General Purpose Input/Output(GPIO)
Overview of ARM Cortex-M General Purpose Input/Output Module
Coding : Developing the GPIO Output Driver
Coding : Controlling GPIO Outputs using the Bit Set/Reset Register (BSRR)
Coding : Developing the GPIO Input Driver
Universal Asynchronous Receiver-Transmitter(UART)
Overview of the UART Protocol
Coding : Developing the UART Transmitter Driver
Coding : Testing the UART Transmitter Driver
Coding : Retargeting printf
Coding : Making the Driver more Modular
Coding : Developing the UART Receiver Driver
Coding : Testing the UART Receiver Driver
Analog to Digital Conversion (ADC)
Introduction to Analog to Digital Conversion
Understanding ADC Independents Modes
Coding : Developing the ADC Single Conversion Driver
Coding : Developing the ADC Continuous Conversion Driver
The System Tick (SysTick) Timer
Overview of the System Tick Timer
Coding : Developing the System Tick Timer Driver
General Purpose Timers
Overview of General Purpose Timers
Commonly used Timer registers
Coding : Developing the General Purpose Timer Driver
Coding : Developing the Timer Output Compare Driver
Coding : Developing the Timer Input Capture Driver
Interrupt Programming
Introduction to 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
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
Start of Old Version of the Course - Introduction
Introduction
Set Up
Download Keil uVision 5
Installing Keil uVision 5
Installing Packs
Changing the Compiler
Coding : Developing GPIO Driver Using Information from the Datasheet
Understanding the BSRR Register
Coding : Controlling GPIO using the BSRR Register
Coding : Reading GPIO Inputs
Writing Bare-Metal C Code with STM32CubeIDE
Coding : Writing a GPIO Driver from Scratch (PART I)
Coding : Writing a GPIO Driver from Scratch (PART II)
Commonly used UART registers
Coding : Developing the UART Driver Using Information from the Datasheet
Further discussion on UART Alternate Function configuration
Coding : Receiving Data with the UART
Coding : Two-way UART Communication
System Tick and General Purpose Timers
Further discussion on System Tick Registers
Coding : Creating a Delay Function using the System Tick Timer
Coding : Developing the General Purpose Timer (GPTM) Driver

Good to know

Know what's good
, what to watch for
, and possible dealbreakers
Explores bare-metal firmware development, which is used in a wide range of industries
Taught by Israel Gbati and BHM Engineering Academy, who are recognized for their work in embedded systems
Develops professional skills in bare-metal firmware development for ARM-based microcontrollers
Builds a strong foundation for beginners in bare-metal firmware development
Uses the STMicroelectronics STM32F4-NUCLEO development board, which is widely used in industry
Requires students to have a basic understanding of C programming and embedded systems
Does not cover advanced topics in bare-metal firmware development, such as real-time operating systems

Save this course

Save Embedded Systems Bare-Metal Programming Ground Up™ (STM32) to your list so you can find it easily later:
Save

Reviews summary

Bare-metal programming for stm32

According to students, this course teaches Embedded Systems Bare-Metal Programming for STM32. Unfortunately, students struggle to get support from the instructor when they run into problems.
struggles to get support from instructor
"The course is decent but if you run into problems, as you can see from the Q&A, it's unlikely the instructor will be able to help or in most cases even bother to respond to you."

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 Bare-Metal Programming Ground Up™ (STM32) with these activities:
Review datasheet of target microcontroller
Familiarize yourself with the target microcontroller's architecture, peripheral registers, and memory map.
Show steps
  • Download the datasheet for the STM32F405 microcontroller from STMicroelectronics website or mobile App
  • Locate the sections in the datasheet that describe the microcontroller's architecture, peripheral registers, and memory map
  • Read and understand the information in these sections
Write a program to toggle an LED
Practice writing bare-metal code to configure and control peripherals, such as the GPIO.
Browse courses on GPIO
Show steps
  • Create a new project in your IDE and select the appropriate target microcontroller
  • Configure the GPIO pin as an output
  • Write a loop to toggle the GPIO pin on and off
  • Compile and run your code
  • Verify that the LED is blinking
Organize your notes, assignments, quizzes, and exams
Help you stay organized and easily review the material.
Show steps
  • Gather all of your notes, assignments, quizzes, and exams
  • Organize them into a logical order
  • Create a system for storing and retrieving them
Five other activities
Expand to see all activities and additional details
Show all eight activities
Follow a tutorial on using HAL libraries for STM32 microcontrollers
Explore the use of HAL libraries to simplify peripheral configuration and programming.
Show steps
  • Find a tutorial on using HAL libraries for STM32 microcontrollers
  • Follow the steps in the tutorial to configure a peripheral using the HAL library
  • Write a program to use the configured peripheral
  • Compile and run your code
  • Verify that the peripheral is working as expected
Read "Embedded Systems: A Contemporary Design Tool" by James Peckol
Gain a comprehensive understanding of embedded systems design and development.
Show steps
  • Purchase or borrow a copy of the book
  • Read the book cover-to-cover
  • Take notes and highlight important passages
  • Complete the exercises and projects in the book
Create a blog post or video tutorial on a topic covered in the course
Deepen your understanding of a topic by teaching it to others.
Show steps
  • Choose a topic that you are familiar with and that you think would be beneficial to others
  • Create a blog post or video tutorial that explains the topic clearly and concisely
  • Publish your blog post or video tutorial online
  • Promote your blog post or video tutorial on social media or other online platforms
Participate in a hackathon or coding challenge related to embedded systems
Test your skills and knowledge in a competitive environment.
Browse courses on Embedded Systems
Show steps
  • Find a hackathon or coding challenge that is related to embedded systems
  • Register for the hackathon or coding challenge
  • Develop a solution to the problem or challenge
  • Submit your solution
  • Attend the hackathon or coding challenge and present your solution
Contribute to an open-source embedded systems project
Gain hands-on experience with real-world embedded systems projects.
Browse courses on Open Source
Show steps
  • Find an open-source embedded systems project that you are interested in
  • Fork the project on GitHub
  • Make changes to the project
  • Submit a pull request to the original project
  • Work with the project maintainers to get your changes merged

Career center

Learners who complete Embedded Systems Bare-Metal Programming Ground Up™ (STM32) will develop knowledge and skills that may be useful to these careers:
Firmware Engineer
A Firmware Engineer is responsible for the design, development, and maintenance of firmware for embedded systems. This course is highly relevant as it teaches you how to work with bare-metal embedded-c and how to write firmware from scratch. You'll learn about memory management, interrupts, and embedded systems programming, which are all key skills that firmware engineers need. Whether you're working with embedded systems or firmware, this course will provide you with a strong foundation in the fundamentals.
Robotics Engineer
Robotics Engineers design, develop, and maintain robots. This course is highly relevant for robotics engineers, as it provides a deep understanding of embedded systems and their components, including microcontrollers, peripherals, and drivers. You'll learn about hardware and software integration, system architecture, and system design, which are all essential knowledge for robotics engineers.
Hardware Engineer
Hardware Engineers design, develop, and maintain hardware systems. This course provides a solid foundation for hardware engineers, as it teaches you how to interact with hardware at a low level, including working with memory, registers, and peripherals. You'll learn about embedded systems hardware, memory mapping, and interfacing with peripherals and drivers, all of which are essential knowledge for hardware engineers.
Embedded Systems Engineer
Embedded Systems Engineers design, develop, and maintain embedded systems. With this course, you'll learn about microcontroller hardware, memory mapping, and interfacing with peripherals and drivers. For embedded systems engineers, understanding hardware and its interaction with software is essential. You'll learn to work with low-level code, registers, and memory, all of which are key aspects of embedded systems engineering.
Electrical Engineer
Electrical Engineers design, develop, and maintain electrical systems, including power systems, lighting systems, and control systems. This course will provide you with a solid foundation in embedded systems, which are often used in electrical engineering. You'll learn about hardware and software integration, system architecture, and system design, which will be valuable to you as you work on electrical systems.
Computer Engineer
Computer Engineers design, develop, and maintain computer systems, including hardware and software systems. This course will help you develop the skills necessary to understand and work with embedded systems, which are often used in computer engineering. You'll learn about hardware and software integration, system architecture, and system design, which will be valuable to you as you work on computer systems.
Systems Engineer
Systems Engineers ensure that complex systems are designed, developed, and maintained to meet the needs of stakeholders. This course will provide you with a strong understanding of embedded systems and their components, which is critical for Systems Engineers. You'll learn about hardware and software integration, system architecture, and system design. This knowledge will help you succeed in the design and development of complex systems engineering solutions.
Control Systems Engineer
Control Systems Engineers design, develop, and maintain control systems, which are used to control the behavior of physical systems. This course will provide you with a strong foundation in embedded systems, which are often used in control systems. You'll learn about hardware and software integration, system architecture, and system design, which will be valuable to you as you work on control systems.
Electronics Engineer
Electronics Engineers design, develop, and maintain electronic systems, including power systems, control systems, and communication systems. This course will provide you with a solid foundation in embedded systems, which are often used in electronics engineering. You'll learn about hardware and software integration, system architecture, and system design, which will be valuable to you as you work on electronic systems.
Mechatronics Engineer
Mechatronics Engineers design, develop, and maintain mechatronic systems, which combine mechanical, electrical, and computer engineering. This course will provide you with a strong foundation in embedded systems, which are often used in mechatronic systems. You'll learn about hardware and software integration, system architecture, and system design, which will be valuable to you as you work on mechatronic systems.
Software Engineer
Software Engineers design, develop, and maintain software systems. This course will help you develop the skills necessary to work with embedded systems, which are often used in software engineering. You'll learn about embedded systems programming, memory management, and interrupts. This knowledge will be valuable to you as you work on software systems that interact with hardware.
Automated Test Engineer
Automated Test Engineers design, develop, and maintain automated test systems, which are used to test the functionality of electronic and mechanical systems. This course will provide you with a strong foundation in embedded systems, which are often used in automated test systems. You'll learn about hardware and software integration, system architecture, and system design, which will be valuable to you as you work on automated test systems.
Product Development Engineer
Product Development Engineers design, develop, and maintain products, including consumer products, industrial products, and medical products. This course may be useful to you if you are interested in working on products that incorporate embedded systems. You'll learn about hardware and software integration, system architecture, and system design, which will be valuable to you as you work on product development.
Quality Assurance Engineer
Quality Assurance Engineers ensure that products and systems meet quality standards. This course may be useful for you if you are interested in working on quality assurance for embedded systems. You'll learn about hardware and software integration, system architecture, and system design, which will be valuable to you as you work on quality assurance.
Technical Writer
Technical Writers create and maintain documentation for technical products and systems. This course may be useful for you if you are interested in writing documentation for embedded systems. You'll learn about hardware and software integration, system architecture, and system design, which will be valuable to you as you write documentation for embedded systems.

Reading list

We've selected 17 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 Bare-Metal Programming Ground Up™ (STM32).
This textbook is designed to be a comprehensive treatment of the field of embedded systems, with a focus on practical aspects of embedded systems engineering and design.
Provides a comprehensive introduction to ARM assembly language, including a discussion of important architectural features of the ARM processor.
Provides a comprehensive introduction to embedded software development using C. It covers a wide range of topics, including hardware interfacing, software development tools, and real-time operating systems.
Provides comprehensive coverage of microcontroller architecture, programming, interfacing, and system design. It could be used as a reference for those interested in more advanced topics.
Provides a comprehensive introduction to embedded systems development using ARM Cortex-M microcontrollers. It covers both assembly language and C programming, making it a good choice for those who want to learn both.
Provides a comprehensive introduction to embedded systems programming using C and GNU development tools. It covers a wide range of topics, including hardware interfacing, real-time operating systems, and networking.
Provides detailed, hardware-centric coverage of the ARM Cortex-M3 architecture, with a focus on the STM32 family of microcontrollers. It could be used as supplementary reading for those interested in the deeper details of the hardware.
Provides a comprehensive overview of modern embedded systems, including hardware, software, and design principles. It could be used as supplementary reading for a deeper understanding of the field.
This handbook provides a comprehensive overview of automotive embedded systems. It covers a wide range of topics, including hardware, software, safety, and security.
Provides a practical introduction to C programming for microcontrollers. It could be used as a supplement to this course or as a prerequisite for someone who is new to C programming.
Provides a comprehensive introduction to real-time systems design and analysis. It covers a wide range of topics, including scheduling, concurrency, and fault tolerance.
Embedded Systems Architecture provides a comprehensive overview of the design and development of embedded systems.

Share

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

Similar courses

Here are nine courses similar to Embedded Systems Bare-Metal Programming Ground Up™ (STM32).
Embedded Software and Hardware Architecture
Most relevant
ARM Cortex (STM32) Deep Dive: Mastering Embedded Systems
Most relevant
STM32Fx Microcontroller Custom Bootloader Development
Most relevant
Mastering RTOS: Hands on FreeRTOS and STM32Fx with...
Most relevant
Embedded Systems Programming on ARM Cortex-M3/M4 Processor
Most relevant
ARM Cortex (STM32) Fundamentals: Building Embedded Systems
Most relevant
Mastering Microcontroller and Embedded Driver Development
Most relevant
Microcontroller Embedded C Programming: Absolute Beginners
Most relevant
Cortex-M Software Development Fundamentals
Most relevant
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 - 2024 OpenCourser