Qu'est-ce que Black Magic Probe (BPM)
Pour faire simple, Black Magic Probe (BPM) est une application open-source, qui permet d'utiliser les cartes "low cost" BluePill (ou d'autres) pour flasher et debugger en JTAG / SWD
En bonus, BMP fournit aussi un adaptateur usb-serie supplémentaire intégré, ce qui permet de réaliser toutes les tâches (flash, debug, connexion UART) avec un seul adaptateur BMP (fini l'adaptateur usb-serie en complément de l'interface JTAG)
Pour information, BMP implémente directement le protocole de debuggage de GDB, ce qui permet de se passer d'OpenOcd.
Cet article détaille les procédures pour compiler et installer BMP sur une carte BluePill.
Compiler BMP depuis les sources
Pré-requis: Les applications git, arm-toolchain, dfu-utils sont déja installées sur votre système.
Si vous rencontrez l'erreur suivante:
target/kinetis.c:459:17: error: 'kl_gen_command' reading 8 bytes from a region of size 4 [-Werror=stringop-overread]
459 | kl_gen_command(f->t, FTFA_CMD_PROGRAM_LONGWORD,
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
460 | FLASH_SECURITY_BYTE_ADDRESS, (uint8_t*)&val);
Essayez avec:
CFLAGS="-Wno-error=stringop-overread" make PROBE_HOST=swlink
Normalement, les fichers blackmagic_dfu.hex (bootloader) et blackmagic.hex(firmware BMP), on bien été compilés.
Flasher le bootloader BMP sur la Bluepill
Vous aurez besoin d'une interface ST-Link pour flasher le firmware BMP sur votre BluePill.
- On commence par connecter le ST-Link à la BluePill
- On crée un fichier "/tmp/flash-bluepill.cfg" contenant les commandes openocd
cat << EOF > /tmp/flash-bluepill.cfg
set CHIPNAME STM32F103C8T6
source [find interface/stlink-v2.cfg]
transport select hla_swd
source [find target/stm32f1x.cfg]
set WORKAREASIZE 0x2000
EOF
- On flashe le bootloader BMP DFU sur la BluePill
/!\ Avant de lancer la compande openocd suivante, il faut presser le bouton RESET /!\
(sudo) openocd -f /tmp/flash-bluepill.cfg -c 'init_reset halt; program blackmagic_dfu.bin 0x8000000 verify; reset;exit'
Open On-Chip Debugger 0.10.0
Licensed under GNU GPL v2
For bug reports, read
http://openocd.org/doc/doxygen/bugs.html
Info : The selected transport took over low-level target control. The results might differ compared to plain JTAG/SWD
adapter speed: 1000 kHz
adapter_nsrst_delay: 100
none separate
0x2000
Info : Unable to match requested speed 1000 kHz, using 950 kHz
Info : Unable to match requested speed 1000 kHz, using 950 kHz
Info : clock speed 950 kHz
Info : STLINK v2 JTAG v36 API v2 SWIM v7 VID 0x0483 PID 0x3748
Info : using stlink api v2
Info : Target voltage: 3.168932
Info : STM32F103C8T6.cpu: hardware has 6 breakpoints, 4 watchpoints
target halted due to debug-request, current mode: Thread
xPSR: 0x01000000 pc: 0x080014d0 msp: 0x20005000
** Programming Started **
auto erase enabled
Info : device id = 0x20036410
Info : flash size = 128kbytes
target halted due to breakpoint, current mode: Thread
xPSR: 0x61000000 pc: 0x2000003a msp: 0x20005000
wrote 8192 bytes from file blackmagic_dfu.bin in 0.507101s (15.776 KiB/s)
** Programming Finished **
** Verify Started **
target halted due to breakpoint, current mode: Thread
xPSR: 0x61000000 pc: 0x2000002e msp: 0x20005000
verified 7372 bytes in 0.129168s (55.735 KiB/s)
** Verified OK **
Ok, le bootloader est bien uploadé sur la carte BluePill.
Vous pouvez maintenant déconnecter le ST-Link et connecter la BluePill en USB sur votre PC
- Erreur "Warn : UNEXPECTED idcode: 0x2ba01477"
Certaines cartes Bluepill sont équipées de chipset STM32 "clones", qui ont un ID Cpu différent.
Dans ce cas, il faudra adapter le fichier flash-bluepill.txt en ajoutant la ligne "set CPUTAPID 0x2ba01477", avant de flasher.
set CHIPNAME STM32F103C8T6
source [find interface/stlink-v2.cfg]
transport select hla_swd
set CPUTAPID 0x2ba01477
source [find target/stm32f1x.cfg]
set WORKAREASIZE 0x2000
Flasher le firmware BMP via le bootloader
Le firmware BMP a bien été flashé sur la BluePill.
/!\ Débrancher et rebrancher le cordon USB de la BluePill pour que toutes les interfaces USB BMP soient détectées par votre PC /!\
$ lsusb | grep -i Black
Bus 001 Device 064: ID 1d50:6018 OpenMoko, Inc. Black Magic Debug Probe (Application)
Connexion BMP vers SWD target
Exemple de connexion de l'interface BMP (BluePill en haut) pour programmer une autre carte Bluepill (en bas)
BlackMagic | SWD TARGET |
---|---|
GND | GND |
SWDIO (from 4pin headers) | SWDIO (to 4pin headers) |
SWCLK (from 4pin headers) | SWCLK (from 4pin headers) |
3.3v Power (from 4pin headers) | 3.3V Power(from 4pin headers) |
UART TX (PB6) | UART RX (PA10 for bluepill target) |
UART RX (PB7) | UART TX (PA9 for bluepill target) |
BlackMagic en mode "Hosted"
Il est aussi possible d'utiliser BlackMagick en mode "hosted". Même si c'est plutôt réservé à des utilisateurs avertis, c'est bien de connaitre son existence.
Dans ce mode, l'interface BMP est utilisé comme un simple 'passe-plat': elle se contente d'envoyer les trames JTAG/SWD à la target.
C'est le binaire "src/blackmagic", une fois lancé depuis le PC, qui s'occupe de gérer les protocoles de communication JTAG/SWD, et envoie les trames bas niveau à l'interface.
Ce mode est très utile pour le debug, ou pour ajouter le support de nouveaux contrôleurs.
- Compilation de BMP hosted:
make
cd src
make PROBE_HOST=hosted clean
make PROBE_HOST=hosted
- Exécution de BMP hosted en mode test
$ ./blackmagic -t
INFO: Open USB 0489:e0a2 class e0 failed
BMP hosted v1.7.1-137-gf89b07d
for ST-Link V2/3, CMSIS_DAP, JLINK and LIBFTDI/MPSSE
Using 1d50:6018 5396DBBB Black Sphere Technologies
Black Magic Probe (SWLINK) v1.7.1-194-g8089e05
Running in Test Mode
Target voltage: Volt
Speed set to 3.2727 MHz for SWD
DPIDR 0x1ba01477 (v1 rev1)
RESET_SEQ failed
AP 0: IDR=14770011 CFG=00000000 BASE=e00ff003 CSW=23000040 (AHB-AP var1 rev1)
ROM: Table BASE=0xe00ff000 SYSMEM=0x00000001, designer 20 Partno 410
0 0xe000e000: Generic IP component - Cortex-M3 SCS (System Control Space) (PIDR = 0x04001bb000 DEVTYPE = 0x00 ARCHID = 0x0000)-> cortexm_probe
CPUID 0x411fc231 (M3 var 1 rev 1)
Halt via DHCSR: success 01030003 after 1ms
1 0xe0001000: Generic IP component - Cortex-M3 DWT (Data Watchpoint and Trace) (PIDR = 0x04001bb002 DEVTYPE = 0x00 ARCHID = 0x0000)
2 0xe0002000: Generic IP component - Cortex-M3 FBP (Flash Patch and Breakpoint) (PIDR = 0x04000bb003 DEVTYPE = 0x00 ARCHID = 0x0000)
3 0xe0000000: Generic IP component - Cortex-M3 ITM (Instrumentation Trace Module) (PIDR = 0x04001bb001 DEVTYPE = 0x00 ARCHID = 0x0000)
4 0xe0040000: Debug component - Cortex-M3 TPIU (Trace Port Interface Unit) (PIDR = 0x04001bb923 DEVTYPE = 0x11 ARCHID = 0x0000)
5 Entry 0xfff42002 -> Not present
ROM: Table END
*** 1 STM32F1 medium density M3
RAM Start: 0x20000000 length = 0x5000
Flash Start: 0x08000000 length = 0x20000 blocksize 0x400
Conclusion
BlackMagic permet de transformer une simple carte BluePill a 2€ en un flasher/debugger JTAG.
Et vous avec une interface usb-serie intégrée en bonus !