🛠 Pico SDK 2.x sur une carte RP2350 générique : CMake, board header et PICO_BOARD
Objectifs
Le Pico C/C++ SDK (branche 2.x) est l'outil officiel pour exploiter le RP2350 en C : GPIO, PIO, HSTX, double architecture. Piège connu des cartes génériques : le SDK master fournit les en-têtes pico2/pico2_w mais aucun en-tête « generic RP2350 » — soit ta carte est supportée par un dépôt tiers qui fournit son header, soit tu écris le tien (pico-sdk README). Ce tuto : monter un projet CMake propre, cibler PICO_BOARD=pico2 pour une carte compatible Pico-2, et créer un board header minimal pour un module exotique.
Matériel
- 1 × carte RP2350 générique + câble USB data
- pico-sdk 2.x, CMake ≥ 3.13, toolchain arm-none-eabi-gcc (ou riscv32 pour le tuto ARCHSEL)
- pico-examples comme référence de compilation
- Outil picotool pour inspecter l'UF2 produit
Commandes complètes
# 1) Toolchain + SDK (Linux ; sous Windows : WSL ou l'installateur officiel)
git clone https://github.com/raspberrypi/pico-sdk.git --branch master
export PICO_SDK_PATH=$PWD/pico-sdk
# 2) Projet minimal
mkdir clignot && cd clignot
cat > CMakeLists.txt <<'EOF'
cmake_minimum_required(VERSION 3.13)
include($ENV{PICO_SDK_PATH}/pico_sdk_init.cmake)
project(clignot C CXX ASM)
pico_sdk_init
add_executable(clignot main.c)
target_link_libraries(clignot pico_stdlib)
pico_add_extra_executables(clignot) # génère .uf2
EOF
cat > main.c <<'EOF'
#include "pico/stdlib.h"
#define LED 25
int main(void) {
stdio_init_all;
gpio_init(LED); gpio_set_dir(LED, GPIO_OUT);
for (;;) { gpio_put(LED, !gpio_get(LED)); sleep_ms(250); }
}
EOF
# 3) Configurer pour une carte compatible Pico 2, puis compiler
mkdir build && cd build
cmake -DPICO_BOARD=pico2 ..
make -j
picotool info clignot.uf2 # affiche le nom de board embarqué
Board header maison (module générique)
Copie pico-sdk/src/boards/include/boards/pico2.h vers mes_boards/generic_rp2350.h, puis ajuste au brochage de TA carte : #define NUM_BANK0_GPIOS 30 (RP2350A) ou 48 (RP2350B), la broche LED, l'oscillateur 12 MHz, et passe le dossier d'en-têtes à CMake avec -DPICO_BOARD=generic_rp2350 et la variable de recherche d'en-têtes de board.
Vérification attendue
make produit clignot.uf2 ; picotool info affiche « Program information » avec le board pico2. Dépose l'UF2 en mode BOOTSEL : la LED clignote. Le même binaire fonctionne sur toute carte au brochage Pico-2 (PicoPlus2, Tiny2350, etc.) puisque la compatibilité est au niveau board/SDK, pas silicium — le boîtier QFN-60/80 du RP2350 n'est d'ailleurs pas pin-compatible avec le QFN-56 du RP2040.
Erreurs fréquentes
Could not find PICO_BOARD=xxx: le header n'existe ni dans le SDK ni dans tes dossiers — c'est LE problème des cartes génériques ; ajoute le dossier d'en-têtes ou pique le header au dépôt du fabricant (le core Arduino-Pico en embarque un par carte, y compris un « Generic RP2350 »).- Oublier
pico_sdk_initaprèsproject: les fonctionspico_*sont inconnues — l'ordre include/init du SDK 2.x est strict. - Compiler en ARM en croyant cibler RISC-V : par défaut
PICO_PLATFORM=rp2350= Arm Cortex-M33 ; pour Hazard3,PICO_PLATFORM=rp2350-riscv+ toolchain riscv32 de pico-sdk-tools. - UF2 absent du dossier build : il manque
pico_add_extra_executables— sans cette ligne, seul le .bin/.elf existent. - Reprendre un CMakeLists de tutoriel RP2040 pré-SDK 2.0 : le SDK 2.x a réorganisé le bootstrap et les noms de plateformes — pars du template officiel, pas d'un vieux billet de blog.
- Négliger le XOSC 12 MHz dans le header : un board header qui déclare un mauvais crystal donne un timer faux — les
sleep_ms(250)ne durent pas 250 ms. - Oublier que le SDK doit connaître le nombre de GPIO :
NUM_BANK0_GPIOSfaux (30 vs 48) et les broches hautes d'un RP2350B restent inaccessibles.
Autres tutoriels pour cette carte
- Flasher MicroPython sur une carte RP2350 générique et faire clignoter la première LED
- Console série sur RP2350 : USB CDC natif et UART0 de secours
- Lire l'ADC 12 bits et le capteur de température interne du RP2350
- Exploiter les 3 blocs PIO et 12 machines d'état du RP2350 (avec IRQ dédiées)
- Basculer les cœurs de Arm Cortex-M33 à Hazard3 RISC-V avec ARCHSEL
- Secure boot et TrustZone-M sur RP2350 : signer son firmware sans se faire avoir
Exemples de code pour cette carte
clignotante.pyPythonbouton-interruption.pyPythonpwm-servo.pyPythonlecture-adc.pyPythonneopixel.pyPythonoled-i2c.pyPython