UPDATE (2017-01-24): In my workspace I’m now using SDK 12.2.0, gcc-arm-none-eabi-6_2-2016q4 and Eclipse Neon.2, but these instructions still work.

UPDATE (2018-01-29): In my workspace I’m now using SDK 14.2.0, gcc-arm-none-eabi-7-2017-q4-major and Eclipse Oxygen.2, but these instructions still work with minor changes.

UPDATE (2018-03-08): Finally, Part 2 is available: Starting Development with Nordic nRF5X and GCC on Linux + Eclipse

***

If you plan to start development using Nordic’s nRF51 or nRF52 series you have 3 options: Use Keil, IAR or gcc. The disadvantages of using the first two (at least for me) is that Keil and IAR run only on Windows. I have my development environment fully set on Linux, specifically, my setup is Gnome Ubuntu 14.04.5 64bits and Eclipse Neon.1. So thinking about switching to Windows, using Wine or running a VM are not enjoyable options for me.

This post is strongly based on this post: Development with GCC and Eclipse by Vidar Berg, posted on devzone.nordicsemi.com. Although this post was published almost 2 years ago and has been updated continuously, I’ve decided to create a new post focusing on a current step-by-step guide from scratch.

Now, the list of components required to complete this guide:

  • GNU toolchain for ARM (gcc-arm-none-eabi-5_4-2016q3)
  • GNU Make 3.81
  • nRF5 SDK 12.1.0
  • JLink 6.10g
  • nrfjprog version: 9.0.0
  • Eclipse Neon (Coming post)

This guide will be split into 2 parts: First, a sample project will be built and flashed to the device without using Eclipse . This is for testing that building tools and programming tools are correctly configured. Then, we will configure Eclipse as our IDE for resource indexing, syntax highlighting, targets programming and for debugging.

PART 1:

1.1 GNU toolchain for ARM

GNU toolchain for ARM can be downloaded from here (Update: newer versions of toolchain are found here). After download it, extract it in a folder of your preference (<INSTALL_PATH>) and then add this path to your OS PATH environment variable. Add this line to .bashrc file in /home/$USER directory

$ export PATH=$PATH:<INSTALL_PATH>/gcc-arm-none-eabi-5_4-2016q3/bin

and then execute

$ source ~/.bashrc

To verify that the path is set correctly, type the following in your terminal and check the output:

$ arm-none-eabi-gcc --version
arm-none-eabi-gcc (GNU Tools for ARM Embedded Processors) 5.4.1 20160919 (release) [ARM/embedded-5-branch revision 240496]
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

1.2 GNU make

In most of the cases, Ubuntu-based distros already have installed needed tools to build objects from source code using makefiles. You can check this typing:

$ make -v

In the case that make was not recognized, you can get it executing:

$ sudo apt-get install build-essential checkinstall

1.3 nRF5 SDK 12.1.0

Nordic offers an SDK for development on nRF51 and nRF52 series. This SDK includes a wide set of examples for BLE and ANT. You can get the last version (12.1.0 at 2016-11-09) of this from here (Update: SDK 14.2.0 available here).  Download it and extract it to the folder of your preference.

Then, to correctly build the included examples, you first have to modify Makefile.posix file located in

<SDK_PATH>/components/toolchain/gcc/Makefile.posix

Update value of GNU_INSTALL_ROOT variable to match the toolchain path. For the current set up, it should be (from step 1.1):

GNU_INSTALL_ROOT := <INSTALL_PATH>/gcc-arm-none-eabi-5_4-2016q3/
GNU_VERSION := 5.4.3
GNU_PREFIX := arm-none-eabi

Now we can try building one of the included examples.

1.3.1 Building an example

Examples paths in the SDK have the following structure:

<SDK_PATH>/examples/<CATEGORY>/<EXAMPLE_NAME>/

The content of examples is

<EXAMPLE_NAME>/<BOARD_NAME>/<SOFTDEVICE/BLANK>/armgcc

<BOARD_NAME> refers to which platform or hardware distribution will be used, for example, nRF51 DEVKIT, nRF52DEVKIT, nRF51 Dongle, nRF51 Beacon, etc.

<SOFTDEVICE/BLANK> refers to which softdevice is used or blank if  a softdevice is not needed.

Within armgcc folder, you could find the linker file and the Makefile.

Now we will try to build a simple example, the blinky example using the board PCA10031. Move to

<SDK_PATH>/examples/peripheral/blinky/pca10031/blank/armgcc/

Execute make and check the output:

Makefile:173: Cannot find include folder: ../../../config/blinky_pca10031
Makefile:173: Cannot find include folder: ../../../config
mkdir _build
Assembling file: gcc_startup_nrf51.S
Compiling file: system_nrf51.c
Compiling file: main.c
Compiling file: app_error.c
Compiling file: app_error_weak.c
Compiling file: app_fifo.c
Compiling file: app_timer.c
Compiling file: app_util_platform.c
Compiling file: hardfault_implementation.c
Compiling file: nrf_assert.c
Compiling file: nrf_drv_clock.c
Compiling file: nrf_drv_common.c
Compiling file: nrf_nvic.c
Compiling file: nrf_soc.c
Linking target: _build/nrf51422_xxac.out

text data bss dec hex filename
 2816 112 84 3012 bc4 _build/nrf51422_xxac.out

Preparing: _build/nrf51422_xxac.hex
Preparing: _build/nrf51422_xxac.bin

If your output looks like this, you should have a new _build folder containing the output of the build.

1.4 nrfjprog – Programming tool

nrfjprog is a command-line tool to load firmware to the device through SWD debug interface. It is bundled in nRF5x-Command-Line-Tools. Download it and add nrfjprog folder to PATH variable. nrfjprog needs some resources from J-Link, so it is also needed to download and install J-Link software from here. Be sure to install the version that matches your system, 64-bits in my case. (I put this warning because install the wrong version is a common mistake – I know 3 people that did it while following the guide at Nordic site, me included).

After this you can execute nrfjprog from console. Check version with nrfjprog -v and check the output.

$ nrfjprog -v
nrfjprog version: 9.0.0
JLinkARM.dll version: 6.10g

1.4.1 Programming the example

Now we will program the previously built example. I’m using the nRF51 Dongle (PCA10031). Move to

<SDK_PATH>/examples/peripheral/blinky/pca10031/blank/armgcc/

and execute the following commands and check the output:

$ nrfjprog --family nRF51 -e
Erasing code and UICR flash areas.
Applying system reset.

$ nrfjprog --family nRF51 --program _build/nrf51422_xxac.hex 
Parsing hex file.
Reading flash area to program to guarantee it is erased.
Checking that the area to write is not protected.
Programing device.

$ nrfjprog --family nRF51 -r
Applying system reset.
Run.

If your output is similar to this, congratulations! Now you have set up your workspace to develop nRF5X applications in Linux using gcc and you are able to program devices using nrfjprog. The next step is setting up eclipse  for doing both from the IDE.