SNSへはこちら

AE-TYBLE16をHack(2) - nrfxを導入

前回はアセンブリで適当にLチカしましたが、今回は本格的に Hack するのに備えてライブラリの導入をします。こちらも地味に面倒くさかったです。

使用するライブラリ - SoftDevice由来のnrfx

このモジュールは太陽誘電のものなのですが、元々これには Nordic 社の nRF51822 SoC が搭載されています。Nordic 社のページからは SoftDevice と呼ばれるライブラリが配布されているので、これに同梱されている nrfx という低レイヤライブラリを使えばよいのです。

ダウンロードまで至った経緯は不明ですが、こちらから最新版の 17.0.2 をダウンロードしました。

プロジェクトを作ろう

ここでは自己主張をしておきますが、ヘッダのインクルードパス指定とコンパイルエラーを駆使して色々と時間を掛けました
ではやっていきましょうかね。

まず、プロジェクトのディレクトリを作ります。僕はいつものように Register という(レジスタ手打ちをするぞ!的な)名前にしました。ついでにサブディレクトリを作っておきましょうか。

$ mkdir Register
$ cd !$
$ mkdir src inc

ライブラリの導入

必要なファイルを持ってきましょう。
まずは先程ダウンロードした SoftDevice。zip ファイルを展開したら、その中の modules/nrfx をプロジェクトルートにコピーします。

更にこのライブラリ、CMSIS が必要になるので git コマンドで clone しておきます。master ブランチだけでいいですかね。

$ git clone -b master https://github.com/ARM-software/CMSIS_5

その他編集

必要なファイルを持ってきます。

nrfx/mdk/nrf51_xxaa.ld をプロジェクトルートにコピーします。中身を次のように編集してください。ここではメモリマップを指定しています。具体的な値は太陽誘電のデータブリーフから調べてきました。

/* Linker script to configure memory regions. */

SEARCH_DIR(./nrfx/mdk)
GROUP(-lgcc -lc -lnosys)

MEMORY
{
    FLASH(xra): ORIGIN = 0x00000000, LENGTH = 256K
    RAM(xwa): ORIGIN = 0x20000000, LENGTH = 32K
}


INCLUDE "nrf_common.ld"

これでリンカスクリプトの準備は完了。続いてライブラリに必要なヘッダファイルを扱います。
プロジェクトルートの nrfx/templates/nRF51nrfx_config.hnrfx/templatesnrfx_log.h, nrfx_glue.h があるので、こちらもコピーしておきます。

取り敢えず nrfx_glue.h でエラーが出るので適当に編集しておきましょう。
ここの編集はとりあえずコンパイルエラーを無くすために施した編集に過ぎません。今後修正する可能性がありますのでご注意ください。

#define NRFX_IRQ_IS_ENABLED(irq_number) 1

Makefile

ビルドできるようにするためのスクリプトファイルですが、コンパイルエラー→ find | xargs grep の繰り返し→スクリプト編集をやった結果で説明すかなり面倒ですので、結果を示します。こちらからどうぞ。

動作テスト

それでは皆様、導入の操作お疲れ様でした。実際にライブラリを動かしてみましょう。取り敢えずのソースはこちらです。src/main.c に記入してください。

#include <nrf.h>
#include <nrf_gpio.h>
#define LED_GPIO_NUM 5

int main(void) {
    nrf_gpio_cfg_output(LED_GPIO_NUM);

    while(1) {
        nrf_gpio_pin_set(LED_GPIO_NUM);
        for(volatile int i = 0; i < 300000; i++);
        nrf_gpio_pin_clear(LED_GPIO_NUM);
        for(volatile int i = 0; i < 300000; i++);
    }
    return 0;
}

そうしたら make します。nrfx ライブラリも含めてビルドがされますね。え??どうやってこの関数を呼んだのか??困りますねえ、当然ライブラリのソースコードを読んだんですよぉ

冗談はさておき、以下のように動作します。基板上のシルク (P005) が PIN5 にそのまま対応するようです。