modm (произносится как «модем» коммутируемого доступа) — это набор инструментов для создания пользовательских библиотек C++23, адаптированных к вашему встроенному устройству. modm генерирует код запуска, HAL и их реализации, протоколы связи, драйверы для внешних устройств и BSP в рамках модульного настраиваемого процесса, который вы можете настроить под свои нужды.
В этом проекте также есть форум для дискуссий и технический блог для документирования более крупных концепций дизайна.
modm оптимизирован для жестких требований соревнований Eurobot, где наши роботы должны работать надежно и полностью автономно на протяжении 100 секунд игры. Наши роботы содержат множество различных микроконтроллеров, некоторые из которых не имеют большого количества ресурсов, поэтому модем должен выполнять широкий набор задач, таких как небольшой размер кода с небольшим потреблением памяти, предсказуемый поток программы, исключительная мобильность.
Исходный код библиотеки лицензируется как MPLv2 с любым внешним исходным кодом по совместимым лицензиям (BSD, Apache2, MIT). Так что смело разветвляйте этот проект и адаптируйте его под свои нужды. Единственное, о чем мы просим вас, — это вернуть ваши изменения, чтобы каждый мог получить от них пользу.
Пожалуйста, клонируйте модм рекурсивно, вам нужны все подмодули:
git clone --recurse-submodules --jobs 8 https://github.com/modm-io/modm.gitmodm может создать HAL для 3839 устройств этих производителей:
Вот таблица со всеми семействами устройств и драйверами периферийных устройств, которые они поддерживают:
Обратите внимание, что это краткий обзор, и ваше конкретное устройство может не иметь всех периферийных устройств, перечисленных в этой таблице. Пожалуйста, найдите драйверы периферийных устройств modm для вашего конкретного устройства.
| СТМ32 | СЭМ | РП | В | ||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Периферийное устройство | С0 | Ф0 | Ф1 | Ф2 | Ф3 | F4 | F7 | G0 | G4 | Н7 | Л0 | Л1 | Л4 | Л5 | U5 | D1x D2x ДАкс | D5x E5x | E7x S7x V7x | G5x | 20 | 90 | Мега | Крошечный |
| АЦП | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ○ | ✅ | ✅ | ✅ | ○ | ○ | ○ | ✅ | ✅ | ✅ | ○ | ✅ | ✅ |
| МОЖЕТ | ✕ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✕ | ✕ | ✅ | ✅ | ✅ | ✕ | ○ | ✅ | ✕ | ✕ | ○ | ○ | ✕ |
| Компаратор | ✕ | ○ | ✕ | ✕ | ✅ | ✕ | ✕ | ✅ | ✅ | ○ | ○ | ○ | ✅ | ○ | ○ | ○ | ○ | ○ | ✕ | ✕ | ○ | ○ | ○ |
| ЦАП | ✕ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ○ | ○ | ✅ | ✕ | ✕ | ✕ | ○ | ✕ |
| прямой доступ к памяти | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ○ | ○ | ○ | ✅ | ✕ | ✅ | ✕ | ✕ | ✕ |
| Ethernet | ✕ | ✕ | ○ | ○ | ✕ | ✅ | ✅ | ✕ | ✕ | ○ | ✕ | ✕ | ✕ | ✕ | ✕ | ✕ | ○ | ○ | ✕ | ✕ | ✕ | ✕ | ✕ |
| Внешнее прерывание | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ○ | ○ | ○ | ✅ | ✅ | ✅ | ✅ |
| Внешняя память | ✕ | ✕ | ✅ | ✅ | ✕ | ✅ | ○ | ✕ | ○ | ○ | ✕ | ✕ | ○ | ○ | ○ | ✕ | ✕ | ○ | ✕ | ✕ | ✕ | ✕ | ✕ |
| GPIO | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| я 2 С | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ○ | ○ | ✅ | ○ | ✅ | ✅ | ✅ | ✅ |
| Внутренняя вспышка | ○ | ○ | ✅ | ○ | ○ | ✅ | ○ | ✅ | ✅ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ✕ | ✕ | ✕ | ✕ |
| ИВДГ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✕ | ✕ | ✕ | ✕ | ✕ | ✕ | ✕ | ✕ |
| Случайный генератор | ✕ | ✕ | ✕ | ✅ | ✕ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✕ | ✅ | ✅ | ✅ | ✕ | ○ | ○ | ✕ | ✕ | ✕ | ✕ | ✕ |
| СПИ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ○ | ○ | ○ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| Системные часы | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✕ | ✕ | ✕ |
| Таймер | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ○ | ○ | ✅ | ✅ | ○ | ○ | ○ | ○ |
| УАРТ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ○ |
| Уникальный идентификатор | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✕ | ✕ | ✕ | ✕ | ✕ | ✕ | ✕ | ✕ |
| USB | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✕ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ○ | ✅ | ✅ | ✕ | ✕ | ✕ |
Мы всего лишь небольшая команда разработчиков, и мы ограничены в количестве устройств, которые мы можем поддерживать и тестировать на аппаратном уровне. Откройте обсуждение, чтобы узнать, поддерживается ли ваше конкретное устройство «из коробки» и как его можно добавить в противном случае.
У нас есть готовая поддержка для многих плат разработки, включая документацию.
| АЛЬ-АВРЕБ-КАН | Ардуино НАНО | Ардуино УНО | Черная таблетка F103 |
| Черная таблетка F401 | Черная таблетка F411 | Синяя таблетка F103 | ДЕВЕВОКС-STM32F4XX |
| ДЕВЕВОКС-STM32H750VB | ДИСКО-F051R8 | ДИСКО-F072RB | ДИСКО-F100RB |
| ДИСКО-F303VC | ДИСКО-F401VC | ДИСКО-F407VG | ДИСКО-F411VE |
| ДИСКО-F429ZI | ДИСКО-F469NI | ДИСКО-F746NG | ДИСКО-F769NI |
| ДИСКО-L152RC | ДИСКО-L476VG | ПЕРО-М0 | ПЕРО-М4 |
| ПЕРО-RP2040 | МЕГА-2560-ПРО | НУКЛЕО-C031C6 | НУКЛЕО-F031K6 |
| НУКЛЕО-F042K6 | НУКЛЕО-F072RB | НУКЛЕО-F091RC | НУКЛЕО-F103RB |
| НУКЛЕО-F303K8 | НУКЛЕО-F303RE | НУКЛЕО-F334R8 | НУКЛЕО-F401RE |
| НУКЛЕО-F411RE | НУКЛЕО-F429ZI | НУКЛЕО-F439ZI | НУКЛЕО-F446RE |
| НУКЛЕО-F446ZE | НУКЛЕО-F746ZG | НУКЛЕО-F767ZI | НУКЛЕО-G070RB |
| НУКЛЕО-G071RB | НУКЛЕО-G431КБ | НУКЛЕО-G431RB | НУКЛЕО-G474RE |
| НУКЛЕО-H723ZG | НУКЛЕО-H743ZI | НУКЛЕО-L031K6 | НУКЛЕО-L053R8 |
| НУКЛЕО-L152RE | НУКЛЕО-L432KC | НУКЛЕО-L452RE | НУКЛЕО-L476RG |
| НУКЛЕО-L496ZG-P | НУКЛЕО-L552ZE-Q | НУКЛЕО-U575ZI-Q | ОЛИМЕКСИНО-STM32 |
| Малиновый Пи Пико | САМД21-МИНИ | SAMD21-XPLAINED-PRO | SAME54-XPLAINED-PRO |
| SAME70-ОБЪЯСНЕНО | SAMG55-XPLAINED-PRO | SAMV71-XPLAINED-УЛЬТРА | Умный ответ XE |
| СТМ32-Ф4ВЕ | STM32F030-ДЕМО | THINGPLUS-RP2040 |
У нас также есть ряд полностью независимых от цели драйверов для внешних устройств, подключенных через I 2 C, SPI, UART, BitBang и т. д. Большинство из них также предоставляют вам доступ ко всему устройству, поэтому вы можете легко настроить их для своих конкретных нужд.
| AD7280A | AD7928 | ADIS16470 | АДНС9800 | ADS101X | ADS7828 |
| ADS7843 | ADS816x | АМС5915 | АПА102 | AS5047 | АС5600 |
| АТ24МАС402 | SPI-вспышка | БМЕ280 | ИМТ088 | БМП085 | БНО055 |
| КАТ24АА | СЧЕТЧИК ЦИКЛОВ | ДРВ832Х | DS1302 | DS1631 | ДС18Б20 |
| ДВ3110 | EA-СОБАКА | Вход энкодера | Входной кодировщик BitBang | Выход кодировщика BitBang | ФТ245 |
| FT6x06 | Gpio-сэмплер | HCLAx | HD44780 | HMC58x | HMC6343 |
| HX711 | I2C-EEPROM | ИЛИ9341 | ИС31ФЛ3733 | ITG3200 | IXM42XXX |
| Л3ГД20 | LAN8720A | ЛАВИСЕЛЬ | ЛИС302ДЛ | ЛИС3ДШ | ЛИС3МДЛ |
| ЛМ75 | LP503x | ЛСМ303А | ЛСМ6ДС33 | ЛСМ6ДСО | LTC2984 |
| МАКС31855 | МАКС31865 | МАКС6966 | МАКС7219 | МСР23x17 | МСР2515 |
| MCP3008 | MCP7941x | MCP990X | ММС5603 | MS5611 | MS5837 |
| НОКИА5110 | НРФ24 | TFT-ДИСПЛЕЙ | ПАТ9125EL | PCA8574 | PCA9535 |
| PCA9548A | PCA9685 | QMC5883L | SH1106 | СИМЕНС-S65 | СИМЕНС-S75 |
| SK6812 | SK9822 | SSD1306 | СТ7586С | ST7789 | STTS22H |
| СТУСБ4500 | SX1276 | SX128X | ТКС3414 | ТКС3472 | TLC594x |
| ТМП102 | ТМП12х | ТМП175 | СЕНСОРНЫЙ2046 | ВЛ53Л0 | ВЛ6180 |
| WS2812 |
Полный список протестированных целей и драйверов см. в наших примерах.
Самый простой способ для вас и лучший способ для нас узнать, есть ли что-то неясное или отсутствует, — это использовать библиотеку и дать нам обратную связь, отправив отчет об ошибке, или если у вас уже есть исправление, открыв запрос на включение.
См. CONTRIBUTING.md для ознакомления с нашими правилами внесения взносов.
Проект модема поддерживают Никлас Хаузер (@salkinium), Рафаэль Леманн (@rleh) и Кристофер Дюран (@chris-durand) при значительном вкладе Саши Шаде (@strongly-typed), Фабиана Грейфа (@dergraaf), Кевина Лойфер (@ekiwi), Мартин Роузкейт (@thundernail), Дэниел Кребс (@daniel-k), Георгий Гриншпун (@georgi-g), Дэвид Хеббекер (@dhebbeker), Торстен Лаевски (@TheTh0r), Майк Вольфрам (@mikewolfram) и многие другие участники.