2017年01月16日

RTC使い方

今回はSTM32のRTC機能について紹介します。


環境は、
・STM32F373CCT6
 +SW4STM32(System Workbench for STM32)
 +STM32CubeMX(F3_1.6.0)
です。

48ピン以上の多くのMPUにはVBAT端子がついており、
32.768kHz水晶発振子と電池を接続するとRTC機能が使用可能です。

また、RTCの他に64byte程度のバックアップレジスタがあり、
電池で値を保持することが可能です。
例えば、ボタンや機器の状態等を保持することに使えそうです。


STM32CubeMX上でRTCを有効化し、
ActivateClockSourceとActivateCalenderにチェックを入れます。



◆設定

RTC_TimeTypeDef sTime;
sTime.Hours = 11;
sTime.Minutes =12;
sTime.Seconds = 13;
sTime.SubSeconds = 0;
sTime.TimeFormat = RTC_HOURFORMAT_24;
sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
sTime.StoreOperation = RTC_STOREOPERATION_RESET;

RTC_DateTypeDef sDate;
sDate.WeekDay = RTC_WEEKDAY_MONDAY;
sDate.Month = RTC_MONTH_JANUARY;
sDate.Date = 15;
sDate.Year = 0;//YEARは2017でなく、ある年を基準として設定します


HAL_RTC_SetTime(&hrtc, &sTime, FORMAT_BCD);
HAL_RTC_SetDate(&hrtc, &sDate, FORMAT_BCD);

で時刻や日付をセットします。


◆読み出し

RTC_TimeTypeDef gTime;
RTC_DateTypeDef gDate;
HAL_RTC_GetTime(&hrtc, &gTime, FORMAT_BIN);
HAL_RTC_GetDate(&hrtc, &gDate, FORMAT_BIN);
printf("YY MM DD : %d , %d, %d,  ",gDate.Year,gDate.Month,gDate.Date);
printf("HH MM SS : %d , %d, %d \n",gTime.Hours,gTime.Minutes,gTime.Seconds);

で時刻や日付を読み出し可能です。

◆バックアップレジスタ
バックアップレジスタは下記の関数で読み書き可能です。

書き込み
HAL_RTCEx_BKUPWrite(&hrtc, RTC_BKP_DR0,0x01234567);
読み出し
uint32_t ROM=HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_DR0);



外付けでRTCを別途つける必要なく、
水晶発振子と電池だけで簡単にRTC機能とその周辺の機能を実装可能です。
他にADCの設定でVBATの電源電圧の読み込みが可能なようです。


実験していて驚いたこととして、
一度、基板上の電池と32.768kHz水晶発振子を接続しておけば、
コードに直しても設定が保持され、時刻も進んでいることです。

MPU内のプログラムをRTCとは関係のないコードを書き込んでも
再度、RTCのプログラムに戻すと保持されていました。


一般的なMPUのRTCは別のプログラムを書き込んだ時点でRTCが停止し、
時刻やデータが消えてしまうのが一般的です。
実験のボードで使うにもSTM32は時刻やバックアップレジスタが保持されるのは
再設定の手間が省けて便利な機能だと思いました。
VBATとして電池端子が独立しているのも扱いが楽だと思いました。

posted by Crescent at 00:00| Comment(0) | TrackBack(0) | ナレッジ | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

※ブログオーナーが承認したコメントのみ表示されます。

この記事へのトラックバック