🛠 Boot UF2, BOOTSEL et récupération d'une carte « briquée »
Objetivos
Comprender la cadena de arranque atípica del RP2040 — sin flash interna: tras el reinicio, el bootrom (en ROM, inmutable) carga el firmware ya sea desde la flash QSPI externa de 2 MB (XIP), o por USB si el pin BOOTSEL se mantiene presionado. Aprenderás a entrar en modo BOOTSEL, a comprender el formato UF2 (imagen «sparse» por bloques de 256 bytes) y a recuperar una tarjeta cuyo programa falla desde el arranque — el RP2040 no puede quedar inutilizado por software en este camino.
Material
- 1 × Raspberry Pi Pico + cable micro-USB de datos
- Un
.uf2de respaldo (por ejemplo, el blink de tu SDK, o el firmware MicroPython) - Opcional: adaptador SWD (CMSIS-DAP, Pico 2 en depuración desde otra Pico) para la depuración paso a paso
Código completo
// 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.
Verificación esperada
Tras ejecutar el canario y reiniciar, la tarjeta deja de responder (sin REPL, sin blink). Mantén presionado BOOTSEL y vuelve a conectar: la unidad RPI-RP2 reaparece siempre — el bootrom está intacto. Coloca un .uf2 válido: la tarjeta revive. Nota: un UF2 mal alineado puede escribirse de forma errática (errata E14 de la hoja de datos del RP2040); si el flash parece aleatorio, reintenta con un UF2 generado por el SDK.
Errores frecuentes
- Creer que la tarjeta está muerta: sin BOOTSEL, un firmware que falla al arrancar solo impide que la aplicación se ejecute — el modo de almacenamiento masivo está en la ROM, no en la flash.
- Mantener BOOTSEL después de conectar: es durante la inserción cuando se debe mantener presionado el botón.
- Colocar un
.binen lugar de un.uf2: la ROM de arrastre y suelta solo acepta UF2 (el.binse programa vía SWD/debugprobe). - No ver nunca «RPI-RP2»: cable solo de carga, o un hub USB caprichoso — prueba con un puerto directo.
- Confundir el reinicio «RUN» con la recuperación: tras un flash exitoso, la tarjeta se reinicia sola y la unidad desaparece; esto es normal.
- En SWD, olvidar que la flash durante la escritura congela el XIP: ambos núcleos esperan, de ahí la utilidad de
flash_safe_execute(SDK ≥ 1.5.1).
Otros tutoriales para esta placa
Ejemplos de código para esta placa
clignotante.pyPythonbouton-interruption.pyPythonpwm-servo.pyPythonlecture-adc.pyPythonneopixel.pyPythonoled-i2c.pyPython