Skip to content

These module docs are in beta and may be incomplete.

modm:math:units: SI Units

modm uses a couple of common SI units for configuration of peripherals:

  • frequency_t in Hertz: Hz, kHz and MHz.
  • baudrate_t in Baud: Bd, kBd, MBd.
  • bitrate_t in bit/s, bps.

These are integral units, so 1 Hz/Bd/bps cannot be split further, and are cast directly to uint32_t type, so they can be used as a non-type template argument.

Conversion can be done via constexpr functions from any numerical type:

  • modm::Hz(T value), modm::kHz(T value), modm::MHz(T value).
  • modm::Bd(T value), modm::kBd(T value), modm::MBd(T value).
  • modm::bps(T value), modm::kbps(T value), modm::Mbps(T value).

In addition, user-defined literals are provided in the modm::literals namespace:

using namespace modm::literals;

frequency_t frequency = modm::Mhz(10.5);
            frequency = 10.5_MHz;
baudrate_t baudrate = 115.2_kBd;
           baudrate = modm::kBd(115.2);
bitrate_t bitrate = modm::kbps(125);
          bitrate = 125_kbps;

frequency = 4295_MHz; // OVERFLOW at 2^32 units!

Integral Percentages

Since float cannot be used as a non-type template argument, an integer type for providing tolerances in percent_t is available. Note that percent_t is implemented as an enum class, which prevents implicit conversions, since the base for this is not 1. You must therefore use the modm::pct(T value) or _pct constructors.

using namespace modm::literals;

percent_t tolerance = modm::pct(10);
          tolerance = 10_pct;

// convert back to float. *internal use only*
float percent = modm::pct2f(tolerance);

This type is not guaranteed to hold more than 100 percent!


// Function
constexpr baudrate_t modm::Bd(T value);
constexpr baudrate_t modm::MBd(T value);
constexpr baudrate_t modm::kBd(T value);
constexpr bitrate_t modm::Mbps(T value);
constexpr bitrate_t modm::bps(T value);
constexpr bitrate_t modm::kbps(T value);
constexpr frequency_t modm::Hz(T value);
constexpr frequency_t modm::MHz(T value);
constexpr frequency_t modm::kHz(T value);
constexpr modm::literals::operator""_Bd(T value);
constexpr modm::literals::operator""_Hz(unsigned long long int value);
constexpr modm::literals::operator""_MBd(T value);
constexpr modm::literals::operator""_MHz(T value);
constexpr modm::literals::operator""_Mbps(T value);
constexpr modm::literals::operator""_bps(T value);
constexpr modm::literals::operator""_kBd(T value);
constexpr modm::literals::operator""_kHz(T value);
constexpr modm::literals::operator""_kbps(T value);
constexpr modm::literals::operator""_pct(T value);
constexpr percent_t modm::pct(T value);

// Typedef
using modm::baudrate_t = typedef uint32_t;
using modm::bitrate_t = typedef uint32_t;
using modm::frequency_t = typedef uint32_t;
using modm::percent_t = typedef uint16_t;


modm:math:units modm_math_units modm: math: units modm_architecture modm: architecture modm_math_units->modm_architecture modm_math modm: math modm_math_units->modm_math modm_architecture->modm_math_units modm_math->modm_math_units