2015/06/06

[nrf51]GPIOTE再び

前回、たぶんSDK v6かv7のときに、これを書いた。
hiro99ma blog: [nrf51]GPIOとGPIOTE

v8になって、ふと心配になり、もう一度調べ直した。
nRF51 GPIOTE

当たり前だけど、nRF51 SDKとは関係なく、nRF51系のチップ仕様に関わることなので、v7だろうとv8だろうと書く内容に変わりは無い。

だから、次はv8に特化したことを調べることになるか。


ピンの変化に対するサンプルコードは、2つある。

  • gpiote
  • pin_change_int

clockとかqdecでも使ってはいるが、機能説明として使っているのは上記2つだろう。

 

pin_change_intサンプル

  • nrf_drv_gpiote_init()
  • nrf_drv_gpiote_out_init()
  • nrf_drv_gpiote_in_init()
  • nrf_drv_gpiote_in_event_enable()
  • イベントループ

TaskとかEventとかが出てこない。
あまり中は読んでないが、nrf_drv_gpiote_init()でnrf_gpiote_int_enable(GPIOTE_INTENSET_PORT_Msk)を呼んでいるので、ここでPORTの割込を有効にしているのだろう。
そしてGPIOTE_IRQHandler()でPORTレジスタを見ているので、指定したポートからの割込かどうかを判定しているのだろう。

INとかOUTとかも見ていないので、TaskやEventの制約である「4つまで」には関係なく使えそうだ。

 

gpioteサンプル

こちらは、pin_change_intサンプルと比べるとわかりづらい。
LEDを点滅させたい感じはするのだが・・・。

  • nrf_drv_ppi_init()
  • nrf_drv_gpiote_init()
  • nrf_drv_timer_init()
  • nrf_drv_gpiote_out_init()
  • nrf_drv_timer_extended_compare()
  • nrf_drv_ppi_channel_alloc()
  • nrf_drv_timer_event_address_get()
  • nrf_drv_gpiote_out_task_addr_get()
  • nrf_drv_ppi_channel_assign()
  • nrf_drv_ppi_channel_enable()
  • nrf_drv_gpiote_out_task_enable()
  • nrf_drv_timer_enable()

あきらかにタイマのAPIもあるのだが、PPIがよくわからないので全部書き出した。
点滅させるからタイマを使うのはわかるとして、PPIはなんだろう?

PPIはてっきり「PeriPheral Interface」の略だと思っていたが、Programmable Peripheral Interconnectのことらしい。
あぶないあぶない(SlideShareはさっき修正した)。
これはEventとTaskを接続する機能のようだ。
ここでは、TIMERのEventとGPIOTEのTask(TOGGLE)を接続している。
こうしておくと、タイマのイベントハンドラを書かなくても、タイマが満了したら勝手にGPIOのピンをトグルするようになる。
へー。
すぐに用途は思いつかないが、覚えておいて損はあるまい。

GPIOTEのTaskは何に使うんだろうと思っていたが、こういう感じで使えるという例なのだろう。
なので、単に割込として使いたい場合はpin_change_intサンプルを参考にするのがよさそうだ。


さて、gpioteサンプルで謎だったのが、これ。

*(uint32_t *)0x40008C0C = 1;

TIMER0のアドレスは0x40008000からなのでタイマ関係のレジスタだとは思うが、リファレンスマニュアルにはオフセットが0x54Cまでしか割り振られていないので、何だかわからない。

ネットで検索すると、Product Anomaly Noticeのドキュメントが出てきた。
PAN ID 73で、どうもバグっぽい。
「GPIOTEかRTCのTASKをトリガとしてTIMERモジュールのEVENTを使おうとするとうまくいかん」みたいなもののようだ。
TIMERモジュールの0, 1, 2でそれぞれ0x40008C0C、0x40009C0C、0x4000AC0Cがあって、タイマを使うときに1、いらなくなったら0にするようだ。
サンプルを見たから気付いたけど、知らなかったらすごく悩んで、最後にPANを読んで知る、みたいなパターンになりそうだ。

PAN v3.0になって追加されてるっぽいが、IC revに関係なく起きるってことだろうか?
そう思ったときに調べるのが、Compatibility Matrixだ。
PAN v3.0はIC revが3だから、私が持っているIC rev2では起きない現象なんだろう。

0 件のコメント:

コメントを投稿

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。

注: コメントを投稿できるのは、このブログのメンバーだけです。