modm(发音类似于拨号“调制解调器”)是一个工具箱,用于构建适合您的嵌入式设备的自定义 C++23 库。 modm 以模块化、可定制的流程生成启动代码、HAL 及其实现、通信协议、外部设备驱动程序和 BSP,您可以根据需要进行微调。
该项目还有一个讨论论坛和一个技术博客来记录更大的设计概念。
modm 针对 Eurobot 竞赛的严格要求进行了优化,我们的机器人需要在比赛的 100 秒持续时间内可靠且完全自主地运行。我们的机器人包含许多不同的微控制器,其中一些没有大量资源,因此 modm 需要实现一系列不同的目标,例如小代码大小和小内存消耗、可预测的程序流程、极高的可移植性。
该库源代码与任何外部源代码均按照兼容许可证(BSD、Apache2、MIT)授权为 MPLv2。因此,请随意分叉这个项目并根据您的需求进行调整。我们唯一要求您做的就是贡献您的更改,以便每个人都能受益。
请递归克隆 modm,您需要所有子模块:
git clone --recurse-submodules --jobs 8 https://github.com/modm-io/modm.git
modm 可以为这些供应商的 3839 设备创建 HAL:
下表列出了所有设备系列及其支持的外设驱动程序:
请注意,这是一个摘要概述,您的特定设备可能不具备此表中的所有外围设备。请查找适合您的特定设备的调制解调器外围设备驱动程序。
STM32 | 萨姆 | RP | 在 | ||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
周边 | 二氧化碳 | F0 | F1 | F2 | F3 | F4 | F7 | G0 | G4 | H7 | L0 | L1 | L4 | L5 | U5 | D1x d2x DAx | D5x E5x | E7x S7x V7x | G5x | 20 | 90 | 兆 | 微小的 |
模数转换器 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ○ | ✅ | ✅ | ✅ | ○ | ○ | ○ | ✅ | ✅ | ✅ | ○ | ✅ | ✅ |
能 | ✕ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✕ | ✕ | ✅ | ✅ | ✅ | ✕ | ○ | ✅ | ✕ | ✕ | ○ | ○ | ✕ |
比较器 | ✕ | ○ | ✕ | ✕ | ✅ | ✕ | ✕ | ✅ | ✅ | ○ | ○ | ○ | ✅ | ○ | ○ | ○ | ○ | ○ | ✕ | ✕ | ○ | ○ | ○ |
数模转换器 | ✕ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ○ | ○ | ✅ | ✕ | ✕ | ✕ | ○ | ✕ |
DMA | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ○ | ○ | ○ | ✅ | ✕ | ✅ | ✕ | ✕ | ✕ |
以太网 | ✕ | ✕ | ○ | ○ | ✕ | ✅ | ✅ | ✕ | ✕ | ○ | ✕ | ✕ | ✕ | ✕ | ✕ | ✕ | ○ | ○ | ✕ | ✕ | ✕ | ✕ | ✕ |
外部中断 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ○ | ○ | ○ | ✅ | ✅ | ✅ | ✅ |
外部存储器 | ✕ | ✕ | ✅ | ✅ | ✕ | ✅ | ○ | ✕ | ○ | ○ | ✕ | ✕ | ○ | ○ | ○ | ✕ | ✕ | ○ | ✕ | ✕ | ✕ | ✕ | ✕ |
通用输入输出接口 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
我2C | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ○ | ○ | ✅ | ○ | ✅ | ✅ | ✅ | ✅ |
内部闪存 | ○ | ○ | ✅ | ○ | ○ | ✅ | ○ | ✅ | ✅ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ✕ | ✕ | ✕ | ✕ |
IWDG | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✕ | ✕ | ✕ | ✕ | ✕ | ✕ | ✕ | ✕ |
随机发生器 | ✕ | ✕ | ✕ | ✅ | ✕ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✕ | ✅ | ✅ | ✅ | ✕ | ○ | ○ | ✕ | ✕ | ✕ | ✕ | ✕ |
SPI | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ○ | ○ | ○ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
系统时钟 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✕ | ✕ | ✕ |
定时器 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ○ | ○ | ✅ | ✅ | ○ | ○ | ○ | ○ |
串口 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ○ |
唯一ID | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✕ | ✕ | ✕ | ✕ | ✕ | ✕ | ✕ | ✕ |
USB | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✕ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ○ | ✅ | ✅ | ✕ | ✕ | ✕ |
我们只是一小群开发人员,并且我们可以在硬件中支持和测试的设备数量有限。展开讨论,询问您的特定设备是否受开箱即用支持以及如何添加它。
我们为许多开发板提供开箱即用的支持,包括文档。
阿尔-阿夫雷布-坎 | Arduino 纳米 | Arduino UNO | 黑丸F103 |
黑丸F401 | 黑丸F411 | 蓝丸F103 | DEVEBOX-STM32F4XX |
DEVEBOX-STM32H750VB | 迪斯科-F051R8 | 迪斯科-F072RB | 迪斯科-F100RB |
DISCO-F303VC | 迪斯科-F401VC | 迪斯科-F407VG | 迪斯科-F411VE |
迪斯科-F429ZI | 迪斯科-F469NI | 迪斯科-F746NG | 迪斯科-F769NI |
迪斯科-L152RC | 迪斯科-L476VG | 羽毛-M0 | 羽毛-M4 |
羽毛-RP2040 | MEGA-2560-PRO | NUCLEO-C031C6 | NUCLEO-F031K6 |
NUCLEO-F042K6 | NUCLEO-F072RB | NUCLEO-F091RC | NUCLEO-F103RB |
NUCLEO-F303K8 | NUCLEO-F303RE | NUCLEO-F334R8 | NUCLEO-F401RE |
NUCLEO-F411RE | NUCLEO-F429ZI | NUCLEO-F439ZI | NUCLEO-F446RE |
NUCLEO-F446ZE | NUCLEO-F746ZG | NUCLEO-F767ZI | NUCLEO-G070RB |
NUCLEO-G071RB | NUCLEO-G431KB | NUCLEO-G431RB | NUCLEO-G474RE |
NUCLEO-H723ZG | NUCLEO-H743ZI | NUCLEO-L031K6 | NUCLEO-L053R8 |
核仁-L152RE | NUCLEO-L432KC | 核仁-L452RE | NUCLEO-L476RG |
NUCLEO-L496ZG-P | NUCLEO-L552ZE-Q | NUCLEO-U575ZI-Q | 奥利美西诺-STM32 |
树莓派 Pico | SAMD21-MINI | SAMD21-XPLAINED-PRO | SAME54-XPLAINED-PRO |
SAME70-X解释 | SAMG55-XPLAINED-PRO | SAMV71-XPLAINED-ULTRA | 智能响应XE |
STM32-F4VE | STM32F030-演示 | THINGPLUS-RP2040 |
我们还有许多完全独立于目标的驱动程序,用于通过 I 2 C、SPI、UART、BitBang 等连接的外部设备。其中大多数驱动程序还允许您访问整个设备,以便您可以根据您的特定需求轻松配置它们。
AD7280A | AD7928 | ADIS16470 | ADNS9800 | ADS101X | ADS7828 |
ADS7843 | ADS816x | AMS5915 | APA102 | AS5047 | AS5600 |
AT24MAC402 | SPI闪存 | BME280 | BMI088 | BMP085 | BNO055 |
CAT24AA | 自行车计数器 | DRV832X | DS1302 | DS1631 | DS18B20 |
DW3110 | EA狗 | 编码器输入 | 编码器输入 BitBang | 编码器输出 BitBang | FT245 |
FT6x06 | GPIO 采样器 | HCLAx | HD44780 | HMC58x | HMC6343 |
HX711 | I2C-EEPROM | ILI9341 | IS31FL3733 | ITG3200 | IXM42XXX |
L3GD20 | 局域网8720A | 洛维赛尔 | LIS302DL | LIS3DSH | LIS3MDL |
LM75 | LP503x | LSM303A | LSM6DS33 | LSM6DSO | LTC2984 |
MAX31855 | MAX31865 | MAX6966 | MAX7219 | MCP23x17 | MCP2515 |
MCP3008 | MCP7941x | MCP990X | MMC5603 | MS5611 | MS5837 |
诺基亚5110 | NRF24 | TFT显示屏 | PAT9125EL | PCA8574 | PCA9535 |
PCA9548A | PCA9685 | QMC5883L | SH1106 | 西门子-S65 | 西门子-S75 |
SK6812 | SK9822 | SSD1306 | ST7586S | ST7789 | STTS22H |
STUSB4500 | SX1276 | SX128X | TCS3414 | TCS3472 | TLC594x |
TMP102 | TMP12x | TMP175 | 触摸2046 | VL53L0 | VL6180 |
WS2812 |
请参阅我们的示例以获取已测试目标和驱动程序的完整列表。
对于您和我们来说,查看是否有不清楚或丢失的内容的最简单方法是,您是否使用该库并通过提交错误报告向我们提供一些反馈,或者您是否已经修复了打开拉取请求的问题。
请参阅 CONTRIBUTING.md 了解我们的贡献指南。
modm 项目由 Niklas Hauser (@salkinium)、Raphael Lehmann (@rleh) 和 Christopher Durand (@chris-durand) 维护,Sascha Schade (@strongly-typed)、Fabian Greif (@dergraaf)、Kevin 做出了重大贡献Läufer (@ekiwi)、Martin Rosekeit (@thundernail)、Daniel Krebs (@daniel-k)、Georgi Grinshpun (@georgi-g)、David Hebbeker (@dhebbeker)、Thorsten Lajewski (@TheTh0r)、Mike Wolfram (@mikewolfram) 以及更多贡献者。