【bluetooth5.1】nRF52833DK(pca10100)でnRF5 SDKサンプルを動かす

# 背景
　bluetooth5.1の方向検知機能(Direction Finding)を使用してみたかったため、nordicの[nRF52833 DK](https://www.nordicsemi.com/Software-and-tools/Development-Kits/nRF52833-DK)を二つ購入しました。nordicからは2020年4月現在、bluetooth5.1以降に対応した開発ボードが4種類出ているようです(nRF52811, nRF51820, nRF52833, nRF5340)。nRF5SDKのサンプルを動かす工程で何箇所か引っかかったので、メモとして残しておきます。

　nRF52833のサンプルの動作方法は、[こちら](https://infocenter.nordicsemi.com/index.jsp?topic=%2Fug_getting_started%2FUG%2Fcommon%2Fnordic_tools.html&cp=1_0_1)のページのGetting startedとStartDevelopingにまとめられています。しかし、こちらに書かれている方法は一部がnRF52833向けの内容ではないため、**書かれている内容をそのまま行っただけでは、コンパイルしたサンプルは動作しませんでした。**

# 準備
　準備するものは以下になります。

- pca10100（nRF52833は、SoCの名称。pca10100は開発ボードの名称。）
- USB micro B to USB Aケーブル
- nRF5SDK v16.0.0
- SEGGER Embedded Studio for ARM V4.30c(64bit) （nordicのボードを使う場合は無料で使用可能）
- （動かすサンプル次第で、）bluetooth5.0対応スマートフォン

# コンパイル済みのサンプルを動かす


　[こちら](https://developer.nordicsemi.com/nRF5_SDK/)から、nRF5SDKをダウンロードします。現在（2020年4月）の最新バージョンv16.0.0では、SDK内に方向検知機能のサンプルが含まれていません。方向検知を実装する方法がありましたら教えていただけると幸いです。

　ダウンロードしたSDKを展開すると以下のようなフォルダ構成になっています。
![スクリーンショット 2020-04-28 18.27.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628237/2ca0b6b5-ca48-7aa8-d45d-51aebbc4c2e3.png)
↑ SDKを展開した結果

- componentsフォルダには、softdeviceなどが含まれています。
- examplesフォルダには、様々なサンプルが含まれています。

　今回は、examplesのサンプルを動かします。

　examplesフォルダのreadmeを見るとそれぞれの例とサンプルの有無が書かれています。今回使用するnRF52833はpca10100なのですが、そもそも選択肢にもありません。*不安が募ります。*
![スクリーンショット 2020-04-28 18.33.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628237/5fc5e497-de14-c505-cdf4-48d29d6bdd2d.png)
↑ readmeの画面

　公式の手順に従うとexamples>peripheral>blinky（点滅）の例を行うように出てきますが、そのフォルダにはpca10100フォルダが見つかりません。
![スクリーンショット 2020-04-28 19.43.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628237/cb82de5d-dcc8-a9de-46d9-345f3039830a.png)
↑ pca10100のフォルダがない
![スクリーンショット 2020-04-28 19.47.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628237/21322d3b-f3fc-bff1-a195-3fd578913baf.png)
↑ hexフォルダ（コンパイル済み）にもpca10100はない。

　試しに、**blinky_pca10056.hexをデバイスに書き込んでみたところ無事動作しました**（LED1,2,3,4が順番に点灯し、順番に消える）。書き込みは、USBで接続しhexファイルをドラッグ＆ドロップするだけでできるので非常に簡単です。
![VID_20200428_203342_1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628237/addcec47-7f79-a747-88ae-4b4f10f471a6.gif)
**しかし、blinky_pca10040.hexを書き込んでも動作しませんでした。他のサンプルで、コンパイル済みのものをデバイスに書き込んでみたところ、ほとんどが動作しませんでした**。これでは、今後開発を行う上で不便すぎるので、これらのサンプルをpca10100上で動かせるようにする必要がありそうです。

# サンプルを自分でコンパイルして動かす
　先ほどうまくいったpca10056のSEGGER Embedded Studio(SES)用のサンプル（SDK\examples\peripheral\blinky\pca10056\blank\ses\blinky_pca10056.emProject）を開きそのままビルドしてみました。SESのインストール方法などについては、他の方の投稿をご覧ください。
![Inkedスクリーンショット 2020-04-28 19.52.27_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628237/595a6c51-d6f6-6b4b-006d-a3f1dee8e53c.jpeg)
↑ SESの画面、ビルドは普通に成功

　そして、SDK内のフォルダに出力された
SDK\examples\peripheral\blinky\pca10056\blank\ses\Output\Release\Exe\blinky_pca10056.hexファイルをpca10100に書き込みます。

　**動きませんでした。**先ほどの動作したhexファイルと比較してみると、出力されるhexファイルの中身が異なっていました。
![スクリーンショット 2020-04-28 19.56.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628237/97f5d480-aaba-4a3b-1c63-ddcc699146f4.png)
↑ 今回、コンパイルしたもの
![スクリーンショット 2020-04-28 19.56.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628237/4884d839-7b19-be9d-b085-91f5039093e6.png)
↑ 先ほど動作したコンパイル済みサンプルhexファイル

　おそらく、元から入っていたhexファイルはses以外のKeilなどのソフトを使って書き出されたもので、その場合はたまたま動いたのでしょう。詳しい方がいらっしゃいましたら教えてください。

# pca10100対応のサンプル
　考えてみれば初めから行うべきだったのですが、そもそもpca10100に対応しているサンプルがないのか調べたところ、以下のページが見つかりました。
https://devzone.nordicsemi.com/f/nordic-q-a/54645/nrf52833dk-example-project

　こちらによると、pca10100に対応しているサンプルは限られているようで、対応しているのは以下のサンプルのようです。先ほどのblinkyのサンプルは、pca10100に対応していないのですね。*readmeにもpca10100欄を追加しておいてほしいものです。*

> Hi Erdem, there are a limited number of examples that supports the nRF52833 DK out of the box. The pca10100 examples are:

>- ble_peripheral 
 - ble_app_uart
 - ble_app_hids_keyboard
 - ble_app_hrs_nfc_pairing
- peripheral
 - uart
 - saadc
 - radio_test
 - blinky rtc_freertis
 - blinky_rtos
 - writable_ndef_msg
 - wake_on_nfc
 - record_url
 - usbd_hid_generic
 - usbd_ble_uart
 - usbd
- proprietary 
 - esb_ptx
 - esb_prx
 - esb_low_power_ptx
 - esb_low_power_prx
- dtm 
 - direct_test_mode
- bootloader 
 - secure_bootloader(s140, both debug and release variants)
 - secure_bootloader(s113, both debug and release variants)

　これらのサンプルをいくつかsesで開き、ビルドしたところ**無事動作することが確認されました。**これらのサンプルと先ほど動かなかったサンプルを比較することで、対応していないサンプルも動作させられそうです。

# pca10100非対応のサンプルを動かせるようにする
　先ほどのblinkyなどのように、pca10100に対応していないサンプルを動作できるように、pca10100対応と非対応のサンプルの相違点をまとめました。ボード間のソースコードの違いは基本存在しないと思われるので、メモリやSoftDeviceなどのプロジェクトの設定に違いがあると思われます。以下で、調査の結果判明したボードを変更する際の設定変更する箇所についてまとめます。
　SESでサンプルを開き、プロジェクト名を右クリックします。左上のオプションをReleaseからCommonに変更します。
![スクリーンショット 2020-04-28 20.44.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628237/4dcd9d5b-cea4-91e9-d938-4d2f2df55609.png)
↑　プロジェクトの設定画面

　以下の項目を次の値にします。

- Build>MemorySegment
 - FLASH RX 0x0 0x00080000;RAM RWX 0x20000000 0x20000
- Linker>SectionPlacementMacros
 - FLASH_PH_START=0x0
FLASH_PH_SIZE=0x80000
RAM_PH_START=0x20000000
RAM_PH_SIZE=0x20000
FLASH_START=0x27000
FLASH_SIZE=0x59000
RAM_START=0x20002ae8
RAM_SIZE=0x1d518
- Preprocessor>PreprocessorDefinitions
 - BOARD_PCA10100
NRF52833_XXAA
- RuntimeMemoryArea
 - >HeapSize 2048byte
 - >MainStackSize 2048byte
- Debugger>TargetDevice
 - nRF52833_xxAA
- Debugger>RegisterDefinitionFile
 - ../../../../../../modules/nrfx/mdk/nrf52833.svd
- Loader>AdditionalLoadFile[0]
 - ../../../../../../components/softdevice/s140/hex/s140_nrf52_7.0.1_softdevice.hex
- Simulator>MemorySimulationParametor
 - RX 00000000,00100000,FFFFFFFF;RWX 20000000,00010000,CDCDCDCD

　Loaderの項目は、SoftDeviceを用いる時以外は特に必要ありません。これで、ビルドしhexファイルを書き込んだところ**無事に動作しました。**他のサンプルでも、以上の項目を変更することで大体動くことが確認できました（そもそもpca10100が対応していない機能は無理ですが、）。
![VID_20200428_205955_1_1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628237/07a987dc-e984-fc00-1d26-7d3b943dce5b.gif)
↑　動いている様子

# まとめ
　nRF52833DK(pca10100)でnRF5SDKのサンプルを動かすために必要な項目をまとめました。このあたりの設定は、分かっている人には当たり前かもしれませんが、自分のようなものは躓いてしまうので公式でもわかりやすく書いていてくれたら非常にうれしいです。