LPC2388でRTCを使ってみたので、AT91SAM9260のRTTも使ってみることにしました。RTCとちがって、RTT(Real-time Timer)では時刻情報を保持するのは、32bitのタイマ・カウンタひとつだけです。日付と時刻を表示するには、ソフトでこのタイマ値を変換してやる必要があります。
RTT機能自体はAT91SAM7にもあったのですが、内蔵RC発振器によって動作するため、時刻精度が悪く使う気になれませんでした。AT91SAM9260では32Kの外部水晶を使って動作するうえに、電池でのバックアップもできるので、これを実験してみることにしました。
日付と秒数の変換にはnewlibのmktimeを利用しています。Unixのtime_tでは1970年1月1日(EPOCH)からの秒数を数えているので、RTTのカウンタをこの秒数に合わせておき、毎秒インクリメントさせるのが一番素直で簡単です。しかし、RTTのカウンタであるRTT_VRは Read-onlyのレジスタであり、RTT_MRを介してリセットすることはできても、任意の値に設定することはできません。そこで、次のような方法を採ることとしました。
これで、めでたく電源を切っても時計は電池でバックアップできるようになりました。
ちなみに、AT91SAM9260には電池でバックアップできるレジスタは、4つ(16バイト分)しかありません。LPC2388には2KBもバックアップ可能領域があるようですが、おまけ基板では電池バックアップができないのが残念なところです。
RTT機能自体はAT91SAM7にもあったのですが、内蔵RC発振器によって動作するため、時刻精度が悪く使う気になれませんでした。AT91SAM9260では32Kの外部水晶を使って動作するうえに、電池でのバックアップもできるので、これを実験してみることにしました。
日付と秒数の変換にはnewlibのmktimeを利用しています。Unixのtime_tでは1970年1月1日(EPOCH)からの秒数を数えているので、RTTのカウンタをこの秒数に合わせておき、毎秒インクリメントさせるのが一番素直で簡単です。しかし、RTTのカウンタであるRTT_VRは Read-onlyのレジスタであり、RTT_MRを介してリセットすることはできても、任意の値に設定することはできません。そこで、次のような方法を採ることとしました。
- 日付/時刻を設定した時にRTT_VRをリセットする。日付/時刻に対応するEPOCHからの秒数を求め、それを電池でバックアップされるレジスタに保存する。
- 日付を表示する際には、バックアップ・レジスタの値にRTT_VRの値を足したものを、変換して表示する。
これで、めでたく電源を切っても時計は電池でバックアップできるようになりました。
ちなみに、AT91SAM9260には電池でバックアップできるレジスタは、4つ(16バイト分)しかありません。LPC2388には2KBもバックアップ可能領域があるようですが、おまけ基板では電池バックアップができないのが残念なところです。