MicroPython的午睡(97) STM32版、RTC、日曜は7、月曜は1

Joseph Halfmoon

前回、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フィールド)で繰り返すもの。

実行結果が以下に。

STM32RTCwrapResult

曜日は7から1へとラップしますが、6にすると7にカウントアップです。

やっぱりSTM32においては、月曜1、日曜7で確定(まあ1から7でループするので、別な対応関係でも問題ないっすけど、0は入れてはいけない。)まあ、0初期化しても1から7のループに1ズレたまま入り込んでくるのだけは注意っと。

MicroPython的午睡(96) STM32版、曜日表現、Thonnyとマニュアル相違? へ戻る

MicroPython的午睡(98) STM32版、Nucleoのクロック設定を見直す へ進む