RX62N 周辺機能紹介 TMR 8 ビットタイマ ルネサスエレクトロニクス株式会社ルネサス半導体トレーニングセンター 2013/08/02 Rev. 1.00 00000-A
コンテンツ TMR の概要 プログラムサンプル (1) パルス出力機能 (8 ビットモード ) プログラムサンプル (2) インターバルタイマ機能 (16 ビット コンペアマッチカウントモード ) プログラムサンプルのカスタマイズ 2
TMR の概要 3
TMR の仕様 4
TMR の動作概要 外部クロック 設定 比較 TCNT コンペアマッチ TCORA 時間 5
プログラムサンプル (1) パルス出力機能 (8 ビットモード ) 6
プログラムサンプル (1) パルス出力機能仕様 パルス出力機能のプログラム例チャネル0のパルス出力機能を用い出力端子から100KHz(10μs 周期 ) デューティ比 50% のパルスを出力する 仕様 動作モード パルス出力 チャネル チャネル0(8ビットモード ) を使用 クロックソース PCLK[48MHz] カウンタクリア コンペアマッチA カウントスタートソフトウェアトリガ 割り込み なし 出力端子 TMO0 端子 7
パルス出力の動作 カウンタ MAX = 0xFF コンペアマッチでカウンタをクリア 設定値 カウンタ 時間 電圧 デューティ比 50% のパルス 出力端子 8
プログラム フローチャート リセット スタート main スタートアップルーチン 初期化 カウント開始 init_tmr0 TMR0 初期化 start_tmr0 TMR0 カウントスタート CPU 内部レジスタ クロックレート およびメモリ内の静的変数領域はスタートアップ ルーチン内で初期化されます wait( 組み込み関数 ) 割り込み要求待ち 低消費電力モードへ遷移 パルス出力 (H/W) 9
パルス出力機能の初期化フロー 初期化開始 モジュールストップ解除 コンスタントレジスタの設定 カウンタクリア条件の設定 出力信号の設定 初期化終了 10
モジュールストップコントロールレジスタ A(MSTPCRA) ユニット 0 使用可 11
カウント値の設定 出力端子電圧 設定値 5μs 5μs 100KHz のパルスは 5μs ごとに信号がトグルする カウンタ 時間 コンスタントレジスタ値 =48 [MHz] 5[ µ s] 1 = 240 1 < 8ビット 12
タイムコンスタントレジスタ A(TCORA) 239 チャネル 0 ( カウント値 - 1) を設定 カウント値 = 240 13
タイマコントロールレジスタ (TCR) 出力端子電圧 5μs 5μs 設定値 TCORA カウンタ 時間 14
タイマコントロール / ステータスレジスタ (TCSR) 出力端子電圧 5μs 5μs 設定値 TCORA カウンタ 時間 15
パルス出力機能の初期化関数 void init_tmr0(void) { MSTP(TMR0) = 0; //set count TMR0.TCORA = 5*48-1; // TCNT0 clear by compare match A TMR0.TCR.BIT.CCLR = 0x01; // TMO0 is toggle TMR0.TCSR.BYTE = 0xE3; バイトアクセス } 初期化開始モジュールストップ解除カウント値の設定カウンタクリア条件の設定出力信号の設定 初期化終了 16
タイマカウンタコントロールレジスタ (TCCR) 0x08 初期状態カウント停止 カウント動作 17
パルス出力機能のカウント開始関数 void start_tmr0(void) { // count start // - CSS internal clock // - CKS is PCLK TMR0.TCCR.BYTE = 0x08; } main init_tmr0 TMR0 初期化 start_tmr0 TMR0 カウントスタート wait( 組み込み関数 ) 割り込み要求待ち 低消費電力モードへ遷移 18
パルス出力機能のメイン関数 void main(void) { // Initialize timer (TMR0) init_tmr0(); // TMR0 and TMR1 start start_tmr0(); while(1){ // CPU sleep wait(); } } main init_tmr0 TMR0 初期化 start_tmr0 TMR0 カウントスタート wait( 組み込み関数 ) 割り込み要求待ち 低消費電力モードへ遷移 19
プログラムサンプル (2) インターバルタイマ機能 (16 ビット コンペアマッチカウントモード ) 20
プログラムサンプル (2) インターバルタイマ機能仕様 インターバルタイマ機能のプログラム例チャネル 0 1 のインターバル タイマ機能を用い 1000ms 毎に LED1 を点滅する 仕様 動作モード チャネル クロックソース コンペアマッチ カウンタクリア インターバルタイマチャネル0 1( 16ビット コンペアマッチカウントモード ) を使用 PCLK[48MHz] チャネル0=20msec 周期チャネル1=TMR0のコンペアマッチ50 回 (20ms 50=1000ms) チャネル0=コンペアマッチA チャネル1=コンペアマッチA カウントスタートソフトウェアトリガ 割り込みチャネル1のコンペアマッチA 割り込み 21
コンペアマッチカウントモードの動作 チャネル 0 と 1 を組み合わせて使用する チャネル0のカウンタ MAX = 0xFF 設定値 クロックをカウント チャネル1のカウンタ MAX = 0xFF 20ms 設定値 チャネル 0 のコンペアマッチ回数をカウント 50 回 22
プログラム フローチャート リセット スタート main スタートアップルーチン init_port LED の初期化 初期化 カウント開始 init_tmr01 TMR0,1 初期化 start_tmr01 TMR0 カウントスタート setpsw_i( 組み込み関数 ) 割り込み許可 TMR1 割り込み関数 (Excep_TMR1_CMI1A) LED 制御 RTE CPU 内部レジスタ クロックレート およびメモリ内の静的変数領域はスタートアップ ルーチン内で初期化されます wait( 組み込み関数 ) 割り込み要求待ち 低消費電力モードへ遷移 割り込み要求 (H/W) 23
コンペアマッチカウントモードの初期化フロー 初期化開始 モジュールストップ解除 チャネル 0,1 のカウント値の設定 チャネル 0,1 のカウンタクリア条件の設定 チャネル 1 のクロックソースの設定 割り込み許可 割り込みコントローラの割り込み許可 割り込み要求の許可 割り込み優先レベルの設定 初期化終了 24
カウント値の設定 チャネル 0 コンスタントレジスタ値 =48 [MHz] 20[ms] 1=960K 1 > 8ビット 48[MHz] 20[ms] = 8192 117 1< 8ビット 1 = 117.1875-1 チャネル 1 コンスタントレジスタ値 =50 1 0.1875[ 回 ] 誤差 [ 時間 ] = =32[ µ s] 48[MHz] 8192 誤差 [ 時間 ] = 50[ 回 ] 32[ µ s] =1.6[ms] 25
タイムコンスタントレジスタ A(TCORA) 116 49 チャネル 0 ( カウント値 - 1) を設定 チャネル 1 チャネル 0 のカウント値 = 117 チャネル 1 のカウント値 = 50 26
タイマカウンタコントロールレジスタ (TCCR) 27
コンペアマッチカウントモードの初期化関数 (1) void init_tmr01(void) { // Wakeup TMR0,TMR1 MSTP(TMR0) = 0; // TCORA is 20ms count // 48000KHz(48MHz)*20/8192 TMR0.TCORA = 48000*20/8192-1; // TCORA is 50 count TMR1.TCORA = 50-1; // TCNT0 clear by compare match A TMR0.TCR.BIT.CCLR = 1; TMR1.TCR.BIT.CCLR = 1; // TCNT0 counts for compare match of TCORA TMR1.TCCR.BIT.CSS = 3; // CMIEA is enable TMR1.TCR.BIT.CMIEA = 1; // CMIA1 is enable IEN( TMR1, CMIA1 ) = 1; // CMIA1 interrupt Level is 1 IPR( TMR1, CMIA1 ) = 1; } 初期化開始モジュールストップ解除チャネル0,1のカウント値の設定チャネル0,1のカウンタクリア条件の設定チャネル1のクロックソースの設定割り込み許可割り込みコントローラの割り込み許可割り込み優先レベルの設定初期化終了 28
割り込みのタイミング チャネル0のカウンタ MAX = 0xFF 設定値 クロックをカウント チャネル1のカウンタ MAX = 0xFF 設定値 割り込み チャネル 0 のコンペアマッチ回数をカウント 29
タイマコントロールレジスタ (TCR) 30
割り込みコントローラの設定 割り込みコントローラ CPUへ IER( 許可 ) IPR( 優先レベル ) 31
割り込み要求許可レジスタ m(ierm)(m = 02h ~ 1Fh) IER16 32
割り込み要因プライオリティレジスタ m(iprm)(m= 00h~8Fh) チャネル 1 のコンペアマッチ A 割り込み :IPR69 33
コンペアマッチカウントモードの初期化関数 ~ 割り込みの設定 ~ void init_tmr01(void) { // Wakeup TMR0,TMR1 MSTP(TMR0) = 0; // TCORA is 20ms count // 48000KHz(48MHz)*20/8192 TMR0.TCORA = 48000*20/8192-1; // TCORA is 50 count TMR1.TCORA = 50-1; // TCNT0 clear by compare match A TMR0.TCR.BIT.CCLR = 1; TMR1.TCR.BIT.CCLR = 1; // TCNT0 counts for compare match of TCORA TMR1.TCCR.BIT.CSS = 3; // CMIEA is enable TMR1.TCR.BIT.CMIEA = 1; // CMIA1 is enable IEN( TMR1, CMIA1 ) = 1; // CMIA1 interrupt Level is 1 IPR( TMR1, CMIA1 ) = 1; } 初期化開始モジュールストップ解除チャネル0,1のカウント値の設定チャネル0,1のカウンタクリア条件の設定チャネル1のクロックソースの設定割り込み許可割り込みコントローラの割り込み許可割り込み優先レベルの設定初期化終了 34
割り込み関数の作成とベクタテーブルの登録 // TMR1_CMI1A #pragma interrupt (Excep_TMR1_CMI1A(vect=177)) void Excep_TMR1_CMI1A(void) { // Invert P47(LED) PORT4.DR.BIT.B7 ^= 1; } TMR1 割り込み関数 (Excep_TMR1_CMI1A) LED 制御 RTE 35
タイマカウンタコントロールレジスタ (TCCR) 0x0E 初期状態カウント停止 カウント動作 36
コンペアマッチカウントモードのカウント開始関数 main void start_tmr0(void) { // count start // - CSS internal clock // - CKS is PCLK/8192 TMR0.TCCR.BYTE = 0x0E; } init_port LED の初期化 init_tmr01 TMR0,1 初期化 start_tmr01 TMR0 カウントスタート setpsw_i( 組み込み関数 ) 割り込み許可 wait( 組み込み関数 ) 割り込み要求待ち 低消費電力モードへ遷移 37
コンペアマッチカウントモードのメイン関数 void main(void) { // Initialize for LED init_port(); // Initialize timer (TMR0,TMR1) init_tmr01(); // TMR0 and TMR1 start start_tmr01(); // Interrupt enable (CPU) setpsw_i(); while(1){ // CPU sleep wait(); } } main init_port LED の初期化 init_tmr01 TMR0,1 初期化 start_tmr01 TMR0 カウントスタート setpsw_i( 組み込み関数 ) 割り込み許可 wait( 組み込み関数 ) 割り込み要求待ち 低消費電力モードへ遷移 38
プログラムサンプルのカスタマイズ 39
16 ビットモード (16 ビットカウントモード ) の動作 チャネル 0: 上位 8 ビット 外部クロック チャネル 1: 下位 8 ビット 16 ビットの比較 40
8 ビットモードから 16 ビットモード (16 ビットカウントモード ) への変更 void init_tmr0(void) { // Wakeup unit 0 of TMR MSTP(TMR0) = 0; // set count TMR0.TCORA = 48*5-1; // 48M*5μ=24*5 } 100KHz のパルス出力 // TCNT0 clear by compare match A TMR0.TCR.BIT.CCLR = 0x01; // TMO0 is toggle TMR0.TCSR.BYTE = 0xE3; 10kHz のパルス出力 void init_tmr01(void) { // Wakeup unit 0 of TMR MSTP(TMR0) = 0; // Cascade TMR0.TCCR.BIT.CSS = 3; // set count TMR01.TCORA =48*50-1; // TCNT0 clear by compare match A TMR0.TCR.BIT.CCLR = 0x01; } // TMO0 is toggle TMR0.TCSR.BYTE = 0xE3; カスケード接続 16 ビットアクセス カウントクリア条件の設定はチャネル 0 void start_tmr0(void) { // count start // - CSS internal clock // - CKS is PCLK TMR0.TCCR.BYTE = 0x08; } void start_tmr01(void) { // count start // - CSS internal clock // - CKS is PCLK TMR1.TCCR.BYTE = 0x08; } クロックの設定はチャネル 1 41
END ルネサスエレクトロニクス株式会社