Skip to content

Instantly share code, notes, and snippets.

What would you like to do?

BLE Nano and the nRF51822 SDK

If you've tried using the nRF51822 SDK with the BLE Nano (after following the RedBearLab guide) you may have come to a dead end.

Even the simplest examples didn't work for me. I assumed I had a dead Nano (despite the upload process seeming to work fine).

The reason turned out to be that the latest SDK versions assume you have a nRF51822 chip with 32KB of RAM rather than the 16KB that the nRF51822 on the Nano has.

James Willcox explains this in a post to the RedBearLab BLE Nano support forum.

The details are rather brief there, so here is a walk through of getting things working on Ubuntu. Things should be almost identical on Mac OS X.

Download the latest nRF51 SDK from Nordic (choose the zip file that does not end in

Then install it:

$ cd
$ unzip ~/Downloads/
$ NRF51_SDK=$HOME/nRF51_SDK_8.0.0_5fc2c3a

Install James Willcox's custom board file:

$ cd $NRF51_SDK
$ cd examples/bsp
$ curl --output custom_board.h

Now an example of adjusting the Makefile and loader script of the standard heart rate sensor example and getting things to build:

$ cd $NRF51_SDK
$ cd examples/ble_peripheral/ble_app_hrs/pca10028/s110/armgcc
$ vi Makefile
Find `CFLAGS += -DBOARD_PCA10028` and change `BOARD_PCA10028` to `BOARD_CUSTOM` and save.
$ ls *.ld
$ vi ble_app_hrs_gcc_nrf51.ld
Find `RAM (rwx) :  ORIGIN = 0x20002000, LENGTH = 0x6000` and change `LENGTH = 0x6000` to `LENGTH = 0x2000` and save.
$ make all

Now upload the result to your Nano:

$ cd _build
$ SOFTDEVICE=$NRF51_SDK/components/softdevice/s110/hex/s110_softdevice.hex
$ OUTPUT=output.hex
$ ls *.hex
$ INPUT=nrf51422_xxac_s110.hex
$ srec_cat $SOFTDEVICE -intel $INPUT -intel -o $OUTPUT -intel --line-length=44
$ cp $OUTPUT /media/$USER/MBED

Note: on Mac OS X you may need to change the mount options for the Nano and use the -X flag for the cp step, as discussed in this support forum post.

The above assumes you already have the "GNU Tools for ARM Embedded Processors" installed.

On Ubuntu the easiest way to do this is to use Terry Guo's PPA.

And you also need srec_cat installed, on Ubuntu this just requires:

$ sudo apt-get install srecord
Copy link

electronut commented Jun 16, 2015

Thank you so much for writing this up!

Copy link

peetonn commented Jun 26, 2015

thanks a lot!! it finally works!

Copy link

jrobeson commented Jul 29, 2015

the curl command redirects, and curl doesn't implicitly follow redirects. I'd suggest adding the --location flag to it, otherwise you end up with an html file

Copy link

jrobeson commented Jul 29, 2015

what's the correct RAM values for the other softdevice versions?

Copy link

xcottos commented Aug 16, 2015

Very nice job!

It works with nRF51_SDK_9 and s110, however I wasn't able to make it work with s130 are the RAM values different?

Copy link

xcottos commented Aug 16, 2015

Hi all,

thanks to this post:

I found the RAM value for working with s130 that is:

RAM (rwx) : ORIGIN = 0x20002800, LENGTH = 0x1800

I successfully compiled and executed the ble_app_beacon example with s130 and SDK version 9

hope that helps


Copy link

holla2040 commented Aug 21, 2015

yeah! thanks for the great info. It all makes sense.

Did you happen to struggle through getting DFU/FOTA running as well for the nano at 16K?

Copy link

maayanH commented May 31, 2016

Great! I had some troubles until I found this helpful guide.
Thanks! :)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment