Seeeduino XIAO (ATSAMD21G18) のRTCライブラリ

最近、毎日何か作ってるような気もするが今度はRTCライブラリを作って見た。モード2専用ではあるがモード0でもほぼ同じことができそう。でも、毎分とか毎時とか毎日とか毎月とか毎年とかのカレンダーでアラーム設定できるのはモード2だけだ。

RTCの年の値は0-63であるため、基準年を1900年にすると1963年までしか対応できないので基準年を2000年とした。これで2000-2063年まで対応できる。

C言語ランタイムのtime_t型は64-bit型になっているようなので2038年問題はないが2063年問題は残ることになる。が、若い人は別にしてあと43年も対応できれば十分だろう。

ちなみにデバッグ中にクロック・レジスタのリードに毎回1ms前後の時間がかかることを発見。それを解決するのに少々手間取ってしまった。リード同期がとれていない状態でクロック・レジスタをリードしてしまうとリード同期がとれるまでCPUが止まってしまうらしい。リード・リクエスト(RREQ)とリード・コンティニュー(RCONT)を同時設定することでリード同期が完璧に決まる。一度、同期が取れればCPUが止まることはないようだ。

【概要】

ライブラリを初期化する。

ライブラリを終了する。

割り込みを設定する。

イベント出力の設定をする。

RTCクロック(1.024KHz)の999424クロック毎の補正量を符号付で指定する。

デバッグ中の動作を設定する。

時刻を取得する。C言語のtime()と互換で1900/1/1からの秒数を返す。

時刻を設定する。

アラームを設定する。

【サンプルスケッチ】

【修正】
2020-05-24
evetsys.hのインクルードとRTCLOCK_EVOSEL型を追加。eventOutput()を仕様変更しEVENTSYS_GEN型を返すように変更。

【ライブラリ】

【参照ライブラリ】
Seeeduino XIAO (ATSAMD21G18) のGCLKライブラリ (gclock.h/gclock.cpp)
Seeeduino XIAO (ATSAMD21G18) のEVSYSライブラリ (eventsys.h/eventsys.cpp)