RX62N 周辺機能紹介 RTC リアルタイムクロック ルネサスエレクトロニクス株式会社ルネサス半導体トレーニングセンター 2013/08/02 Rev. 1.00 00000-A
コンテンツ RTC の概要 プログラムサンプル プログラムサンプルのカスタマイズ 2
RTC の概要 3
RTC の仕様 32.768KHz メイン発振 サブ発振 CPG RTC システムクロック (ICLK) 周辺モジュールクロック (PCLK) 外部バスクロック (BCLK) ソフトウェアスタンバイモードでも動作する 4
RTC の動作概要 秒 分 時 日 曜日 月 年 5
プログラムサンプル 6
サンプル プログラム仕様 RTC のプログラム例 RTC を 2011 年 12 月 31 日 ( 土 )23 時 59 分 50 秒に初期化し 1 秒経過ごとに年 月 日 曜日 時 分 秒を変数にコピーします 仕様 割り込み なし 7
プログラム フローチャート リセット スタート main スタートアップルーチン init_rtc RTC 初期化 時刻の初期設定 桁上げ割り込み要求許可 CPU 内部レジスタ クロックレート およびメモリ内の静的変数領域はスタートアップ ルーチン内で初期化されます 秒カウンタへの桁上げで time 構造体変数を RTC の現在値で更新 時刻の読み出し手順 8
時刻の設定フロー カウンタの停止 カウンタの設定 = 時刻の設定 カウンタの再起動 9
RTC コントロールレジスタ 2(RCR2) (1) カウント動作時刻設定前 10
RTC コントロールレジスタ 2(RCR2) (2) 11
カウンタ 年カウンタ (RYRCNT) 月カウンタ (RMONCNT) 日カウンタ (RDAYCNT) 曜日カウンタ (RWKCNT) 時カウンタ (RHRCNT) 分カウンタ (RMINCNT) 秒カウンタ (RSECCNT) 範囲 :BCDで0000~9999 範囲 :BCDで01~12 範囲 :BCDで01~31 範囲 :BCDで0( 日曜 )~6( 土曜 ) 範囲 :BCDで00~23 範囲 :BCDで00~59 範囲 :BCDで00~59 日カウンタの設定範囲は月やうるう年によって異なる 12
RTC の初期化関数 enum{sun,mon,tue,wed,thu,fri,sat}; void init_rtc(void){ // RTCstop RTC.RCR2.BIT.START = 0; while(rtc.rcr2.bit.start!= 0); } // Timer 64Hz counter reset RTC.RCR2.BIT.RESET = 1; // set real time clock RTC.RYRCNT.WORD = 0x2011; //2011 年 RTC.RMONCNT.BYTE = 0x12; //12 月 RTC.RDAYCNT.BYTE = 0x31; //31 日 RTC.RWKCNT.BYTE = SAT; // 土曜 RTC.RHRCNT.BYTE = 0x23; //23 時 RTC.RMINCNT.BYTE = 0x59; //59 分 RTC.RSECCNT.BYTE = 0x50; //50 秒 // RTCstart RTC.RCR2.BIT.START = 1; while(rtc.rcr2.bit.start!= 1); 13
RTC コントロールレジスタ 1(RCR1) 1 秒ごとに起きる 14
時刻の読み出しフロー カウンタの読み出しは手順を踏まないと正しい値が読めない 64Hz カウンタの秒カウンタへの桁上げ リセット後は禁止なので設定不要 時刻読み出し中に桁上げが起こった 15
RTC のメイン関数 ( 読み出し手順 ) void main(void) { // Initialize timer (RTC) init_rtc(); // A carry interrupt is enable RTC.RCR1.BIT.CIE = 1; while(1){ // check for a carry interrupt request flag if(ir(rtc,cup) == 1){ // 1-second intervals do{ //flag clear IR(RTC,CUP) = CLEAR; struct { uint16_t year; uint8_t month; uint8_t day; uint8_t youbi; uint8_t hour; uint8_t minute; uint8_t second; } time; main init_rtc RTC 初期化 桁上げ割り込み要求許可 秒カウンタへの桁上げで time 構造体変数を RTC の現在値で更新 } } // read real time clock time.year = RTC.RYRCNT.WORD; time.month = RTC.RMONCNT.BYTE; time.day = RTC.RDAYCNT.BYTE; time.youbi = RTC.RWKCNT.BYTE; time.hour = RTC.RHRCNT.BYTE; time.minute = RTC.RMINCNT.BYTE; time.second = RTC.RSECCNT.BYTE; // check for a carry interrupt request flag }while(ir(rtc,cup) == 1); } 読み出し手順 16
プログラムサンプルのカスタマイズ 17
サンプル プログラムの追加仕様 RTC のプログラム例 RTC を 2011 年 12 月 31 日 ( 土 )23 時 59 分 50 秒に初期化し 1 秒経過ごとに年月日 曜日 時分秒を time 構造体変数にコピーします 2012 年 1 月 1 日 ( 日 )0 時 0 分 0 秒に LED を点 灯します 仕様 割り込み アラーム割り込み 18
アラーム動作 秒 アラームレジスタ 分 時 日 曜日 月 年 アラーム割り込み 19
プログラム フローチャート リセット スタート main スタートアップルーチン init_port LED の初期化 init_rtc RTC 初期化 RTC 割り込み関数 (Excep_RTC_ALM) CPU 内部レジスタ クロックレート およびメモリ内の静的変数領域はスタートアップ ルーチン内で初期化されます set_alarm アラームの設定 setpsw_i( 組み込み関数 ) 割り込み許可 LED 点灯 RTE 桁上げ割り込み要求許可 秒カウンタへの桁上げで time 構造体変数を RTC の現在値で更新 追加処理 20
アラームの設定フロー リセット後は禁止なので設定不要 21
アラームレジスタ 年アラームレジスタ (RYRAR) 年アラームイネーブルレジスタ (RYRAREN) 月アラームレジスタ (RMONAR) 曜日アラームレジスタ (RWKAR) 日アラームレジスタ (RDAYAR) 時アラームレジスタ (RDAYAR) 分アラームレジスタ (RMINAR) 秒アラームレジスタ (RSECAR) AND 条件 対応するカウンタと比較する値の設定 比較を有効とするか無効とするかの設定 22
RTC コントロールレジスタ 1(RCR1) (1) 更新の確認が必要 23
RTC コントロールレジスタ 1(RCR1) (2) 24
割り込み要求レジスタ i(iri)( i = 割り込みベクタ番号 ) 周期割り込み :IR62 H/W で 1 になる 25
割り込みコントローラの設定 割り込みコントローラ CPUへ IER( 許可 ) IPR( 優先レベル ) 26
割り込み要求許可レジスタ m(ierm)(m = 02h ~ 1Fh) IER0B 27
割り込み要因プライオリティレジスタ m(iprm)(m= 00h~8Fh) アラーム割り込み :IPR3C 28
アラーム設定関数 (1) enum{sun,mon,tue,wed,thu,fri,sat}; void set_alarm(void) { // Counting? while(rtc.rcr2.bit.start!= 1); // set alarm RTC.RYRAR.WORD = 0x2012; RTC.RYRAREN.BIT.ENB = 1; RTC.RMONAR.BYTE = 0x80 0x01; RTC.RDAYAR.BYTE = 0x80 0x01; RTC.RWKAR.BYTE = 0x80 SUN; RTC.RHRAR.BYTE = 0x80 0x00; RTC.RMINAR.BYTE = 0x80 0x00; RTC.RSECAR.BYTE = 0x80 0x00; // enable alarm interrupt request RTC.RCR1.BIT.AIE = 1; while( RTC.RCR1.BIT.AIE!= 1 ); EMB=1 アラーム設定関数 (2) へ続く 29
アラーム設定関数 (2) } アラーム設定関数 (1) の続き // enable periodic interrupt request RTC.RCR1.BIT.PIE = 1; RTC.RCR1.BIT.PES = 2; // 1/64 sec // check periodic interrupt request flag // because wait for 1/64 second while( IR(RTC,PRD)!= 0 ); IR(RTC,PRD) = 0; while( IR(RTC,PRD)!= 0 ); 1/64 秒 IR(RTC,PRD) = 0; // disable periodic interrupt request RTC.RCR1.BIT.PIE = 0; // clear alarm interrupt request flag IR(RTC,ALM) = 0; // enable alarm interrupt IEN(RTC,ALM) = 1; 1/64 秒未満 // to set the priority of alarm interrupt IPR(RTC,ALM) = 1; 30
割り込み関数の作成とベクタテーブルの登録 割り込み関数 // RTCALM #pragma interrupt (Excep_RTC_ALM(vect=92)) void Excep_RTC_ALM(void) { // Lighting PORT4.DR.BIT.B7 = 0; } RTC 割り込み関数 (Excep_RTC_ALM) LED 点灯 RTE 31
END ルネサスエレクトロニクス株式会社