前回、ThonnyIDEにMicroPython機を接続したときに自動設定してくれるRTC日時の曜日がSTM32マイコンにおいては1ズレている、と問題提起?今回はその落穂ひろいです。前回未確認だった日曜日から月曜日に変わるときにRTCのDay Of Weekがラップするところを観察して、確認してみましたぜ。
※「MicroPython的午睡」投稿順 Indexはこちら
※ST Microelectronics社製Nucleo-F401REボード上で使用しているSTM32版MicroPythonについてはこちら
前回、MicroPythonのpybモジュールのドキュメントでも、STM32のリファレンスマニュアルでも、RTCの曜日は月曜日が1、日曜日が7で0は禁止とあるのに、ThonnyボードのRTC初期化では月曜日を0(STM32マニュアル上は禁止)に初期化していた件を観察しました。勝手な想像では多分月曜が0の他機種に対応のためにそうなっていると。
月曜を0と設定しても火曜日になれば1になってました。STM32のRTCハードは太っ腹にもカウントアップはしてくれるみたいです。けれど肝心な6まで行ったら0に戻る(Thonnyはそう思っている?)のか、7まで行ったら1に戻る(STM32とpybドキュメント)のかは実機で確認してなかったです。後者だとは思うけれど。
そこで作成したMicroPythonスクリプトが以下に。
#STM32F401RE: RTC import pyb import time rtc = pyb.RTC() def printDateTime(): tn = rtc.datetime() print("{0}/{1}/{2} {3:02d}:{4:02d}:{5:02d}".format(tn[0], tn[1], tn[2], tn[4], tn[5], tn[6])) print("Weekday={0}".format(tn[3])) def setDateTime(tpl): rtc.datetime(tpl) def main(): print("STM32F401RE RTC Week Wrap test.") i = 0 while True: if i == 0: tpl = (2023, 3, 19, 7, 23, 59, 51, 0) setDateTime(tpl) elif i == 5: tpl = (2023, 3, 19, 6, 23, 59, 51, 0) setDateTime(tpl) elif i > 10: i = 0 printDateTime() i += 1 time.sleep(10) # Normal End if __name__ == "__main__": main()
2023年3月19日の午後23時59分51秒からのRTCの様子を曜日=6と曜日=7(MicroPythonマニュアル上はWeekdayフィールド)で繰り返すもの。
実行結果が以下に。
曜日は7から1へとラップしますが、6にすると7にカウントアップです。
やっぱりSTM32においては、月曜1、日曜7で確定(まあ1から7でループするので、別な対応関係でも問題ないっすけど、0は入れてはいけない。)まあ、0初期化しても1から7のループに1ズレたまま入り込んでくるのだけは注意っと。