Skip to content


Switch branches/tags

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?

Latest commit


Git stats


Failed to load latest commit information.
Latest commit message
Commit time


OpenMPTL is a C++ template library for lowlevel access to microprocessor registers and peripherals. It provides classes for generic register access and peripheral resources management, as well as a simulation framework. It is fast and deterministic, ideal for real-time operating systems.

Key Features:

  • Simple and comprehensive declaration and usage of microprocessor register classes
  • Framework for generic resources declaration (e.g. auto-configuration of peripheral enable registers)
  • Automatic generation of interrupt handler tables from resources
  • Compile-Time errors on resource conflicts or wrong register access
  • Supports bit-band access to register bits for faster access times
  • Simulation framework, showing all lowlevel register access and allowing to implement reactions to specific register bits.

OpenMPTL benefits from the C++11 template metaprogramming features, is an header-only library and does not depend on RTTI, exceptions or any external library.

Official home page:

Supported Architechtures

OpenMPTL provides generic functionality for the ARM Cortex family, as well as specific implementations for STM32 microcontrollers.


Register declarations for many ARM Cortex microcontrollers are available, but not yet streamlined:


The documentation is provided within the source code. The API Reference Documentation is available for online browsing.

Recommended starting points for high-level usage:

  • projects/stm32f4discovery-ledtest/src/ledtest.cpp
  • projects/stm32f4discovery/src/kernel.hpp
  • projects/stm32f4discovery/src/kernel.cpp
  • projects/stm32f4discovery/src/startup.hpp
  • drivers/joystick/stm32f103stk/joystick.hpp

Recommended starting points for low-level usage:

  • arch/arm/cortex/stm32/common/usart.hpp
  • include/register.hpp
  • include/register_access.hpp

Example usage (high level)

#include <arch/gpio.hpp>
using led_green = mptl::gpio_led< 'D', 12 >;

Example usage (low level)

#include <arch/reg/spi.hpp>
using SPIx = SPI<1>;
auto reg = SPIx::CR1::load();
reg &= SPIx::CR1::SPE::value | SPIx::CR1::CRCNEXT::value | SPIx::CR1::CRCEN::value;

A load() call results in:

constexpr volatile T * value_ptr = reinterpret_cast<volatile T *>(addr);
auto reg = *value_ptr;

A store() call results in:

*value_ptr = reg;


  • addr (constexpr) holds the non-pointer-type address of SPIx::CR1
  • T is the register type (e.g. uint32_t or uint8_t)

Simulation Framework

The simulation framework allows you to run embedded code in a simulated environment. It traces every register access and allows you to react on specific bit changes.

Example (ledtest)

# cd projects/stm32f4discovery-ledtest
# ./stm32f4discovery-ledtest
RCC::CR         ::bitset()    0x00010000   [ ........ .......1 ........ ........ ]
[INFO] reacting to RCC::CR::HSEON, by setting RCC::CR::HSERDY
RCC::CR         ##bitset()    0x00020000   [ ........ ......1. ........ ........ ]
RCC::AHB1ENR    ::bitset()    0x00000008   [ ........ ........ ........ ....1... ]
GPIOD::MODER    ::load()      0x00000000   [ 00000000 00000000 00000000 00000000 ]
GPIOD::MODER    ::store()     0x01000000   [ 00000001 00000000 00000000 00000000 ]
GPIOD::BSRR     ::store()     0x00001000   [ 00000000 00000000 00010000 00000000 ]

Example (stm32f103stk-demo)

# cd projects/stm32f103stk-demo
# ../../bin/ ./stm32f103stk-demo
Welcome to OpenMPTL terminal console!
# help
List of commands:
   cpuid      prints SCB::CPUID register hexadecimal value
   heap       allocate (leak) 1k on heap
   nrf        test the NRF24L01 chip (spi)

Folder Hierarchy

  • arch: Architecture dependent template library
  • bin: Helper applications
  • config: Makefiles, included by projects
  • doc: doxygen documentation build root
  • drivers: Drivers for specific peripherals
  • include: Main OpenMPTL class declarations
  • lib: Auxiliary libraries
  • projects: Example projects
    • stm32f103stk-demo: Example project for the stm32f103stk evaluation board
    • stm32f4discovery: Example project for the stm32f4discovery evaluation board
    • stm32f4discovery-ledtest: Simple example for the stm32f4discovery evaluation board
    • unittest: OpenMPTL unit tests
  • sim: Compilation units for simulation framework


Source Code Repository

The source code for OpenMPTL is managed using Git.

Official repository:

git clone

Mirror on GitHub:

git clone

How to Contribute

Your contributions are welcome!

If you would like to contribute or have found bugs:

Any feedback is appreciated!


OpenMPTL is free software, available under the GNU General Public License, Version 3.

Some register definition files in arch/*/reg contain derivative representations of CMSIS System View Description (SVD) files, and are subject to the "End User License Agreement for STMicroelectronics" (see "STM_License.html" in the containing directory).