nRFgo Motherboad + nRF51822 DKでButtonをEvent Drivenで動かす

nRF51822 DK(Development Kit)とnRFgo Starter Kitを手に入れたので開発中に詰まった所をいくつかメモ。

SoftDeviceについて

このChipの特徴のひとつであるSoftDeviceですが、どういうものか良く理解せず(今もしっかりは理解してませんが)に使っていたので、備忘録も兼ねて。
詳しい説明はDocumentを見てもらうとして、ざっくり言うとSoftDeviceとはある種のMiddlewareのようなもので、
Hardwareに近い非常に低級な部分の機能をApplication LevelのAPIで出来るようにしてくれるようです。

nRF51822で使えるSoftDeviceはS110とS120があり、今回はS110に注目します。
S110に関する記述は公式資料を斜め読みしていると、

The S110 SoftDevice is a Bluetooth® low energy (BLE) Peripheral/Broadcaster protocol stack solution.
It integrates a Bluetooth low energy controller and host, and provides a full and flexible API for building Bluetooth low energy System on Chip (SoC) solutions.

とあり、あたかもBluetooth関連の機能をいい感じにしてくれるものかと思いきや、Bluetooth以外の機能でも非常に重要な働きをします。

Event Drivenで動かす為に

SDKのSampleに含まれるble_app_proximityのように、Buttonが押された事をTriggerに何らかの処理をしたい事は多々あるかと思います。これを実現するには、

  • Main loop内でbutton_is_pushed等を利用する
  • Event handlerを使ってButtonの状態が変化した場合に何らかの処理を行う

という二種類の方法がすぐに思いつくかと思います。ほとんどの場合は後者の方法を使うかと思いますが、
このEvent handlerを簡単に設定するために、SoftDeviceが一役買ってくれます。
通常、このChipでEvent Handlerを動かす為には、SDKRTC Exampleのlfclk_config関数のように、
Low-Frequency Clockを自分で設定してやる必要がありますが、
SoftDeviceを使用している場合には、SoftDeviceを初期化するSOFTDEVICE_HANDLER_INIT関数の第一引数に適切なLow-Frequency Clockを指定してやることにより、自動でapp_timerを使う為の諸々の設定が行われるようです。(https://devzone.nordicsemi.com/index.php/app_button-event-not-firing
なので、Bluetoothの機能を使わない状態でも、SoftDeviceを設定しておくことにより、Event DrivenなApplicationを開発してやる事が出来るようになります。

また、初期状態ではSoftDeviceは書き込まれていないので、nRFgo Studioを利用して書き込んでやる必要があります。
Nordic公式サイトから適切なSoftDeviceを選び、書き込んでやるとこのような表示になります。

f:id:gracefulsea:20140510174317p:plain

ここで注意が必要なのが、S110の必要メモリが4.0から80kBに減少しているため、
uVision上でMemoryのBase Addressを変更してやる必要があります。
詳しくはS110のMigration Documentに記述されていますが、
Migration Documentの図を引用すると、このように変更する必要があります。(左側が変更前、右側が変更後)

f:id:gracefulsea:20140510174650p:plain

以上の変更を行うと、APP_BUTTON_INITで設定したButton及びCallback関数が適切に動作するようになります。
細かいButtonの設定の仕方等は、ble_app_proximityを参考にすると分かりやすいと思います。