🛠 Bootloader DFU, flash double banque et sauvegarde sur SRAM de sauvegarde
Objectifs
Comprendre la chaîne de démarrage du GIGA R1 et sécuriser vos programmes : récupération par USB DFU quand un sketch brique la carte, organisation de la flash 2 Mo double banque du STM32H747XI, et sauvegarde de compteur ou d'étalonnages dans la SRAM de sauvegarde de 4 Ko maintenue par la broche VRTC. Vous verrez aussi la broche OFF pour la coupure propre de l'alimentation.
Matériel
- 1 carte Arduino GIGA R1 WiFi
- Un PC avec dfu-util (ou le cœur Arduino qui l'appelle automatiquement)
- Optionnel : une pile bouton 3 V sur VRTC pour tester la persistance RTC/SRAM après coupure
Code complet
// GIGA R1 WiFi — compteur persistant dans la SRAM de sauvegarde (4 Ko, maintenue par VRTC)
#include <Arduino.h>
// SRAM de sauvegarde STM32H7 : base 0x38800000 (4 Ko). Accès direct, noyau Mbed.
// En cas de réinitialisation complete (backup domain), la valeur devient 0xFFFFFFFF.
volatile uint32_t* const BKPSRAM = (volatile uint32_t*)0x38800000;
const uint32_t MAGIE = 0x47523158; // "GR1X"
void setup {
Serial.begin(115200);
delay(1500); // laisse le temps d'ouvrir le moniteur
if (BKPSRAM[0] == 0xFFFFFFFF) { // zone vierge : première utilisation
BKPSRAM[0] = MAGIE;
BKPSRAM[1] = 0;
Serial.println("SRAM de sauvegarde initialisee");
}
if (BKPSRAM[0] != MAGIE) {
Serial.println("Sauvegarde invalide (backup domain réinitialise)");
return;
}
BKPSRAM[1]++; // incrementation a chaque démarrage
Serial.print("Nombre de demarrages : ");
Serial.println(BKPSRAM[1]);
Serial.println("Couperez l'alimentation : la valeur doit survivre (VRTC/pile)");
}
void loop { }
Récupération DFU : si un sketch empêche le téléversement, faites un « touch » à 1200 bauds sur le port série (ou maintenez le bouton BOOT selon la carte hôte) pour entrer dans le bootloader — il apparaît alors avec le PID 0x0366 au lieu de 0x0666 (VID 0x2341) — puis dfu-util -a 0 -s 0x08040000:leave -D sketch.bin. Sur le cœur Zephyr, le chargeur réside à 0x08040000 et les sketches sont chargés par-dessus via LLEXT.
Vérification attendue
Après plusieurs réinitialisations, le compteur augmente à chaque démarrage. Après débranchement complet du USB (avec pile sur VRTC), la valeur est conservée ; sans pile, la SRAM de sauvegarde peut être perdue et le message « sauvegarde invalide » apparaît. En mode récupération, l'explorateur USB montre un périphérique 2341:0366 et dfu-util liste la carte.
Erreurs fréquentes
- Écrire dans la SRAM de sauvegarde sans alimenter VRTC : les données disparaissent à la coupure d'alimentation, ce qui n'est pas un bug du code.
- Écraser la zone du chargeur Zephyr (0x08040000) en DFU manuel : reflasher le chargeur ou refaire un premier téléversement Arduino (core ≥ 0.90.0 l'installe automatiquement).
- Confondre les PID : 0x0666 = application, 0x0366 = bootloader ; un mauvais ciblage dfu-util échoue proprement.
- Supposer la flash effaçable octet par octet : la flash se gère en pages/seteurs ; pour de la journalisation fréquente, préférez la SRAM de sauvegarde ou un stockage externe.
- Utiliser la broche OFF sans comprendre : relier OFF à la masse force l'arrêt complet de la carte (shutdown), il faut alors un appui sur reset ou rebrancher.
Autres tutoriels pour cette carte
Exemples de code pour cette carte
clignotante.inoArduinobouton.inoArduinorespiration.inoArduinoanalogique.inoArduinodac-onde.inoArduinooled-i2c.inoArduino