nRF51 Blink | mbed | OpenOCD | ST-Link

Otra forma de programar el modulo nRF51 es usando la plataforma de prototipado mbed. Podemos registrar una plataforma de Nordic, ya sea la nRF51822 mKIT o el nRF51 DK, incluso el Dongle, en lo particular no he usado mucho mbed pero para hacer pruebas rapidas viene bien.

nRF51822 mKIT
Como vemos este tiene dos LEDs: LED1 en P0.18 y LED2 en P0.19, además tiene dos botones de usuario, BTN1 en P0.16 y BTN2 en P0.17. Tambien cuenta con perifericos ya mapeados en pines, como el SPI, I2C, entradas analogicas en P0.1 hasta P0.6.

nRF51-DK
Este DK tiene cuatro LEDs, LED1 en P0.21, LED2 en P0.22, LED3 en P0.23 y LED4 en P0.24, este ultimo comparte pin con el Slave Select del SPI0, cuenta con cuatro botones, BTN1 en P0.17, BTN2 en P0.18, BTN3 en P0.19 y BTN4 en P0.20, tambien tiene las mismas entradas analogicas de P0.1 hasta P0.06.

nRF51 Dongle
Este tiene solo un LED RGB, el LED rojo en P0.21, LED verde en P0.22 y LED azul en P0.23 y seis I/O disponibles en uno de los costados. Este último no sirve tanto como los otros dos :/.

Abrimos el compilador online de mbed, elegimos el DK que mas nos convenga, en mi caso el nRF51822mKIT y escribimos el siguiente código en el main.

 #include "mbed.h"

DigitalOut led(LED1); //P0_18 en NRF51822_MKIT

int main() {
    while(1) {
        led = 1; // LED is ON
        wait(0.250); // 250 ms
        led = 0; // LED is OFF
        wait(1); // 750 ms
    }
}
Compilamos y si no tenemos ningún error nos generará un archivo binario, lo guardamos donde mas nos convega.

Y aqui, porfin, la magia del OpenOCD. Conectamos todo como en los posts anteriores, abrimos una consola en la carpeta donde guardamos el .hex, en la consola escribimos lo siguiente:
$openocd -f interface/stlink-v2.cfg -f target/nrf51.cfg
Nos devolverá:
GNU ARM Eclipse 64-bits Open On-Chip Debugger 0.9.0-00073-gdd34716-dirty (2015-05-19-09:55)
Licensed under GNU GPL v2
For bug reports, read
        http://openocd.org/doc/doxygen/bugs.html
Info : auto-selecting first available session transport "hla_swd". To override use 'transport select '.
Info : The selected transport took over low-level target control. The results might differ compared to plain JTAG/SWD
adapter speed: 1000 kHz
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 v23 API v2 SWIM v0 VID 0x0483 PID 0x3748
Info : using stlink api v2
Info : Target voltage: 2.913879
Info : nrf51.cpu: hardware has 4 breakpoints, 2 watchpoints
Ya detecto el nRF51!!!
Abrimos una nueva consola en la misma carpeta e iniciamos un cliente telnet:
$telnet 127.0.0.1 444
Si les dice que no pueden abrirlo usen como alternativa PuTTY o instalen el cliente que por defecto no esta instalado desde Windows 8.1. Ya que nos reconocio escribimos el comando halt y nos retorna:
$halt
target state: halted
target halted due to debug-request, current mode: Thread 
xPSR: 0x21000000 pc: 0x00016420 msp: 0x20003fd0
Escribimos el comando nrf51 mass_erase y enseguida nos devuelve:
$nrf51 mass_erase
nRF51822-QFAA(build code: H0) 256kB Flash
Ahora esta listo para flashear el microcontrolador, escribimos el comando flash write_image erase "elnombredelbinario".hex 0 y una vez terminado de manera correcta reseteamos el nrf51 con el comando reset.
$flash write_image erase Blink.hex 0  
auto erase enabled
Padding image section 0 with 2112 bytes
Padding image section 1 with 3572 bytes
wrote 95232 bytes from file Blinking-Led_NRF51822_.hex in 21.043299s (4.419 KiB/s)
$reset
Este ultimo paso tambien podemos hacerlo con el siguiente comando, program "elnombredelbinario".hex verify reset, este último me parece mas comodo y confiable ya que verifica que se grabo bien el ejecutable y reinicia el nRF51.
$program app.hex verify reset
target state: halted
target halted due to debug-request, current mode: Thread 
xPSR: 0xc1000000 pc: 0x000006d0 msp: 0x000007c0
** Programming Started **
auto erase enabled
using fast async flash loader. This is currently supported
only with ST-Link and CMSIS-DAP. If you have issues, add
"set WORKAREASIZE 0" before sourcing nrf51.cfg to disable it
target state: halted
target halted due to breakpoint, current mode: Thread 
xPSR: 0x61000000 pc: 0x2000001e msp: 0x000007c0
wrote 6144 bytes from file app.hex in 0.561600s (10.684 KiB/s)
** Programming Finished **
** Verify Started **
target state: halted
target halted due to breakpoint, current mode: Thread 
xPSR: 0x61000000 pc: 0x2000002e msp: 0x000007c0
verified 5252 bytes in 0.124800s (41.097 KiB/s)
** Verified OK **
** Resetting Target **
Importante hacer el nrf51 mass_erase despues de el halt!!!. Ponemos un led en el pin que asignamos en mbed y estará parpadeando. Como siempre, esta información la recolecte de internet, en especifico esta la obtuve de:

Icarus-sensors

Comentarios

Entradas más populares de este blog

PSoC Creator Tools

PSoC5LP Usando el SAR ADC y la señal EoS para manejar una LUT