Renesas RX621 RTC
RTCの設定をしたいと思います。
RTC=リアルタイム・クロックとは、正確に1sなどを計測したり、カレンダー機能を使用するために用いられます。
今回は正確に1sを計測し、1s毎に割り込みを呼びたいと思います。
hardware_setup.cにて以下のRTC_initialize関数を作成し、HardwareSetup関数で呼びましょう。
ただし、サブクロックに32.768kHzの水晶発振子等を接続する必要があります。
RTC_initialize関数等をhardware_setup.cに追加
#include "vect.h" #pragma interrupt (RTC_PRD_interrupt(vect=VECT(RTC, PRD))) unsinged int time; void RTC_initialize(void){ RTC.RCR1.BIT.PIE = 1; // Enable Period Interrupt RTC.RCR1.BIT.PES = 6; // 1s Period RTC.RCR2.BIT.START = 1; // Enable RTC IPR(RTC, PRD) = 11; // Interrupt level 11 IEN(RTC, PRD) = 1; // Enable PRD interrupt while(!RTC.RCR2.BIT.START) ; // Wait RTC.RCR2.BIT.RESET = 1; // Clear PreScaler, 64HzCount, Alarm Register } void RTC_PRD_interrupt(void) { time++; }
それではRTCの設定手順を見ていきましょう。
1.モジュールスタート(消費電力低減機能の解除)
2.ピンの設定
3.RTCの設定
4.ユーザ関数の定義
1.モジュールスタート
RTCの消費電力低減機能はありません。
2.ピンの設定
同期等して使うピンは今回設定しません。1s周期で出力するピンを設定することもあります。
3.RTCの設定
RTC.RCR1.BIT.PIE = 1; // Enable Period Interrupt RTC.RCR1.BIT.PES = 6; // 1s Period RTC.RCR2.BIT.START = 1; // Enable RTC IPR(RTC, PRD) = 11; // Interrupt level 11 IEN(RTC, PRD) = 1; // Enable PRD interrupt while(!RTC.RCR2.BIT.START) ; // Wait RTC.RCR2.BIT.RESET = 1; // Clear PreScaler, 64HzCount, Alarm Register
上記のようし1sでPRD割り込みが呼ばれるように設定します。
4.ユーザ関数の定義
#include "vect.h" #pragma interrupt (RTC_PRD_interrupt(vect=VECT(RTC, PRD))) void RTC_PRD_interrupt(void) { time++; }
これまでと同様にpragmaにてベクト番号=VECT(RTC,PRD)でRTC_PRD_interrupt関数を呼ぶように設定します。
これで計測が開始されてから変数timeが1秒おきにカウントアップしていきます。
ただし、変数timeはunsigned intなので65535になるとオーバーフローし、0に戻ります。
20160822の記事