🛠 Boot UF2, BOOTSEL et récupération d'une carte « briquée »
Objectifs
Comprendre la chaîne de boot atypique du RP2040 — aucune flash interne : après reset, le bootrom (en ROM, incopiable) charge le firmware soit depuis la flash QSPI externe de 2 Mo (XIP), soit par USB si la broche BOOTSEL est maintenue. Tu apprendras à entrer en mode BOOTSEL, à comprendre le format UF2 (image « sparse » par blocs de 256 octets), et à récupérer une carte dont le programme plante dès le démarrage — le RP2040 ne peut pas être briqué par logiciel sur ce chemin.
Matériel
- 1 × Raspberry Pi Pico + câble micro-USB data
- Un
.uf2de secours (par ex. le blink de ton SDK, ou le firmware MicroPython) - Optionnel : adaptateur SWD (CMSIS-DAP, Pico 2 en debug d'une autre Pico) pour le débogage pas à pas
Code complet
// canary.c — programme volontairement « méchant » à récupérer
// Écrase le vecteur de reset : au prochain boot, plus rien ne démarre
// (sauf BOOTSEL, qui court-circuite la flash !)
#include "pico/stdlib.h"
int main(void) {
// efface la table des vecteurs en tête de flash (zone 0x10000000)
flash_range_erase(0, 4096);
uint32_t junk[64];
for (int i = 0; i < 64; i++) junk[i] = 0xDEADBEEF;
flash_range_program(0, (const uint8_t *)junk, 256);
while (true) { } // le prochain reset partira dans le vide
}
// Rebuild avec pico_stdlib + hardware/flash, flash, laisse le programme
// tourner une fois, reset : la carte est « morte »… jusqu'au BOOTSEL.
Vérification attendue
Après exécution du canari puis reset, la carte ne répond plus (pas de REPL, pas de blink). Maintiens BOOTSEL et rebranche : le lecteur RPI-RP2 réapparaît toujours — le bootrom est intact. Dépose un .uf2 sain : la carte revit. Note : un UF2 mal aligné peut être écrit de façon erratique (errata E14 de la datasheet RP2040) ; si le flash semble aléatoire, re-tente avec un UF2 généré par le SDK.
Erreurs fréquentes
- Croire la carte morte : sans BOOTSEL, un firmware qui plante au boot empêche juste l'application de tourner — le mode masse-storage est dans la ROM, pas dans la flash.
- Maintenir BOOTSEL après le branchement : c'est pendant l'insertion qu'il faut maintenir le bouton.
- Déposer un
.binau lieu d'un.uf2: le glisser-déposer ROM n'accepte que l'UF2 (le.binse flash via SWD/debugprobe). - « RPI-RP2 » jamais vu : câble de charge seule, ou hub USB capricieux — essaie un port direct.
- Confondre reset « RUN » et recovery : après un flash réussi, la carte redémarre seule et le lecteur disparaît ; c'est normal.
- En SWD, oublier que la flash en cours d'écriture gèle le XIP : les deux cœurs attendent, d'où l'utilité de
flash_safe_execute(SDK ≥ 1.5.1).
Autres tutoriels pour cette carte
Exemples de code pour cette carte
clignotante.pyPythonbouton-interruption.pyPythonpwm-servo.pyPythonlecture-adc.pyPythonneopixel.pyPythonoled-i2c.pyPython