🛠 Programmer les deux cœurs M7 et M4 du GIGA R1 et les faire communiquer
Objectifs
Exploiter la fonctionnalité unique du GIGA R1 dans la gamme Arduino : programmer séparément le Cortex-M7 (jusqu'à 480 MHz) et le Cortex-M4 (jusqu'à 240 MHz) du STM32H747XI, par exemple Arduino/C++ sur le M7 et MicroPython sur le M4, puis les faire communiquer par RPC. C'est la voie royale pour isoler une interface temps réel d'une couche applicative.
Matériel
- 1 carte Arduino GIGA R1 WiFi
- 2 câbles USB-C ou un hub (un port par cœur côté PC, selon le cœur utilisé)
- Arduino IDE 2.x avec « Arduino Mbed OS Giga Boards » et l'extension Arduino Create / MicroPython
- Notions de la console série
Code complet
// GIGA R1 WiFi — coeur M7 (Arduino) : horloge maitre qui pousse le temps vers le M4
// Cote M4 : un script MicroPython recoit les messages via le canal RPC embarque.
#include <Arduino.h>
#include "RPC.h"
void setup {
Serial.begin(115200); // console USB du M7
RPC.begin; // canal inter-cceurs M7 <-> M4
Serial.println("M7 pret, envoi vers le M4");
}
void loop {
RPC.printf("tick %lu\n", millis); // message vers le coeur secondaire
delay(1000);
String msg = RPC.readStringUntil('\n'); // réponse eventuelle du M4
if (msg.length) Serial.print("M4> ");
Serial.print(msg);
}
Côté M4 (MicroPython, après téléversement du firmware MicroPython sur le cœur secondaire) :
# M4 MicroPython — lecture du canal RPC
import time
try:
import rpc
canal = rpc.RPC
while True:
msg = canal.read
if msg:
print("M7>", msg)
time.sleep_ms(50)
except Exception as e:
print("RPC indisponible:", e)
Vérification attendue
La console du M7 affiche « M7 prêt » puis part en envoi régulier ; la console du M4 (ou le moniteur MicroPython) reçoit les lignes « tick 1000 », « tick 2000 », etc. Les deux cœurs tournent en parallèle : une boucle while True occupée sur le M4 n'interrompt pas le battement du M7.
Erreurs fréquentes
- Croire qu'un seul sketch fait tourner les deux cœurs : chaque cœur a son propre firmware et son propre téléversement ; la documentation officielle décrit explicitement Arduino + MicroPython séparés reliés par RPC.
- Bibliothèque RPC absente ou inadaptée à la version du cœur : mettez à jour « Arduino Mbed OS Giga Boards » ; l'API exacte côté MicroPython varie avec les versions.
- Mémoire partagée mal dimensionnée : le M7 possède 192 Ko de RAM TCM et jusqu'à 864 Ko de SRAM utilisateur, le partage cœur à cœur consomme du RAM ; évitez les gros tampons.
- Confusion avec le cœur Zephyr : le nouveau cœur ArduinoCore-zephyr utilise un chargeur LLEXT à 0x08040000 et un modèle de chargement dynamique différent du modèle Mbed.
Autres tutoriels pour cette carte
Exemples de code pour cette carte
clignotante.inoArduinobouton.inoArduinorespiration.inoArduinoanalogique.inoArduinodac-onde.inoArduinooled-i2c.inoArduino