[Sergey Lyubka] put together this epic guide for bare-metal microcontroller programming. While the general concepts should be applicable to most any microcontroller, Sergey’s examples specifically relate to the Nucleo-F429ZI development board featuring the ARM-based STM32F429 microcontroller.
In the realm of computer systems, bare-metal programming most often refers to programming the processor without an intervening operating system. This generally applies to programming BIOS, hardware drivers, communication drivers, elements of the operating system, and so forth. Even in the world of embedded programming, were things are generally quite low-level (close to the metal), we’ve grown accustomed to a good amount of hardware abstraction. For example, we often start projects already standing on the shoulders of various libraries, boot loaders, and intergraded development tools.
When we forego these abstractions and program directly on the microprocessor or microcontroller, we’re working on the bare metal. Sergey aptly defines this as programming the microcontroller “using just a compiler and a datasheet, nothing else.” His guide starts at the very foundation by examining the processor’s memory map and registers including locations for memory mapped I/O pins and other peripherals.
The guide walks us through writing up a minimal firmware program from boot vector to blinking an LED connected to an I/O pin. The demonstration continues with setup and use of necessary tools such as the compiler, linker, and flasher. We move on to increasingly advanced topics like timers, interrupts, UART output, debuggers, and even configuring an embedded webserver to expose a complete device dashboard.
While initially more time consuming, working close to the metal provides a good deal of additional insight into, and control over, hardware operations. For even more on the subject, you may like our STM32 Bootcamp series on bare-metal STM32 programming.