🛠 Basculer les cœurs de Arm Cortex-M33 à Hazard3 RISC-V avec ARCHSEL
Objectifs
Fonction unique à ce prix : le RP2350 contient deux paires de cœurs — deux Arm Cortex-M33 (Armv8-M, TrustZone-M, DSP, FPU simple précision + coprocesseur double précision) OU deux Hazard3 RISC-V (RV32IMAC) — mais une seule paire tourne à la fois. Le choix se fait via le registre ARCHSEL, suivi d'un reset des cœurs : on bascule donc d'architecture sans ré-alimenter la carte (datasheet RP2350, §1.1 et §3). Ce tuto : compiler le même « hello » pour RISC-V, comprendre le rôle du boot ROM, et mesurer ce que chaque architecture apporte.
Matériel
- 1 × carte RP2350 générique + câble USB data
- pico-sdk 2.x avec la toolchain riscv32 de pico-sdk-tools (« RISC-V quick start » du README pico-sdk)
- Le projet
clignotdu tuto précédent (ouhello_worldde pico-examples)
Commandes complètes
# 1) Toolchain RISC-V dans le PATH
export PATH=$PWD/pico-sdk-tools/bin:$PATH
riscv32-unknown-elf-gcc --version # doit répondre
# 2) Reconfigurer le projet en plateforme RISC-V
cd clignot/build
cmake -DPICO_PLATFORM=rp2350-riscv -DPICO_BOARD=pico2 ..
make -j
# 3) Flash (BOOTSEL ou picotool) puis lire la console
picotool load -x clignot.uf2 # ou drag-and-drop de l'UF2
Côté registre, la bascule à chaud s'écrit en gros :
// archsel.c — demander Hazard3 au prochain reset de cœur
// 1) écrire ARCHSEL=1 (registre de syscfg/PPB selon le datasheet §3)
// 2) déclencher le reset des cœurs : le boot ROM relit ARCHSEL
// et libère la paire RISC-V au lieu de la paire Arm.
//
// à utiliser selon ta version — cherche « ARCHSEL » dans pico-bootrom.
Vérification attendue
Le binaire RISC-V clignote et cause à l'identique : le SDK abstrait l'architecture (PIO, GPIO, USB sont les mêmes périphériques, et les 52 entrées d'interruption sont routées vers les deux architectures). Fais tourner un micro-benchmark (boucle entière dépendante) des deux côtés : le M33 garde l'avantage sur le code C standard (décodeur 16/32 bits, FPU), tandis que le Hazard3 RV32IMAC se défend sur l'empreinte code et la multiplication (extension M). Le passage Arm→RISC-V→Arm se fait à chaud : même alimentation, même flash XIP.
Erreurs fréquentes
- Compiler avec la toolchain ARM et
PICO_PLATFORM=rp2350-riscv: CMake échoue sur le compilateur — la plateforme impose la toolchain riscv32 de pico-sdk-tools. - Croire aux 4 cœurs : ce sont 2 × 2 cœurs, une paire à la fois — ARCHSEL sélectionne l'architecture de la paire, pas cœur par cœur.
- Oublier le reset des cœurs après écriture d'ARCHSEL : sans reset, le boot ROM ne relit pas le registre et rien ne bascule.
- Secure boot et RISC-V s'excluent : la vérification de signature vit sur le chemin de boot Cortex-M33 ; activer le secure boot force les cœurs Arm et désactive RISC-V (datasheet §10) — arbitre avant de signer tes images.
- Compter sur le FPU côté RISC-V : Hazard3 est RV32IMAC, sans extension F — le soft-float pénalise les benchmarks flottants, garde le calcul flottant sur M33.
- 150 MHz des deux côtés : changer d'architecture ne change pas le clock ; ne compare pas RISC-V@150 MHz à un RP2040 overclocké à 200 MHz sans normaliser.
- Pico 2 W en RISC-V : le radio companion se pilote depuis n'importe quelle architecture, mais les exemples réseau du SDK sont écrits pour Arm — prévois de porter.
- Debugger en RISC-V : PICOBOOT fonctionne, mais il faut un OpenOCD compatible Hazard3 — vérifie la version d'outils avant d'investir.
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)
- Pico SDK 2.x sur une carte RP2350 générique : CMake, board header et PICO_BOARD
- 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