24 septembre 2025
Le débogage d’un RP2040, le microcontrôleur du Raspberry Pi Pico, n’est pas trivial. Le guide de démarrage rapide donne quelques pistes et l’architecture nécessaire :
La fondation Raspberry Pi vend une sonde de débogage, nommée Raspbery Pi Debug Probe. Mais si vous avec des Raspberry Pico sous la main et un fer à souder, vous serez plutôt intéressés par la possibilité de réaliser vous-même la sonde.
Le dépôt contenant le code se trouve ici : https://github.com/raspberrypi/debugprobe.git
Le Reademe détaille bien la compilation du code. D’abord récupérer le code :
mkdir debugprobe
cd debugprobe
git clone https://github.com/raspberrypi/debugprobe .
git submodule update --init --recursive
Puis le compiler, presque comme un projet standard. Il faut cependant préciser sur on compile pour Raspberry Pi Pico ou pour la Raspberry Pi Debug Probe. Pour le Pico :
mkdir build
cd build
cmake -DDEBUG_ON_PICO=ON ..
make
Et injection du code avec Pico Tool, dans le répertoire build
sudo picotool load build/debugprobe_on_pico.uf2
Open On-Chip Debugger, le déboguer de puce libre. C’est le logiciel qui s’interface avec la sonde de débogage. La sonde de débogage que nous utilisons est supportée à partir de la version 12. Si vous être dans Debian 13 (Trixie), une installation classique devrait faire l’affaire :
sudo apt install openocd
Sinon, prenez la version de la fondation Raspberry Pi. Dans le répertoire de votre choix
mkdir openocd
cd openocd
git clone https://github.com/raspberrypi/openocd.git .
git submodule sync
git submodule init --recursive
Pour compiler openocd, il vous faudra jimtcl, qui est dans un répertoire de openocd
cd jimtcl
./configure
make
sudo make install
cd ..
Vous pouvez compiler openocd :
./configure
make
sudo make install
Testez pour vous assurer que l’installation s’est bien passée, si vous avez le résultat suivant, vous êtes bon !
$ sudo openocd -f interface/cmsis-dap.cfg -f target/rp2040.cfg -c "adapter speed 5000"
Open On-Chip Debugger 0.12.0+dev-00002-gcd4873400 (2025-09-21-13:58)
Licensed under GNU GPL v2
For bug reports, read
http://openocd.org/doc/doxygen/bugs.html
Info : [rp2040.core0] Hardware thread awareness created
Info : [rp2040.core1] Hardware thread awareness created
adapter speed: 5000 kHz
Info : Listening on port 6666 for tcl connections
Info : Listening on port 4444 for telnet connections
Error: unable to find a matching CMSIS-DAP device
Nous nous servirons d’openocd avec les droits d’administrateur, ajoutez-le à la liste des programmes ’root’ utilisables sans mots de passe. Trouvez où est installé openocd :
$ whereis openocd
openocd: /usr/local/bin/openocd
Lancez visudo :
sudo visudo
Et ajoutez la ligne ci-dessous
%dialout ALL=(ALL) NOPASSWD: /usr/local/bin/openocd
Assurez-vous d’être dans le groupe dialout avec la commande groups :
$ groups
dialout cdrom floppy sudo audio dip video plugdev netdev bluetooth lpadmin scanner
Dans le cas contraire, ajouter votre utilisateur au groupe dialout, un redémarrage peut-être nécessaire pour que la commande prenne effet :
$ sudo adduser $USER dialout
La version dans les dépôts fait très bien l’affaire !
sudo apt install gdb-multiarch
Le Pico cible doit être alimenté, la sonde est alimentée par l’USB. Vous pouvez alimenter la cible par l’USB aussi.
Attention mon_programme.elf doit correspondre avec votre fichier. Notez que Picotool nécessite un fichier .uf2 tandis que openocd prend un fichier .elf.
sudo openocd -f interface/cmsis-dap.cfg -f target/rp2040.cfg -c "adapter speed 5000" -c "program mon_programme.elf verify reset exit"
Videz votre répertoire ’build’ de vote projet, relancez cmake avec l’option de Debug.
cmake -DCMAKE_BUILD_TYPE=Debug ..
make
Flasher votre programme sur la cible.
Lancer openOCD
sudo openocd -f interface/cmsis-dap.cfg -f target/rp2040.cfg -c "adapter speed 5000"
Vous devrez relancer cette commande à chaque fois que vous débranchez votre sonde (debugprobe).
Exécutez gdb en lui donnant en argument le nom de votre programme. Entrez les commandes suivantes pour vous connecter à la cible à travers OpenOCD.
gdb mon_programme.elf
> target remote localhost:3333
> monitor reset init
> continue
Tout d’abord, créons une tâche pour compiler en mode debug. Ajouter dans le fichier task.json la tâche suivante :
,
{
"type": "shell",
"command": "cd debug; cmake -DCMAKE_BUILD_TYPE=Debug ../; make Flash",
"label": "Flash Debug",
"problemMatcher": [],
"group": {
"kind": "build",
"isDefault": false
}
}
Créez le répertoire debug dans votre projet avant de lancer la tâche.
Dans le dossier .vscode de votre projet, créez le fichier launch.json suivant :
{
"version": "0.2.0",
"configurations": [
{
"name": "Pico Debug (Cortex-Debug with external OpenOCD)",
"cwd": "${workspaceRoot}",
"executable": "debug/mon_programme.elf",
"request": "launch",
"type": "cortex-debug",
"servertype": "external",
"gdbTarget": "localhost:3333",
"gdbPath": "gdb-multiarch",
"device": "RP2040",
"svdFile": "${env:PICO_SDK_PATH}/src/rp2040/hardware_regs/RP2040.svd",
"runToEntryPoint": "main",
// Fix for no_flash binaries, where monitor reset halt doesn't do what is expected
// Also works fine for flash binaries
"overrideLaunchCommands": [
"monitor reset init",
"load debug/mon_programme.elf"
]
},
]
}
Adaptez le chemin de "debug/mon_programme.elf" pour le faire correspondre au vôtre.
Si tout c’est bien passé, vous pouvez vous connecter à votre cible en USB, et la flasher avec le programme compilé en debug. Puis brancher votre sonde, lancer le serveur openOCD :
sudo openocd -f interface/cmsis-dap.cfg -f target/rp2040.cfg -c "adapter speed 5000"
Enfin, dans VS Code, appuyez sur F5 (ou allez dans Run -> Start Debugging) et vous débogguer votre cible !