RX62N 周辺機能紹介 CMT コンペアマッチタイマ ルネサスエレクトロニクス株式会社ルネサス半導体トレーニングセンター 2013/08/02 Rev. 1.00 00000-A
コンテンツ CMT の概要 プログラムサンプル プログラムサンプルのカスタマイズ 2
CMT の概要 3
CMT の仕様 CMT ユニット 0 チャネル 16ビットタイマ CMT0 CMT1 ユニット 1 CMT2 CMT3 4
CMT の動作概要 設定 比較 5
プログラムサンプル 6
サンプル プログラム仕様 CMT のプログラム例 CMT0 を用い 500ms 毎に LED を点滅する 仕様 チャネル クロックソース 割り込み チャネル0を使用 PCLK[48MHz] コンペアマッチ割り込み 7
プログラム フローチャート リセット スタート main スタートアップルーチン init_port LED の初期化 初期化 カウント開始 init_cmt0 CMT0 初期化 start_cmt0 CMT0 カウントスタート setpsw_i( 組み込み関数 ) 割り込み許可 CMT0 割り込み関数 (Excep_CMTU0_CMT0) LED 点滅 RTE CPU 内部レジスタ クロックレート およびメモリ内の静的変数領域はスタートアップ ルーチン内で初期化されます wait( 組み込み関数 ) 割り込み要求待ち 低消費電力モードへ遷移 割り込み要求 (H/W) 8
コンペアマッチカウントモードの初期化フロー 初期化開始 モジュールストップ解除 内部クロックの設定 コンスタントレジスタの設定 割り込み許可 割り込み要求の許可 割り込みコントローラの割り込み許可 割り込み優先レベルの設定 初期化終了 9
モジュールストップコントロールレジスタ A(MSTPCRA) ユニット 0 使用可 10
カウント値の設定 コンスタントレジスタ値 =48 [MHz] 500[ms] 1 = 24M 1 > 16ビット 48[MHz] 500[ms] = 1 = 46875-1 < 16ビット 512 11
コンペアマッチタイマコントロールレジスタ (CMCR)(1) 12
コンペアマッチタイマコンスタントレジスタ (CMCOR) 46874 ( カウント値 - 1) を設定 カウント値 = 46875 13
コンペアマッチカウントモードの初期化関数 (1) void init_cmt0(void) { // Wakeup unit 0 MSTP(CMT0) = 0; // Clock select is PCLK/512 CMT0.CMCR.WORD = 0x0083; // Counts for 500ms(48000kHz(48MHz) *500ms/512) CMT0.CMCOR = 48000*500/512-1; } // CMI0 interrupt is enabled CMT0.CMCR.WORD = 0x0080 0x0040; // CMI0 interrupt request is enabled IEN(CMT0,CMI0) = 1; // CMI0 interrupt priority level is 1 IPR(CMT0,CMI0) = 1; 初期化開始モジュールストップ解除内部クロックの設定コンスタントレジスタの設定割り込み許可割り込みコントローラの割り込み許可 割り込み優先レベルの設定 初期化終了 14
コンペアマッチタイマコントロールレジスタ (CMCR) (2) 15
割り込みコントローラの設定 CPUへ割り込みコントローラ IER( 許可 ) IPR( 優先レベル ) 16
割り込み要求許可レジスタ m(ierm)(m = 02h ~ 1Fh) IER03 17
割り込み要因プライオリティレジスタ m(iprm)(m= 00h~8Fh) コンペアマッチ割り込み :IPR04 18
コンペアマッチカウントモードの初期化関数 (2) void init_cmt0(void) { // Wakeup unit 0 MSTP(CMT0) = 0; // Clock select is PCLK/512 CMT0.CMCR.WORD = 0x0083; // Counts for 500ms(48000kHz(48MHz) *500ms/512) CMT0.CMCOR = 48000*500/512-1; } // CMI0 interrupt is enabled CMT0.CMCR.WORD = 0x0080 0x0040; // CMI0 interrupt request is enabled IEN(CMT0,CMI0) = 1; // CMI0 interrupt priority level is 1 IPR(CMT0,CMI0) = 1; 初期化開始モジュールストップ解除内部クロックの設定コンスタントレジスタの設定割り込み許可割り込みコントローラの割り込み許可 割り込み優先レベルの設定 初期化終了 19
割り込み関数の作成とベクタテーブルの登録 // CMTU0_CMT0 #pragma interrupt (Excep_CMTU0_CMT0(vect=28)) void Excep_CMTU0_CMT0(void) { // Invert P47(LED1) PORT4.DR.BIT.B7 ^= 1; } CMT0 割り込み関数 (Excep_CMTU0_CMT0) LED 点滅 RTE 20
コンペアマッチカウントモードのカウント開始関数 main init_port LED の初期化 void start_cmt0(void) { // Start CMT0 CMT.CMSTR0.BIT.STR0 = 1; } init_cmt0 CMT0 初期化 start_cmt0 CMT0 カウントスタート setpsw_i( 組み込み関数 ) 割り込み許可 wait( 組み込み関数 ) 割り込み要求待ち 低消費電力モードへ遷移 21
コンペアマッチタイマスタートレジスタ 0(CMSTR0) 22
コンペアマッチカウントモードのメイン関数 メイン関数 void main(void) { // LED Initialization init_port(); // CMT0 Initialization init_cmt0(); // CMT0 count start start_cmt0(); // Interrupt enable (CPU) setpsw_i(); while(1){ // CPU sleep wait(); } } main init_port LED の初期化 init_cmt0 CMT0 初期化 start_cmt0 CMT0 カウントスタート setpsw_i( 組み込み関数 ) 割り込み許可 wait( 組み込み関数 ) 割り込み要求待ち 低消費電力モードへ遷移 23
プログラムサンプルのカスタマイズ 24
周期の変更 500ms 周期 void init_cmt0(void) { // Wakeup unit 0 MSTP(CMT0) = 0; // Clock select is PCLK/512 CMT0.CMCR.WORD = 0x0083; // Counts for 500ms(48000KHz(48MHz)*500/512) CMT0.CMCOR = 48000*500/512-1; 100ms 周期 void init_cmt0(void) { // Wakeup unit 0 MSTP(CMT0) = 0; // Clock select is PCLK/512 CMT0.CMCR.WORD = 0x0083; // Counts for 100ms(48000KHz(48MHz)*100/512) CMT0.CMCOR = 48000*100/512-1; 25
END ルネサスエレクトロニクス株式会社