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.

# Téléchargement des sources avec Git
git clone https://github.com/blacksphere/blackmagic

# Compilation des sources
cd blackmagic
make 
cd src
make PROBE_HOST=swlink clean
make PROBE_HOST=swlink 

file black*elf
blackmagic_dfu.elf: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), statically linked, with debug_info, not stripped
blackmagic.elf:     ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), statically linked, with debug_info, not stripped
Compilation de BlackMagic

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

(sudo) dfu-util -a 0 -s 0x08002000:leave:force -D blackmagic.bin

dfu-util 0.9

Copyright 2005-2009 Weston Schmidt, Harald Welte and OpenMoko Inc.
Copyright 2010-2016 Tormod Volden and Stefan Schmidt
This program is Free Software and has ABSOLUTELY NO WARRANTY
Please report bugs to http://sourceforge.net/p/dfu-util/tickets/

dfu-util: Invalid DFU suffix signature
dfu-util: A valid DFU suffix will be required in a future dfu-util release!!!
Opening DFU capable USB device...
ID 1d50:6017
Run-time device DFU version 011a
Claiming USB DFU Interface...
Setting Alternate Setting #0 ...
Determining device status: state = dfuIDLE, status = 0
dfuIDLE, continuing
DFU mode device DFU version 011a
Device returned transfer size 1024
DfuSe interface name: "Internal Flash   "
Downloading to address = 0x08002000, size = 88960
Download	[=========================] 100%        88960 bytes
Download done.
File downloaded successfully
Transitioning to dfuMANIFEST state
Utilisation de dfu-utils pour uploader le firmware BMP sur la BluePill

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 !