
前回、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ズレたまま入り込んでくるのだけは注意っと。
