modm (prononcé comme « modem » commuté) est une boîte à outils permettant de créer des bibliothèques C++23 personnalisées adaptées à votre appareil intégré. modm génère du code de démarrage, des HAL et leurs implémentations, des protocoles de communication, des pilotes pour périphériques externes et des BSP dans un processus modulaire et personnalisable que vous pouvez affiner selon vos besoins.
Ce projet dispose également d'un forum de discussion et d'un blog technique pour documenter des concepts de conception plus vastes.
modm est optimisé pour les exigences strictes de la compétition Eurobot, où nos robots doivent fonctionner de manière fiable et totalement autonome pendant les 100 secondes du jeu. Nos robots contiennent de nombreux microcontrôleurs différents, certains sans beaucoup de ressources. Modm doit donc remplir un ensemble diversifié d'objectifs, comme une petite taille de code avec une faible consommation de mémoire, un déroulement de programme prévisible et une portabilité extrême.
Le code source de la bibliothèque est sous licence MPLv2 avec tout code source externe sous licences compatibles (BSD, Apache2, MIT). N'hésitez donc pas à créer ce projet et à l'adapter à vos besoins. La seule chose que nous vous demandons est de contribuer à vos modifications afin que tout le monde puisse en bénéficier.
Veuillez cloner modm de manière récursive, vous avez besoin de tous les sous-modules :
git clone --recurse-submodules --jobs 8 https://github.com/modm-io/modm.git
modm peut créer un HAL pour 3839 appareils de ces fournisseurs :
Voici un tableau avec toutes les familles de périphériques et les pilotes de périphériques qu'ils prennent en charge :
Notez qu'il s'agit d'un aperçu récapitulatif et que votre appareil spécifique peut ne pas disposer de tous les périphériques répertoriés dans ce tableau. Veuillez découvrir les pilotes de périphériques de modm pour votre appareil spécifique.
STM32 | SAM | PR | À | ||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Périphérique | C0 | 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 | Méga | Minuscule |
CDA | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ○ | ✅ | ✅ | ✅ | ○ | ○ | ○ | ✅ | ✅ | ✅ | ○ | ✅ | ✅ |
PEUT | ✕ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✕ | ✕ | ✅ | ✅ | ✅ | ✕ | ○ | ✅ | ✕ | ✕ | ○ | ○ | ✕ |
Comparateur | ✕ | ○ | ✕ | ✕ | ✅ | ✕ | ✕ | ✅ | ✅ | ○ | ○ | ○ | ✅ | ○ | ○ | ○ | ○ | ○ | ✕ | ✕ | ○ | ○ | ○ |
CAD | ✕ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ○ | ○ | ✅ | ✕ | ✕ | ✕ | ○ | ✕ |
DMLA | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ○ | ○ | ○ | ✅ | ✕ | ✅ | ✕ | ✕ | ✕ |
Ethernet | ✕ | ✕ | ○ | ○ | ✕ | ✅ | ✅ | ✕ | ✕ | ○ | ✕ | ✕ | ✕ | ✕ | ✕ | ✕ | ○ | ○ | ✕ | ✕ | ✕ | ✕ | ✕ |
Interruption externe | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ○ | ○ | ○ | ✅ | ✅ | ✅ | ✅ |
Mémoire externe | ✕ | ✕ | ✅ | ✅ | ✕ | ✅ | ○ | ✕ | ○ | ○ | ✕ | ✕ | ○ | ○ | ○ | ✕ | ✕ | ○ | ✕ | ✕ | ✕ | ✕ | ✕ |
GPIO | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
Je 2C | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ○ | ○ | ✅ | ○ | ✅ | ✅ | ✅ | ✅ |
Flash interne | ○ | ○ | ✅ | ○ | ○ | ✅ | ○ | ✅ | ✅ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ✕ | ✕ | ✕ | ✕ |
IWDG | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✕ | ✕ | ✕ | ✕ | ✕ | ✕ | ✕ | ✕ |
Générateur aléatoire | ✕ | ✕ | ✕ | ✅ | ✕ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✕ | ✅ | ✅ | ✅ | ✕ | ○ | ○ | ✕ | ✕ | ✕ | ✕ | ✕ |
IPS | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ○ | ○ | ○ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
Horloge système | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✕ | ✕ | ✕ |
Minuteur | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ○ | ○ | ✅ | ✅ | ○ | ○ | ○ | ○ |
UART | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ○ |
Identifiant unique | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✕ | ✕ | ✕ | ✕ | ✕ | ✕ | ✕ | ✕ |
USB | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✕ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ○ | ✅ | ✅ | ✕ | ✕ | ✕ |
Nous ne sommes qu'une petite équipe de développeurs et sommes limités dans le nombre d'appareils que nous pouvons prendre en charge et tester matériellement. Ouvrez une discussion pour demander si votre appareil spécifique est pris en charge dès le départ et comment vous pouvez l'ajouter autrement.
Nous proposons un support prêt à l'emploi pour de nombreuses cartes de développement, y compris la documentation.
AL-AVREB-CAN | Arduino NANO | Arduino UNO | Pilule noire F103 |
Pilule noire F401 | Pilule noire F411 | Pilule bleue F103 | DEVEBOX-STM32F4XX |
DEVEBOX-STM32H750VB | DISCO-F051R8 | DISCO-F072RB | DISCO-F100RB |
DISCO-F303VC | DISCO-F401VC | DISCO-F407VG | DISCO-F411VE |
DISCO-F429ZI | DISCO-F469NI | DISCO-F746NG | DISCO-F769NI |
DISCO-L152RC | DISCO-L476VG | PLUME-M0 | PLUME-M4 |
PLUME-RP2040 | MÉGA-2560-PRO | NUCLÉO-C031C6 | NUCLÉO-F031K6 |
NUCLÉO-F042K6 | NUCLÉO-F072RB | NUCLEO-F091RC | NUCLÉO-F103RB |
NUCLÉO-F303K8 | NUCLÉO-F303RE | NUCLÉO-F334R8 | NUCLÉO-F401RE |
NUCLÉO-F411RE | NUCLÉO-F429ZI | NUCLÉO-F439ZI | NUCLÉO-F446RE |
NUCLÉO-F446ZE | NUCLÉO-F746ZG | NUCLÉO-F767ZI | NUCLÉO-G070RB |
NUCLÉO-G071RB | NUCLÉO-G431KB | NUCLÉO-G431RB | NUCLÉO-G474RE |
NUCLÉO-H723ZG | NUCLÉO-H743ZI | NUCLÉO-L031K6 | NUCLÉO-L053R8 |
NUCLÉO-L152RE | NUCLÉO-L432KC | NUCLÉO-L452RE | NUCLÉO-L476RG |
NUCLÉO-L496ZG-P | NUCLÉO-L552ZE-Q | NUCLÉO-U575ZI-Q | OLIMEXINO-STM32 |
Framboise Pi Pico | SAMD21-MINI | SAMD21-XPLAINED-PRO | SAME54-XPLAINED-PRO |
SAME70-XPLAINÉ | SAMG55-XPLAINED-PRO | SAMV71-XPLAINED-ULTRA | Réponse intelligente XE |
STM32-F4VE | STM32F030-DÉMO | THINGPLUS-RP2040 |
Nous disposons également d'un certain nombre de pilotes totalement indépendants de la cible pour les périphériques externes connectés via I 2 C, SPI, UART, BitBang, etc. La plupart d'entre eux vous donnent également accès à l'ensemble du périphérique afin que vous puissiez facilement les configurer pour vos besoins spécifiques.
AD7280A | AD7928 | ADIS16470 | ADNS9800 | ADS101X | ADS7828 |
ADS7843 | ADS816x | AMS5915 | APA102 | AS5047 | AS5600 |
AT24MAC402 | Flash SPI | BME280 | IMC088 | BMP085 | BNO055 |
CAT24AA | COMPTEUR DE CYCLE | DRV832X | DS1302 | DS1631 | DS18B20 |
DW3110 | EA-CHIEN | Entrée du codeur | BitBang d'entrée de l'encodeur | Sortie BitBang de l'encodeur | FT245 |
FT6x06 | Échantillonneur Gpio | HCLAX | HD44780 | HMC58x | HMC6343 |
HX711 | I2C-EEPROM | ILI9341 | IS31FL3733 | ITG3200 | IXM42XXX |
L3GD20 | LAN8720A | LAWICEL | LIS302DL | LIS3DSH | LIS3MDL |
LM75 | LP503x | LSM303A | LSM6DS33 | LSM6DSO | LTC2984 |
MAX31855 | MAX31865 | MAX6966 | MAX7219 | MCP23x17 | MCP2515 |
MCP3008 | MCP7941x | MCP990X | MMC5603 | MS5611 | MS5837 |
NOKIA5110 | NRF24 | AFFICHAGE TFT | PAT9125EL | PCA8574 | PCA9535 |
PCA9548A | PCA9685 | QMC5883L | SH1106 | SIEMENS-S65 | SIEMENS-S75 |
SK6812 | SK9822 | SSD1306 | ST7586S | ST7789 | STTS22H |
STUSB4500 | SX1276 | SX128X | TCS3414 | TCS3472 | TLC594x |
TMP102 | TMP12x | TMP175 | TOUCH2046 | VL53L0 | VL6180 |
WS2812 |
Veuillez consulter nos exemples pour une liste complète des cibles et des pilotes testés.
Le moyen le plus simple pour vous et le meilleur moyen pour nous de voir si quelque chose n'est pas clair ou manquant est d'utiliser la bibliothèque et de nous faire part de vos commentaires en déposant un rapport de bogue ou si vous avez déjà un correctif en ouvrant une demande d'extraction.
Voir CONTRIBUTING.md pour nos directives de contribution.
Le projet modm est maintenu par Niklas Hauser (@salkinium), Raphael Lehmann (@rleh) et Christopher Durand (@chris-durand) avec des contributions significatives de 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) et bien d'autres contributeurs.