🛠 Programmer les deux cœurs M7 et M4 du GIGA R1 et les faire communiquer
Objetivos
Aprovechar la funcionalidad única del GIGA R1 dentro de la gama Arduino: programar por separado el Cortex-M7 (hasta 480 MHz) y el Cortex-M4 (hasta 240 MHz) del STM32H747XI, por ejemplo, Arduino/C++ en el M7 y MicroPython en el M4, y luego hacerlos comunicarse mediante RPC. Esta es la vía ideal para aislar una interfaz de tiempo real de una capa de aplicación.
Material
- 1 placa Arduino GIGA R1 WiFi
- 2 cables USB-C o un hub (un puerto por núcleo en el PC, según el núcleo utilizado)
- Arduino IDE 2.x con «Arduino Mbed OS Giga Boards» y la extensión Arduino Create / MicroPython
- Nociones de la consola serie
Código completo
// 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'); // reponse eventuelle du M4
if (msg.length) Serial.print("M4> ");
Serial.print(msg);
}
En el lado del M4 (MicroPython, después de cargar el firmware MicroPython en el núcleo secundario):
# 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)
Verificación esperada
La consola del M7 muestra «M7 listo» y luego comienza a enviar datos regularmente; la consola del M4 (o el monitor MicroPython) recibe las líneas «tick 1000», «tick 2000», etc. Los dos núcleos funcionan en paralelo: un bucle while True ocupado en el M4 no interrumpe el latido del M7.
Errores frecuentes
> NO VERIFICADO: la API RPC exacta de MicroPython en el lado del GIGA (los ejemplos oficiales evolucionan con la versión del núcleo); siga la sección «Dual Core» de docs.arduino.cc/hardware/giga-r1-wifi.
- Creer que un solo sketch hace funcionar los dos núcleos: cada núcleo tiene su propio firmware y su propia carga; la documentación oficial describe explícitamente Arduino + MicroPython separados conectados por RPC.
- Biblioteca RPC ausente o inadecuada para la versión del núcleo: actualice «Arduino Mbed OS Giga Boards»; la API exacta en el lado de MicroPython varía con las versiones.
- Memoria compartida mal dimensionada: el M7 posee 192 KB de RAM TCM y hasta 864 KB de SRAM de usuario, el intercambio entre núcleos consume RAM; evite los grandes búferes.
- Confusión con el núcleo Zephyr: el nuevo núcleo ArduinoCore-zephyr utiliza un cargador LLEXT en 0x08040000 y un modelo de carga dinámica diferente del modelo Mbed.
Otros tutoriales para esta placa
Ejemplos de código para esta placa
clignotante.inoArduinobouton.inoArduinorespiration.inoArduinoanalogique.inoArduinodac-onde.inoArduinooled-i2c.inoArduino