STM32にTimezoneを設定する方法
今回はSTM32のGCCの標準ライブラリ関数<time.h>でタイムゾーンを設定する方法を紹介します。
STM32が他のシステム(PCやマイコン等)と時間情報の通信を行うようなシステムの場合、多くの場合は標準Cライブラリが定義しているtime_t型(Unix時間)を用いて通信を行います。
しかし、Unix時間はUTC(協定世界時)の1970/01/01 00:00からの秒数であるため、タイムゾーンが設定されたシステムからUnix時間の情報を受け取り、STM32のタイムゾーンを設定しないままGCCの標準ライブラリ関数<time.h>のlocaltime関数などを使って地方標準時に変換しようとしても、デフォルトのタイムゾーンはUTCとなっているため日本の地方標準時よりも9時間前の時間となってしまします。
したがって、Unix時間から日本の地方標準時を得るためには実行環境にタイムゾーンを設定する必要があります。
なお、ここではIDEにSW4STM32 (System Workbench for STM32)、コンパイラにはAc6 STM32 MCU GCCを用いています。
設定方法は簡単です。
標準ライブラリ関数<stdlib.h>をインクルードした上で以下の関数を実行するだけです。
putenv("TZ=JST-9");
putenv
はシステムの環境変数の値を設定する関数です。引数には環境変数を入力します。
TZ
はタイムゾーンを定義する環境変数です。
TZ
にはまず3文字のタイムゾーン名を設定します。日本標準時の場合はJST
(Japan Standard Time) です。
続いてUTCとJSTの時間差を時間単位で設定します。
日本時間はUTCより9時間進んでいるため-9
になります。
putenv
関数を設定した後はlocaltime関数等でUnix時間から地方標準時への変換が可能になります。
たとえば、以下のプログラムをNUCLEO-L476RGで実行してみました。
結果は以下のようになりました。
putenv
関数でタイムゾーンを設定できていることがわかります。