nRF52840 - Nordic製SoC 開発環境構築（Segger Embedded Studio）

# 使用機器

今回はBluetooth機能を持った[Nordic nRF52840](https://www.nordicsemi.com/Products/nRF52840?lang=ja-JP)を搭載した村田製作所の[Type2AB evaluation board](https://www.murata.com/ja-jp/products/connectivitymodule/ultra-wide-band/qorvo#evalutation-kit)を使用。  
BLEの検証でセントラル、ペリフェラル用に2台使用。  
UWBチップが載ったボードだが、今回はUWBには触れない。

ソフトの書き込みにJ-Linkを使用。


# IDE

Nordic製チップの開発において無料で利用可能なSegger Embedded Studioを使用。  
（STMicroelectronics製チップの開発を行う場合は、無料で利用可能なSTM32CubeIDEが良さそう。）  

Segger Embedded Studioは、[こちら](https://www.segger.com/downloads/embedded-studio/)から`Embedded Studio for ARM`をダウンロード&インストール。  
また、J-Link用に[こちら](https://www.segger.com/downloads/jlink/#J-LinkSoftwareAndDocumentationPack)から`J-Link Software and Documentation Pack`をダウンロード&インストール。

# SDK

ソフトウェア開発にはnRF5 SDKを利用する。  
[こちら](https://www.nordicsemi.com/Products/Development-software/nrf5-sdk/download#infotabs)からダウンロード。  今回は、バージョン16.0を使用。  
以下SDKのフォルダ構成  

```
nRF5SDK160098a08e2/
  │
  ├─ components/
  ├─ config/
  ├─ documentation/
  ├─ examples/  # サンプルコード
  ├─ external/
  ├─ external_tools/
  ├─ integration/
  ├─ modules/
  ├─ license.txt
  ├─ nRF_MDK_8_27_0_IAR_NordicLicense.msi
  └─ nRF_MDK_8_27_0_Keil4_NordicLicense.msi
```

## サンプルコード

`examples`フォルダに各種サンプルコードがあるので、これらをベースに開発を進めるのが良い。  
nRF5 SDKバージョン16.0 サンプルコードのドキュメントは[こちら](https://infocenter.nordicsemi.com/index.jsp?topic=%2Fcom.nordic.infocenter.sdk5.v15.0.0%2Fexamples.html)。  

今回は、BLE機能の検証に、最も単純と思われるBLE Blinkyアプリケーションのサンプルを使用。  
このサンプルでは、  
ペリフェラルはアドバタイズを送信、セントラルはアドバタイズをスキャンし接続を確立する。  
その後、ペリフェラル側のボタン状態（ボタン押下により変化）をセントラルに送信し、セントラル側のLEDが変化する。  

- セントラル側コード：`examples/ble_central/ble_app_blinky_c`  
- ペリフェラル側コード：`examples/ble_peripheral/ble_app_blinky`  

以下サンプルコードのフォルダ構成

```
nRF5SDK160098a08e2/
  │
  ├─ components/
  ├─ config/
  ├─ documentation/
  ├─ examples/  # サンプルコード
  …     │
        …
        └─ ble_central/
              │
              …
              ├─ ble_app_blinky_c
              …       │
                      …
                      ├─ pca10040         # Nordic製開発ボードの種類
                      └─ pca10056         # 同じチップが載った開発ボードのフォルダを選択
                            └─ s140       # SoftDeviceの種類
                                 ├─ arm4  # 開発環境の種類
                                 …     
                                 └─ ses   # Segger Embedded Studio
                                     │
                                     ├─ ble_app_blinky_c_pca10056_s140.emProject  # プロジェクトファイル
                                     ├─ ble_app_blinky_c_pca10056_s140.emSession  # プロジェクトのセッション情報
                                     └─ flash_placement.xml                       # ソフトウェアのセクション情報  
```

使用するチップ、機能、開発環境に応じて開くプロジェクトファイルを選択する必要がある。SoftDeviceについては後述。  
プロジェクトファイル`ble_app_blinky_c_pca10056_s140.emProject`をダブルクリックすると、Segger Embedded Studioが起動する。  
起動した際に、ライセンス認証を求めるウィンドウが立ち上がったため、[こちら](https://qiita.com/Kosuke_Matsui/items/5d61ce77e928b9f117cc#%E8%BF%BD%E8%A8%982022%E5%B9%B44%E6%9C%8828%E6%97%A5)を参考に登録を行った。

## プロジェクト構成

以下画像はプロジェクト構成であるが、実際のフォルダ構成ではなく、  
プロジェクトに対してフォルダを作成 / ファイル登録したもので、プロジェクトファイルに情報が保存されている。  
![2023-01-28-14-14-13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695430/b7886ba4-9290-09a8-a47b-4056832d518a.png)

サンプルコードを別の場所にコピーした場合、プロジェクトファイルに保存されたパス情報が異なるためビルドは通らない。  
今回は、`examples`と同列に`src`フォルダを作成し、使用するサンプルコード`ble_central/ble_app_blinky_c`をコピーして使用。  
不要な開発ボード/SoftDevice/開発環境用のフォルダは削除。  

### 環境変数、includeパス設定

プロジェクト名右クリック → Options → 対象をCommonに変更 → preprocessor  
 → Preprocessor Definitions  
 → User Include Directories  
![2023-01-28-14-35-08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695430/c6d823d3-ca2c-e990-876a-5f682b4cbfdf.png)

プロジェクトファイル内の`c_preprocessor_definitions`、`c_user_include_directories`に保存されているため、直に編集も可能。

## SoftDevice

[BLE Blinkyアプリケーションのドキュメント](https://infocenter.nordicsemi.com/index.jsp?topic=%2Fcom.nordic.infocenter.sdk5.v15.0.0%2Fexamples.html)にも以下のように記載されているが、  
BLE機能を使う場合、SoftDeviceを別途書き込む必要がある。書き込み方法については後述。

```
Important: Before you run this example, make sure to program the SoftDevice.
```

使用するSoftDeviceは、使用するチップと機能によって選択する。[こちら](https://infocenter.nordicsemi.com/index.jsp?topic=%2Fug_gsg_ses%2FUG%2Fgsg%2Fsoftdevices.html)参照。  
以下SoftDeviceのフォルダ構成。バイナリのみ提供されている。

```
nRF5SDK160098a08e2/
  │
  ├─ components/
  …     │
        …
        └─ softdevice/
              │
              …
              ├─ s132  # SoftDeviceの種類
              └─ s140
                   │
                   …
                   └─ hex # SoftDeviceのバイナリ
```

## ピンアサイン設定

今回Nordic公式開発ボード`pca10056`用のソースコードを使用しているため、  
実際に使用するボードのピンアサインに変更する必要がある。  

ピンアサイン設定は、`nRF5SDK160098a08e2/components/boards/pca10056.h`にある。  
このファイルを編集することもできるが、  
`custom_board.h`を作成し、独自のピンアサイン設定を行うことができる。  

`nRF5SDK160098a08e2/components/boards/boards.h`に以下の実装がある。  

```c:boards.h
#if defined(BOARD_NRF6310)
  #include "nrf6310.h"
#elif defined(BOARD_PCA10000)
  #include "pca10000.h"
// 
// 省略
//
#elif defined(BOARD_PCA10056)
  #include "pca10056.h"
// 
// 省略
//
#elif defined(BOARD_CUSTOM)
  #include "custom_board.h"
#else
#error "Board is not defined"
```

`custom_board.h`を参照させるために、  
環境変数から`BOARD_PCA10056`を削除し、`BOARD_CUSTOM`を追加する。  

# ソフト書き込み

## J-Link接続

![2023-01-28-15-36-49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695430/809721cf-06c1-917a-2bbd-0a6810499001.png)
[J-Linkのピンアサイン](https://www.embitek.co.jp/technote/jlink/EUM_JP_JLink-Adapter.pdf)は、  
当然以下J-Link本体のピンアサインを示している。  
![2023-01-28-15-38-04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695430/ed52f855-9eec-33b1-125c-4589e4024b64.png)

J-Link付属のフラットケーブルを使用する場合、  
フラットケーブルのコネクタも同じ形状をしているが、上記ピンアサインとは同じにはならない。  
フラットケーブルの色が付いているほうが1PIN。
![2023-01-28-15-43-08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695430/dba36caf-15b0-9077-0e8e-00280498768b.png)

## SoftDevice書き込み

SoftDeviceは元々書き込まれている場合もある。  
SoftDeviceが書き込まれていることを確認するためにnRF Connect for Desktopを[こちら](https://www.nordicsemi.com/Products/Development-tools/nrf-connect-for-desktop/download#infotabs)からダウンロード&インストールした。
![2023-01-28-15-46-17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695430/25f05dea-7c23-9f67-111b-9e0f62fd6c31.png)

ProgrammerをインストールしてOpen。SELECT DEVICEから接続しているデバイスを選択。  
以下のようにSoftDeviceが書き込まれていることが確認できる。
![2023-01-28-15-48-01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695430/16153fb7-9824-e58f-c968-ae680376f07e.png)

書き込まれていない場合は、Programmer上 File memory layout にSoftDeviceのバイナリをドラッグ&ドロップし、  
Erase&Writeもしくはwriteで書き込む。  

IDEから書き込む場合は、
プロジェクトファイル内の`debug_additional_load_file`に以下のように指定することで、ファームウェアと一緒に書き込まれる。
設定名にdebugとついているが、releaseでビルド、ダウンロードした場合も、問題なくSoftDeviceはかきこまれた

```
c_preprocessor_definitions="APP_TIMER_V2;APP_TIMER_V2_RTC1_ENABLED; ..."
c_user_include_directories="../../../config; ... "
debug_additional_load_file="../../../../../../components/softdevice/s140/hex/s140_nrf52_7.0.1_softdevice.hex"
debug_register_definition_file="../../../../../../modules/nrfx/mdk/nrf52840.svd"
```

## プログラムビルド&書き込み

以下からプログラムのビルド、デバッグ、書き込みを行う。  
![2023-01-28-15-55-05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695430/520240ea-fc1e-b48b-cda9-4068e45daedf.png)
![2023-01-28-15-55-30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695430/a30469ea-e03c-2248-40d9-9327d0379f0d.png)

nRF Connect for Desktopから書き込むことも可能。  
[nRF Command Line Tools](https://www.nordicsemi.com/Products/Development-tools/nrf-command-line-tools/download)を使用して、
以下コマンドで書き込みも可能。

```
nrfjprog -f nrf52 --program <hex_file> --chiperase --verify
```

# 参考記事

- [nRF52840 を Segger Embedded Studio 開発環境で First Try](https://qiita.com/nanbuwks/items/dd20dc4619af1d994f2c)
- [Nordic社製BLEの開発環境構築と動作確認](https://qiita.com/Kosuke_Matsui/items/5d61ce77e928b9f117cc)
- [nRF52：概略](https://shizuk.sakura.ne.jp/bluetooth/nrf52/overview.html)