SNSへはこちら

AE-TYBLE16をHack(3) - ペリフェラル構成

各種ペリフェラルを扱うつもりは無いのですが、今後はこのマイコンの特徴的なところを述べていこうと思います。
また、プログラムで弄る部分は nRF51822 に他ならない (もっと言えば ARM マイコンに他ならない)ですので、AE-TYBLE16 以外をご利用で仕組みを知りたい方も参考にしていただけるとよいと思います。

クロック構成

このマイコンのクロックブロックは大きく分けて次の2つに分かれています。

  • HFCLK: High Frequency。CPU や殆どのペリフェラルに利用される高速なクロックを指す。
  • LFCLK: Low Frequency。RTC 等で扱われる低速クロック。32.768kHz。

HFCLK のクロック源は内部 16MHz RC オシレーターあるいは外部クリスタルです。nRF シリーズは SoC として提供されることが多いので、この外部クリスタルも SoC 上にあるものがほとんどだと思います。外部クリスタルは 16MHz or 32MHz のものが利用されます。
いずれを用いたとしても、HCLK (CPU クロック) は 16MHz になり、またペリフェラル用に PCLK16M, PCLK1M が出力されます。

LFCLK は 32.768kHz 固定で、こちらも内部 RC オシレータあるいは外部クリスタルで選ぶことができます。

AE-TYBLE16 はどういう構成なのでしょう。このボードに載っている太陽誘電の EYSGJNZXX, EYSGJNZWY 用 DataReport にはこのように記載があります。

つまり、HFCLK 用の 32MHz 外部クリスタルが同梱されているのですね。一方で LFCLK 用クリスタルはありません。

ペリフェラルの扱い

このマイコン、よくある 32bit マイコンとはかなり違うところがありますので述べておきます。

ペリフェラルへのクロック供給

最近のマイコン、とりわけ 32bit マイコンは各種ペリフェラルを使う前にクロックを有効化する必要がありますよね。例えば STM32 シリーズだったら、RCCAHBCLK とかにある該当するビットを立てる、とかです。

このマイコンも勿論そのような機能があるのですが(省電力志向の設計ですものね)、各ペリフェラル内部に機能の有効化/無効化をするレジスタがあります。その名も POWER レジスタというのですが、これが特徴的だと思いませんか?
そして更に、実はデフォルトで全てのペリフェラルが ON だったりします。なのでスリープさせて電流を抑える必要があるアプリケーションなどでは手動で全てオフにする必要がありそうです。

nRF51822 のリファレンスマニュアルを見ると、各ペリフェラルのセクションでほとんどこのレジスタの記載がありません。しかし Memory の章を見ると、「いくつかのペリフェラルで POWER レジスタあるよん」となっています。まあ全部あるんですけどね。
設定値の詳細は記載がありませんが、0 を代入すると無効化、1 を代入すると有効化として動くようです。

ENABLEレジスタ

ペリフェラルを動作させる際に色々なマイコンで ENABLE ビット的なものを立てると思うのですが、このマイコンの場合はそれが1つのレジスタとして独立しています(タイマーには無い)。レジスタでペリフェラル機能の設定をしているときはこの ENABLE レジスタはまだ要りません。設定完了後、最後に ENABLE をいじって機能を有効化します。

...いや、それだけではセクションを分ける意味はありません。むしろこれ、リファレンスマニュアルを良く見ないとハマるポイントです。というのも、1 を代入すればよいかと思われますが、1 以外の値を代入する必要があるペリフェラルがあります。例えば UART では ENABLE に 4 を代入する必要があったり...
僕は特にハマりませんでしたが、皆さんマニュアルはよく読みましょう。

タスク・イベント

これが最も特徴的でしょうか。ユーザーがペリフェラルにトリガーをするタスクレジスタペリフェラルがユーザーにステータスを伝えるイベントレジスタがあります。32bit のレジスタですが、いずれも 0 か 1 で扱います(ENABLE みたいに変な値を入れる必要は無し)。
また、Nordic が用意しているライブラリでは、レジスタを叩く時にその名前に TASKS_ もしくは EVENTS_ を前置します。

例えば UART ですが、以下のようなレジスタが存在します。

例えば TASKS_STARTTX ですが、見るからに「ここを叩くと機能を有効化するよ」感ありますね。先程述べたように、タスクはペリフェラルへのトリガーとして機能します。
もう1つ、EVENTS_ERROR ですが、これは「なにか起きたから状態を知らせておくよ」感があります。こちらも繰り返すと、イベントはユーザーにステータスを伝える機能があります。また、イベントは割り込み要因にもなっていて、INTENSET レジスタと NVIC を弄ることで割り込みを入れることができます

SysTickタイマーが無い

nRF51822 は ARM Cortex-M0 マイコンです。「えっ、ARM なのに SysTick 無いの!?」と思われるかもしれませんが、実は Cortex-M0 では SysTick は Optional なんですよね。
同じ M0 でも、LPC マイコンや STM32 マイコンのLシリーズではありますよね。経験上ということになりますが、確かに M0 といっても殆どでは搭載されていますね。

このことは nRF のリファレンスマニュアルに理由込みで書かれています。
その理由とは、「SysTick 使うと電力食うよね。Tick イベント使うなら、RTC の方が良くない?」です。まあ確かに、と言った感じはあります。SysTick は CPU クロック、あるいはその分周を使うので、ある程度低頻度の処理をするのには LFCLK をソースとする RTC で十分なわけです。

ペリフェラルのピンアサイン

殆どのマイコンでは、ペリフェラルで使用するピンはある程度固定されていて、データシートのピン配置図等で調べながら使用するピンを決めていきます。このマイコンではアナログを除いてペリフェラルのピンを自分で設定する事ができます
例えば UART で RXD を決めたいときは、予め GPIO で Input にしておいた後(この操作は必須ではないがやっておいたほうが良い)、UART の PSELRXD でピン番号を指定します(例えば PIN0.1 を設定したければ 1 を代入する)。こうすることで自由な設定ができます。これはかなり便利。PCB 等で使う際には適当に配線をしておいて、ソフトを書く時に回路図を見ながら設定できますからね。

ということでほぼ文章でしたが、大まかな仕様は以上の通りです(書くの大変だった...)。
次回以降、一部のペリフェラルを取り上げていく予定です。