CCWO

挫けそうになるブログ

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に戻ります。