🛠 Dual-core et mise à jour OTA sur la flash 4 Mo
Objectifs
Exploiter les deux coeurs du RP2350 et la flash 4 Mo : le coeur 0 gere le Wi-Fi (CYW43), le coeur 1 le metier, synchronises par mutex ; la mise à jour OTA télécharge un firmware dans la zone inactive de la flash puis bascule le boot-info pour démarrer dessus, comme l'exemple officiel pico_w/wifi/ota_update.
Matériel
- Pico 2 W connectee au Wi-Fi
- pico-sdk (pico_multicore, pico_bootrom, flash API)
- Serveur HTTP hebergeant le nouveau firmware .bin
Code complet
// main.c - dual-core + squelette OTA (inspiré pico_w/wifi/ota_update)
#include "pico/stdlib.h"
#include "pico/multicore.h"
#include "pico/cyw43_arch.h"
#include "pico/bootrom.h"
static volatile bool firmware_pret = false;
void coeur_metier(void) { // coeur 1 : logique, jamais de lwIP ici
while (true) {
if (firmware_pret) {
rom_data_call(ROM_TABLE_ENTRY_RESET_TO_BOOTLOADER, 0);
}
sleep_ms(100);
}
}
int main(void) {
stdio_init_all;
if (cyw43_arch_init) { return 1; } // Wi-Fi sur coeur 0
cyw43_arch_enable_sta_mode;
cyw43_arch_wifi_connect_timeout_ms(
"mon_ssid", "mon_mot_de_passe", CYW43_AUTH_WPA2_AES_PSK, 30000);
multicore_launch_core1(coeur_metier);
// 1) télécharger firmware.bin en HTTP vers la zone B (flash_range_erase
// puis flash_range_program, hors zone XIP du programme courant)
// 2) vérifier taille + checksum
// 3) écrire un boot-info pointant vers la zone B, puis réinitialiser
firmware_pret = true;
while (true) { sleep_ms(500); }
}
Vérification attendue
Après téléchargement complet et checksum valide, la carte réinitialise, démarre sur la zone B et la version affichée en série a changé. Le coeur 1 continue de tourner pendant le téléchargement sans corrompre lwIP.
Erreurs fréquentes
- Écrire dans la flash la zone XIP du firmware en cours d'exécution : le programme plante ; repérer les adresses avec le .map et picotool.
- Appeler les API lwIP depuis le coeur 1 : tout le réseau doit rester sur le coeur qui porte cyw43_arch (bug MicroPython < 1.25 : événements Wi-Fi perdus quand le coeur 1 tournait).
- Oublier le checksum avant bascule : un firmware tronque brique le démarrage, garder le fallback zone A.
- Ne pas desactiver les interruptions autour de flash_range_program : les données ecrites sont corrompues.
Autres tutoriels pour cette carte
Exemples de code pour cette carte
clignotante.pyPythonbouton-interruption.pyPythonpwm-servo.pyPythonlecture-adc.pyPythonneopixel.pyPythonoled-i2c.pyPython