2015/10/12

[nrf51]RTCは使わずapp_timerを使うのだ

そんなに難しいことをしたいわけではない。
nRF51822でAD変換するサンプルが動いたので、BLEを動かして、数秒おきにAD値をNotifyで通知しようとしただけだ。

タイマもあるけど、1秒おきとかならRTCでよかろう、と思い、RTCのサンプルから関数を引っこ抜いて、Bluetooth Developer Studioで作ったサービスと一緒に突っ込んだ。
RTCはまだ動かしたことがないので、まずはLED点滅でもさせよう。

が、だ。
RTC0初期化→BLE初期化の順で実行すると、SoftDeviceのクロック初期化でリセットされる。
BLE初期化→RTC0初期化の順で実行すると、RTCのドライバ初期化でHardFaultしてしまう。
なんなんだ??

ネットで検索しても「RTCが使いたいんだけど」→「app_timerライブラリがあるよ」と、RTCの話をしてくれない。
RTC calendar - Nordic Developer Zone

やむなくリファレンスマニュアルを見た。
「The RTC must be able to run while the 16MHz system clock(SysClk) source is OFF.」
16MHzって、BLE使うときに動かしているクロックのことだと思う。
だから、BLE使っているときはRTCが使えないということか?
このSysClkという単語がRTCのところにしか出てこないので、どれに該当するかがよくわからん。

クロックの章を見ると、HFCLKとLFCLKしかない。
HFCLKは16MHz固定、LFCLKは16MHz固定。
16MHzは、内蔵発振か外部発振かを選べる。
なので、内蔵発振を使う場合にはダメ、とかかと思ったが、LFCLKも内蔵発振があるので関係ない気もする。

うーむ。


では、app_timerライブラリを見てみよう。
nRF51 SDK - S110 SoftDevice: Timer library
あれ、RTC1をベースにしている、とある。
これは、SoftDeviceがRTC0を使って、アプリはRTC1を使うってことかい?

そう思い、RTC1に差し替えてビルドすると・・・app_timerで定義しているRTC1_IRQHandlerと重なるということでリンクできなかった。
app_timerは使っていないけど、わざわざ取り外すほどでもないので、app_timerを使うようにしよう。

0 件のコメント:

コメントを投稿

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

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