【STM32】RTCを使う

時計というからには、電源を喪失したぐらいで時刻・日付が飛んでいては困ります。

そこでSTM32の大方の機種についているRTCを使うことにしました。

RTCを使うにはRC発振以外のオシレーターを使う必要があります。VBATだけではRC発振できないみたいです。

大抵のボードにはちゃんと乗ってるので大丈夫だと思います。

今回はボードに時計用のクロックがついているのでLSEを使いましたが、HSEしかない場合もHSEを分周して使うことができます。

あとは適当に合わせます。変わるとこが見たいとかの場合59分とかにしとけばいいですが、どちらにせよ初期化コードを放置するとリセットするたびに時計がこの時間にセットされるのでコメントアウトする必要があります。当初VBATに電池をつないでるにもかかわらず時計がリセットされて困ってましたがこれが原因でした。(後記)

 

次はコードです。

こうすることで日付と時刻が取得できます。

時刻だけの場合はGetTimeを叩くだけでいいのですが、日付を取得する場合先に時刻を取得して日付をアンロックしないといけないそうです。

詳細はhttps://www.st.com/resource/en/user_manual/dm00105879.pdf

の719ページに書いてあります

で、RTC_FORMAT_BCDと書いてあるとおり、RTCとはBCDでやり取りする必要があります。

そのまま読むと60分を超えて困惑するはめになります(

適当なところに

こういうのを置いて対処します。

Getで取ってきたものはBCD2DECにかけると普通の数字に、

Setする際にはDEC2BCDにかけることで数字から正しいデータに変換できます。

 

で、初期化コードに問題があるとか言ってましたが、

これがCubeMXの出力した初期化コードです。

おもっくそSetTimeとSetDateしてます。

起動時にせっかく持ってる時計がリセットされますので、時計として使うならこの2箇所をコメントアウトする必要があります。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です