🛠 Dual-core et mise à jour OTA sur la flash 4 Mo
Objetivos
Aprovechar los dos núcleos del RP2350 y la memoria flash de 4 MB: el núcleo 0 gestiona el Wi-Fi (CYW43), el núcleo 1 la lógica de negocio, sincronizados mediante mutex; la actualización OTA descarga un firmware en la zona inactiva de la flash y luego cambia el boot-info para arrancar desde ella, como en el ejemplo oficial pico_w/wifi/ota_update.
Material
- Pico 2 W conectado al Wi-Fi
- pico-sdk (pico_multicore, pico_bootrom, API de flash)
- Servidor HTTP que aloja el nuevo firmware .bin
Código completo
// 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) telecharger firmware.bin en HTTP vers la zone B (flash_range_erase
// puis flash_range_program, hors zone XIP du programme courant)
// 2) verifier taille + checksum
// 3) ecrire un boot-info pointant vers la zone B, puis reinitialiser
firmware_pret = true;
while (true) { sleep_ms(500); }
}
Verificación esperada
Tras una descarga completa y un checksum válido, la placa se reinicia, arranca desde la zona B y la versión mostrada por serie ha cambiado. El núcleo 1 continúa ejecutándose durante la descarga sin corromper lwIP.
Errores frecuentes
- Escribir en la zona XIP de la flash del firmware en ejecución: el programa falla; identifica las direcciones con el archivo .map y picotool.
- Llamar a las API de lwIP desde el núcleo 1: toda la red debe permanecer en el núcleo que gestiona cyw43_arch (bug en MicroPython < 1.25: eventos de Wi-Fi perdidos cuando el núcleo 1 estaba activo).
- Olvidar el checksum antes del cambio: un firmware truncado inutiliza el arranque, mantén el fallback a la zona A.
- No desactivar las interrupciones alrededor de flash_range_program: los datos escritos se corrompen.
Otros tutoriales para esta placa
Ejemplos de código para esta placa
clignotante.pyPythonbouton-interruption.pyPythonpwm-servo.pyPythonlecture-adc.pyPythonneopixel.pyPythonoled-i2c.pyPython