This post is a work in progress (WIP). The result of this experiment is a success. I have flashed my SparkFun nRF52840 mini, and I’m able to run the bicycle combined speed & cadence sensor example.
Before we begin, a big hats off to Charles, who brought support for the SparkFun board I have to the Adafruit nRF52 bootloader. Cheers Charles! I owe you a beer :) – GitHub profile, blog
Important software versions:
nRF SDK: nRF5_SDK_15.3.0_59ac345
ARM GCC: 8.2.1
s340: s340_nrf52_6.1.1
board: SparkFun Pro nRF52840 mini
Rough outline:
1. Checkout charlesportwoodii‘s PR
2. Copy over src/linker/s140_v6.ld to src/linker/s340_v6.ld – there are zero differences between these two files
3. Patch your main.c from the checked out source to initialise the soft device with the ANT_LICENSE_KEY
|
diff –git a/src/main.c b/src/main.c |
|
index 8ac1dba..2e43f49 100644 |
|
— a/src/main.c |
|
+++ b/src/main.c |
|
@@ -301,7 +301,7 @@ static uint32_t softdev_init(bool init_softdevice) |
|
.accuracy = NRF_CLOCK_LF_ACCURACY_250_PPM |
|
}; |
|
|
|
– APP_ERROR_CHECK( sd_softdevice_enable(&clock_cfg, app_error_fault_handler) ); |
|
+ APP_ERROR_CHECK( sd_softdevice_enable(&clock_cfg, app_error_fault_handler, ANT_LICENSE_KEY) ); |
|
sd_nvic_EnableIRQ(SD_EVT_IRQn); |
|
|
|
/*————- Configure BLE params ————-*/ |
4. Patch the Makefile to use the s340 soft device files
|
diff –git a/Makefile b/Makefile |
|
index 6dbaf98..4acd319 100644 |
|
— a/Makefile |
|
+++ b/Makefile |
|
@@ -104,7 +104,7 @@ ifneq ($(IS_52832),) |
|
SD_NAME = s132 |
|
DFU_DEV_REV = 0xADAF |
|
else |
|
–SD_NAME = s140 |
|
+SD_NAME = s340 |
|
DFU_DEV_REV = 52840 |
|
endif |
|
|
|
@@ -275,7 +275,7 @@ CFLAGS += -DNRF52832_XXAA |
|
CFLAGS += -DS132 |
|
else |
|
CFLAGS += -DNRF52840_XXAA |
|
–CFLAGS += -DS140 |
|
+CFLAGS += -DS340 |
|
endif |
|
|
|
|
|
@@ -314,7 +314,7 @@ ASMFLAGS += -DNRF52 |
|
ASMFLAGS += -DS132 |
|
else |
|
ASMFLAGS += -DNRF52840_XXAA |
|
–ASMFLAGS += -DS140 |
|
+ASMFLAGS += -DS340 |
|
endif |
|
|
|
C_SOURCE_FILE_NAMES = $(notdir $(C_SOURCE_FILES)) |
5. Place the contents of the s340 archive (sign up for the evaluation licence from thisisant.com, wait for 1 business day, and then download the s340 soft device)
|
$ tree lib/softdevice/s340_nrf52_6.1.1/ |
|
lib/softdevice/s340_nrf52_6.1.1/ |
|
├── s340_nrf52_6.1.1_API |
|
│ └── include (all header files must be under here) |
|
└── s340_nrf52_6.1.1_softdevice.hex |
6. Flash your nRF52840 device (double reset to enter the DFU mode)
$ make BOARD=sparkfun_pro_nrf52840_mini SERIAL=/dev/tty.usbmodem14301 dfu-flash
7. Verify
When you enter DFU mode after the above command completes, the contents of INFO_UF2.TXT must look something like the contents here:
|
UF2 Bootloader 0.2.10-4-g79fe6cc-dirty lib/nrfx (v1.1.0-1-g096e770) lib/tinyusb (legacy-755-g55874813) s340 6.1.1 |
|
Model: SparkFun Pro nRF52840 Mini |
|
Board-ID: SparkFun-Pro-nRF52840-Mini |
|
Bootloader: s340 6.1.1 |
|
Date: Jul 12 2019 |
Very important – update your app’s linker script:
Since your board now runs the s340 soft device, update the FLASH and RAM values in your app’s linker script:
|
# diff diff ~/developer/em/nRF5_SDK_15.3.0_59ac345/examples/ant/ant_plus/ant_bsc/bsc_tx/pca10040/s212/armgcc/ant_bsc_tx_gcc_nrf52.ld ~/developer/em/bia/src/ant_bsc_tx_gcc_nrf52.ld |
|
8,9c8,9 |
|
< FLASH (rx) : ORIGIN = 0x12000, LENGTH = 0x6e000 |
|
< RAM (rwx) : ORIGIN = 0x20000b80, LENGTH = 0xf480 |
|
— |
|
> FLASH (rx) : ORIGIN = 0x00031000, LENGTH = 0x000F4000-0x00031000 |
|
> RAM (rwx) : ORIGIN = 0x20002000, LENGTH = 0xf480 |
The new values are not black magic. They’re documented here: https://devzone.nordicsemi.com/nordic/short-range-guides/b/getting-started/posts/adjustment-of-ram-and-flash-memory
Resources:
- RAM and FLASH addresses: https://devzone.nordicsemi.com/nordic/short-range-guides/b/getting-started/posts/adjustment-of-ram-and-flash-memory
- MBR and boot loader info from Nordic: https://infocenter.nordicsemi.com/index.jsp?topic=%2Fsds_s132%2FSDS%2Fs1xx%2Fmbr_bootloader%2Fmbr_bootloader.html&cp=3_4_1_0_11
- Reading boot loader settings: https://infocenter.nordicsemi.com/index.jsp?topic=%2Fug_nrfutil%2FUG%2Fnrfutil%2Fnrfutil_settings_generate_display.html&cp=6_5_6
- Usage of MBR params: https://devzone.nordicsemi.com/f/nordic-q-a/22329/mbr-params-page
- Segger J-Link Mini: https://www.adafruit.com/product/3571
Random notes below, don’t follow any of it, or execute any commands from here on out. You’ve been warned.
FLASH and RAM for s340 6.1.1:
S340- 6.1.1
Min RAM start: 0x20002000
Flash start: 0x31000
Generate boot loader settings:
(nrfutil) h2:nrfutil jude$ nrfutil settings generate –family NRF52840 –softdevice ../nRF5_SDK_15.3.0_59ac345/components/softdevice/s112/hex/s112_nrf52_6.1.1_softdevice.hex –bootloader-version 1 –bl-settings-version 1 a.hex
$ git status
|
h2:Adafruit_nRF52_Bootloader jude$ git status |
|
On branch master |
|
Your branch is up to date with 'origin/master'. |
|
|
|
Changes not staged for commit: |
|
(use "git add <file>…" to update what will be committed) |
|
(use "git checkout — <file>…" to discard changes in working directory) |
|
|
|
modified: Makefile |
|
modified: src/main.c |
|
|
|
Untracked files: |
|
(use "git add <file>…" to include in what will be committed) |
|
|
|
lib/softdevice/s340_nrf52_6.1.1/ |
|
src/linker/s340_v6.ld |
|
|
|
no changes added to commit (use "git add" and/or "git commit -a") |
|
h2:Adafruit_nRF52_Bootloader jude$ |