Board: yunjia nrf51822
WARNING: This entry will be deprecated. All content has been moved to doc.riot-os.org
The NRF51822 module by Yunjia Technology is a minimalistic but very low-priced module utilizing Nordics NRF51822QFAA SoC. The SoC features 16Kb of RAM, 256Kb of flash ROM and comes on top of the usual micro-controller peripherals with a 2.4GHz radio that supports both Nordics proprietary ShockBurst as well as Bluetooth Low Energy (BLE).
|Timers||3 (2x 16-bit, 1x 32-bit [TIMER0])|
|ADCs||1x 10-bit (8 channels)|
|Vcc||1.8V - 3.6V|
|Datasheet||Datasheet (pdf file)|
|Reference Manual||Reference Manual|
Flashing and Debugging
The Yunjia NRF51822 module comes without any on-board programming and flashing capabilities. It supports however to be programmed using of-the-shelf programmers as Segger's JLink or STM's STLink.
A very simple and affordable way to program and debug the Yunjia module is to the integrated ST-Link/V2 programmer of any STM32Fx-discovery board. The needed steps are described in the following sections. If you want to use a stand-alone ST-Link adapter, you just simply have to alter the wiring to fit for your programmer, the software part is identical.
First of all make sure the your ST-Link device is detected and can be accessed properly. In Linux you might have to adept your
udev rules accordingly:
wget https://raw.githubusercontent.com/texane/stlink/master/49-stlinkv2.rules sudo cp 49-stlinkv2.rules /etc/udev/rules.d/ sudo udevadm control --reload-rules sudo udevadm trigger
now replug the usb cable and flash.
Have a look at the 'Setting up udev rules' section in this README file if you need help.
Second you need to enable the stand-alone ST-Link mode of the discovery board by removing the two
CN2 jumpers, found somewhere in the upper right part of the board. This disconnects the ST-Link programmer from the micro-controller part of the port and enables direct access through the pin-header
CN3, also labled
The Yunjia NRF51822 module supports the Serial Wire Debug (SWD) interface. To access the device the following four lines need to be connected with the STM32x-discovery board:
Yunjia module STM32Fx-discovery common ground: GND <-----------> GND supply voltage: VDD <-----------> 3V SWD clock: SWD <-----------> SWCLK (CN3, pin2) SWD data I/O: SWDIO <-----------> SWDIO (CN3, pin4)
The following image shows the wiring for an STM32F0-discovery board (although not the most beautiful...):
Debugging and programming the Yunjia module works well with OpenOCD.
We suggest to use a fairly recent version, best use the upstream version from their git repository. Version 0.9.0-dev-00148-g3a4ec66 is reported to work.
Programming the Device
To program the Yunjia NRF51822 module, just go to your RIOT application and type:
and voila, the new firmware should be flashed onto your device.
Resetting the Device
As the Yunjia module does not provide a reset button, RIOT includes a target to reset the board. To do that, just type
and your board will reboot.
Debugging the Device
The debugging setup comprises of two parts: a GDB server and a GDB client. To usual workflow is to start the GDB server first and then connect to it with some kind of front-end (e.g. command line, IDE, ...).
To start the GDB server, just type
This will start a local GDB server on
If you are fine with working with the GDB command line client, you can start debugging your device by just typing
in a second terminal window. This will automatically connect to your previously opened GDB server and will also load your corresponding .elf file.
Alternatively you can configure your IDE (e.g. eclipse or similar) to connect directly to the GDB server. See here for more information on how to configure Eclipse
Program the device manually
For OpenOCD to work correctly, you need the following configuration file (which you can also find in
$ cat RIOTDIR/boards/yunjia-nrf51822/openocd.cfg # nRF51822 Target source [find interface/stlink-v2.cfg] transport select hla_swd set WORKAREASIZE 0x4000 source [find target/nrf51.cfg] # use hardware reset, connect under reset #reset_config srst_only srst_nogate
You can now program your device by doing the following:
- start openocd with:
openocd -d3 -f RIOTDIR/boards/yunjia-nrf51822/dist/openocd.cfg
- open a new terminal an connect with telnet:
telnet 127.0.0.1 4444
- do the following steps to flash (only use bank #0 starting from address 0):
> flash banks #0 : nrf51.flash (nrf51) at 0x00000000, size 0x00040000, buswidth 1, chipwidth 1 #1 : nrf51.uicr (nrf51) at 0x10001000, size 0x000000fc, buswidth 1, chipwidth 1 > halt target state: halted target halted due to debug-request, current mode: Thread xPSR: 0x61000000 pc: 0x00000e1a msp: 0x20001b2c > flash write_image erase PATH-TO-YOUR-BINARY/YOUR-BINARY.bin 0 wrote xxx bytes from file PATH-TO-YOUR-BINARY/YOUR-BINARY.bin in xx.yys (x.yyy KiB/s) > reset
First you have to start OpenOCD as described in the section above.
Then enter the following in a new terminal:
$ arm-none-eabi-gdb -tui "<your binary ELF>" (gdb) target remote localhost:3333 Remote debugging using localhost:3333 0x000119ce in ?? () (gdb) load Loading section .text, size 0x2284 lma 0x16000 Loading section .ARM.exidx, size 0x8 lma 0x18284 Loading section .data, size 0x458 lma 0x1828c Loading section .jcr, size 0x4 lma 0x186e4 Transfer rate: x KB/sec, xxxx bytes/write. (gdb) monitor reset halt target state: halted target halted due to debug-request, current mode: Thread xPSR: 0xc1000000 pc: 0x000006d0 msp: 0x000007c0 (gdb) break main Breakpoint 3 at 0x123123: file ../main.c, line xx. (gdb) continue Continuing.
The UART pins are configured in
The default values are PIN 1:
UART_RX and Pin 2:
UART_TX (also compare schematic above).
The BLE400 development board contains a CP2102 accessible through /dev/tty.SLAB_USBtoUART. You have to edit periph_conf.h to use it with UART_RX pin 11 and UART_TX pin 9.
The default Baud rate is
Protected at factory (error writing to flash at address 0x000... )
This step may be executed before the first programming of the board. OpenOCD provides the "nrf51 mass_erase" command to remove the protected flag on the boot-loader region. RIOT does not use the proprietary Nordic "soft-device". This is how to run the mass erase:
- Open two terminal windows.
- In one window, go to the RIOT root folder and run the regarding OpenOCD configuration script with:
openocd -f boards/yunjia-nrf51822/dist/openocd.cfg.
- In the second terminal, connect to the device via telnet:
telnet 127.0.0.1 4444.
- If you are successfully connected via telnet, first type
This should have erased the whole memory of the device.