🛠 Premier sketch sur le cœur M4 : le blink qui se flash par ADB
Objectifs
Programmer le côté Arduino de la X8 : c'est le Cortex-M4 du STM32H747XI (jusqu'à 240 MHz) que tu programmes depuis l'IDE Arduino, pendant que le Cortex-M7 du même SoC exécute le firmware bridge « normalement invisible » qui expose les périphériques du MCU à Linux. La grande différence avec une carte classique : le sketch est uploadé par ADB (upload.tool=adb, VID 0x2341 / PID 0x0061, slot applicatif 0x08100000–0x08200000), pas en série classique. Tu vas installer le core, flasher un blink et comprendre qui fait quoi des trois systèmes embarqués dans la carte.
Matériel
- 1 × Arduino Portenta X8 + câble USB-C data (port USB 3.0 de préférence)
- Arduino IDE 1.8.10+, Arduino IDE 2.x ou arduino-cli
- Board Manager : core « Arduino Mbed OS Portenta Boards », puis carte « Arduino Portenta X8 » (
arduino:mbed_portenta:portenta_x8) - La carte doit être visible par
adb devicesavant tout upload (voir le tuto premiers pas)
Code complet
// blink_m4.ino — coeur Cortex-M4 du STM32H747XI de la Portenta X8
// Carte : "Arduino Portenta X8" (arduino:mbed_portenta:portenta_x8)
// L'upload passe par ADB, pas par un port série classique.
#include "SerialRPC.h" // optionnel : monitor série proxyfie vers Linux
int compteur = 0;
void setup {
Serial.begin(115200); // visible cote Linux via le service m4-proxy
while (!Serial) {}
pinMode(LED_BUILTIN, OUTPUT);
Serial.println("Portenta X8 - sketch M4 en vie");
}
void loop {
digitalWrite(LED_BUILTIN, HIGH);
delay(500);
digitalWrite(LED_BUILTIN, LOW);
delay(500);
Serial.print("tick ");
Serial.println(compteur++);
}
Vérification attendue
Dans l'IDE, l'upload affiche une progression via adb puis le sketch démarre : la LED clignote à 1 Hz. Le Serial de ce sketch n'est pas un port USB série classique — il est proxyfié vers Linux par le service m4-proxy (le tuto RPC t'apprendra à le lire depuis un conteneur). Garde la carte des yeux : si l'upload échoue, adb devices doit déjà répondre avant de toucher au code.
Erreurs fréquentes
- Upload qui échoue alors que le code compile : l'upload ADB exige que la carte soit vue par adb — sous Linux, droits udev pour le VID
0x2341; historiel, adb a aussi cassé sur des hosts arm64 (issue ArduinoCore-mbed #492, fermée). - Sélectionner « Portenta H7 » au lieu de « Portenta X8 » : même famille de core, pas le même target — le X8 a un bootloader/outil d'upload différent (adb).
- Attendre le moniteur série classique de l'IDE : sur X8, la console du M4 passe par le SerialRPC/m4-proxy côté Linux ; le moniteur série USB standard n'est pas le chemin documenté.
- Confondre les cœurs : le M4 est TON cœur Arduino ; le M7 du même SoC exécute le firmware bridge d'Arduino (ne pas flasher dessus avec l'IDE — il se met à jour par une procédure dédiée, voir le tuto firmware).
- Erreurs de compilation dans des exemples du net type
QSPIFBlockDevice not foundouWiFiAccessPoint does not name a type: pourriture connue d'exemples anciens (issues ArduinoCore-mbed #529 ouverte / #884 fermée) — pars des exemples du core installé, pas des blogs de 2022. - >
Autres tutoriels pour cette carte
- Premiers pas : comprendre le monstre à 9 cœurs et entrer dans Linux via ADB
- Docker dès la sortie de l'emballage : premier conteneur sur le Linux embarqué
- Pont Linux ↔ Arduino : appeler des fonctions du sketch M4 depuis Python (RPC)
- Mettre la X8 en réseau : Wi-Fi du Murata 1DX et Gigabit Ethernet sur porteuse
- Nœud IoT de datalogging : capteurs sur le M4, stockage et transport en conteneur
- Le firmware caché : mettre à jour le bridge STM32H7 M7 qui expose les périphériques à Linux
Exemples de code pour cette carte
etat-systeme.shBashgpio-libgpiod.shBashpython-gpio.pyPythondocker-hello.shBashflasher-core-arduino.shBashwifi-nmcli.shBash