Flash nrf52840 con OpenOCD y Black magic probe
Tags: electronic, openocd, arm, arduino
Published: 2020-07-15 20:10:51

---
title: Flash nrf52840 con OpenOCD y Black magic probe
published: true
description: Actualiza el firmware de tus dispositivos por jtag/swd facil con ayuda de OpenOCD y Black magic probe
tags: electronic, openocd, arm, arduino
cover_image: https://dev-to-uploads.s3.amazonaws.com/i/g9vd1ijubf1e2c33dhrd.jpg
---

Hace unos días recibí una gran sorpresa por correo, la nueva placa de [Electronic Cats](https://electroniccats.com) que están por lanzar en un par de semanas, la `Bast BLE` la cual incluye con un chip `nrf52840` de Nordic el cual es una verdadera bestia.

El `nrf52840` esta basado en un ARM Cortex-M4 con FPU corre a un máximo de `64MHz`, cuanta con un Radio de 2.4Ghz compatible con Bluetooth 5 y una larga muy larga lista de características te recomiendo darte una vuelta por el [sitio oficial](https://www.nordicsemi.com/Products/Low-power-short-range-wireless/nRF52840).

La placa que me enviaron aun esta en proceso de desarrollo por lo que es necesario actualizar y probar nuevas versiones del firmware.

# Material

- nrf52840 dev board (yo usare la Bast Ble)
- Black magic probe ([ver mi post anterior](https://dev.to/iddar/crea-un-black-magic-probe-con-un-stm32f103-5gnj))

## Wiring

Dependiendo de tu debbuger el pinout puede cambiar en mi caso usare el Black magic basado en ST de mi post pasado y la `Bast Ble` de la cual encontaras los pines SWD debajo de placa.

![Bast Ble de Electronic cats](https://dev-to-uploads.s3.amazonaws.com/i/o7ha5665w8rwk9b2re8b.jpg)

```
Bast Ble       Black magic
GND             GND
SWDIO           PB14
SWCLK           PA5
POWER           3.3V
```

## Flash

Una vez que tenemos conectado todo podemos ir a la accion para esto es importante tener instalado y en `PATH` el toolchain de ARM en especial `arm-none-eabi-gdb`.

Identifica el puerto de tu debugger en mi caso `ttyACM0`.

```shell
$ arm-none-eabi-gdb
# Con esto entramos a la consola para debug
GNU gdb (GNU Arm Embedded Toolchain)
For help, type "help".
(gdb)
(gdb) target extended-remote /dev/ttyACM0
(gdb) monitor swdp_scan
> Target voltage: 2.9V
> Available Targets:
> No. Att Driver
>   1      Nordic nRF52 M4
>   2      Nordic nRF52 Access Port 
# ctrl + d para salir
```

Con esto verificamos que estemos conectados correctamente, explico un poco los comando de arriba

- `target extended-remote /my-current-port`: con este commando nos conectamos al servidor para debug.
- `monitor swdp_scan`: Con este listamos los dispositivos conectados por SWD, en este caso vemos el `nRF52`

Si todo va bien podemos conectarnos al dispositivo con el siguiente comando

```shell
# donde '1' corresponde al primer dispositivo de la lista
(gdb) attach 1
```
Podemos encontrar la ultima versión del firmwarwe para Bast Ble en el [repositorio oficial](https://github.com/ElectronicCats/ArduinoCore-nRF528x-mbedos/tree/bast_ble) de Electronic Cats, descarga el archivo `HEX` en tu directorio de trabajo.

```shell
wget https://raw.githubusercontent.com/ElectronicCats/ArduinoCore-nRF528x-mbedos/bast_ble/bootloaders/bastble/bast_ble_bootloader-0.3.2.hex
```

grabar el nuevo firmware usaremos la siguiente secuencia de comandos, ejecutando `arm-none-eabi-gdb` desde tu directorio de trabajo.

```shell
(gdb) target extended-remote /dev/debug-port
(gdb) monitor swdp_scan
(gdb) attach 1
(gdb) load bast_ble_bootloader-0.3.2.hex
(gdb) compare-sections
(gdb) mon hard_srst
(gdb) detach
(gdb) kill
```

Listo si todo salio bien solo resta desconectar el cableado y conectar tu Bast Ble por su puerto USB, al arrancar veras que se monta un dispositivo de almacenamiento y se lista un nuevo puerto serial, esto nos indica que todo salio bien ahora.

Ahora puedes usar [adafruit-nrfutil](https://github.com/adafruit/Adafruit_nRF52_nrfutil) o configurar tu arduino IDE siguiendo los pasos mostrados en la documentación de [Electronic Cats](https://github.com/ElectronicCats/ArduinoCore-nRF528x-mbedos/tree/bast_ble)

NOTA: Para programar tu Bast Ble debes presionar dos veces reset para entrar al modo boot.

`Disclaimer: Todas los pruebas mostradas en este articulo fueron realizadas sobre la distribución Ubuntu (GNU/Linux).`