GPIOはよいとして、GPIOTEというのはあまり他のマイコンでは見られない周辺機能だと思う。
nRF51822には、そのGPIOTEがある。
まず、GPIO。
General Purpose Input/Outputで、これは他のマイコンでもおなじみだ。
nRF51822には32本のGPIOがある。
それぞれのピンは独立していて、設定もそれぞれにできる(PIN_CNF[n]レジスタ)。
- DIR(InputかOutputかの方向)
- INPUT(inputバッファに接続するかどうか。使わんなら切断しとくと省電力に貢献)
- PULL(プルアップ/プルダウン/なし)
- DRIVE(他周辺機器用?)
- SENSE(入力の1/0検出レベル)
リファレンスマニュアルの図を見ないと、意味がわかりづらいと思う。
ビットをセットするだけのレジスタとクリアするだけのレジスタがあるので、自分で読んで論理演算操作しなくてもよい。
これができないと、アトミックな操作ができなくて面倒なことがあるのよね。
SENSEは、次のGPIOTEに関係していると思う。
あるいは、WFI/WFEの解除トリガになってくれるのかもしれないが、Peripheral interfaceの図を見ると、NVICにつながっているのはEVENTになっているので、DETECTがアサートされただけでは解除されないと思う。
DETECT線へ通知するとは書いてあるんだけど、これがどうなるかまでは書いてないのだ。
GPIOTEは、GPIO Task and Eventの略。
だから、TaskとかEventとかの概念があるnRF51822くらいしか持ってないんじゃないかと思う。
Taskはアプリ→周辺機器方向への要求で、こんなのができる。
- SET
- CLEAR
- TOGGLE
まあ、こんなもんでしょうな。
Eventは周辺機器→アプリ方向への通知で、こんなのが来る。
- 立ち上がりエッジ
- 立ち下がりエッジ
- 変化あり
まあ、こんなもんでしょうな。
CONFIGで設定ができるが、2bit分あるのに設定値が0, 1(Event mode), 3(Task mode)だ。
なんとなく、2がTask modeで、3がTask and Event modeみたいになりそうだけど、そうじゃないんだ。
これはCONFIGが4つ分しかないので、4ピン分しか使えないはずだ。
ではnRF51 SDKがどうしているかというと、特にそういう制約は書かれていない。
むしろ、初期化時に「最大いくつのセットを使うか」みたいな指定ができるくらいだ。
割込テーブルを見ると、GPIOTE_IRQHandlerと1つ分しか登録していない。
どうやってるんだろう?
ちなみに、app_gpiote_fast_detect.cという方もあり、こちらはCONFIGを設定している。
引数がchannelになってて、0~3までのようだから、こっちはGPIOTEを使ってる感じがする。
SDKをgrepすると、SPIスレーブがTASKS_OUT[]を使っているので、SPIスレーブを使うとGPIOTE fastは使えない、という制約があるのかもしれん。
じゃあfastじゃない方のGPIOTEはどうやってハンドラが呼ばれているのかというと、これはINTENレジスタによるもののようだ。
Port eventの説明を読むと、ようやくGPIOのDETECT線が出てきた。
つまり、わざわざTaskの設定をしなくても、割込を有効にしておけばDETECT線のアサートによってNVICに通知が来て割り込みハンドラが呼ばれるしくみになっているんだろう。
あれ、じゃあGPIOTEユニットを止めたりすると割込が発生しなくなるんだろうか?
そもそも、GPIOTEは有効/無効の設定があるんだろうか?
推測だが、UARTとかの周辺機能にはTaskとしてSTART/STOPがある。
これがユニットへの電源供給制御も兼ねてるんじゃなかろうか。
GPIOTEにはそういうのがないから、常に有効なんだろう。
0 件のコメント:
コメントを投稿
コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。
注: コメントを投稿できるのは、このブログのメンバーだけです。