コメントの内容はRX621のコンペアマッチタイマーに関するものです。
割込みを使わなければ動作させるのは簡単なので、参考までにコードを掲載します。
CMTサンプル
void CMT0_Init(void) { CMT0.CMCR.BIT.CKS = 3; /* PCLK/512 */ CMT0.CMCR.BIT.CMIE = 0; /* CMT Interrpt disable */ CMT0.CMCOR = 46874; /* 500ms/(512/48MHz)-1 */ return; } void CMT0_Start(void) { CMSTR0.BIT.STR0 = 1; return; } void Wait(void) { for(; !IR028.IR;) ; /* wait for Interrupt Reqest */ IR028.IR = 0; /* Interrupt Request clear */ return; } void main(void) { /* system setting */ /* pre-process */ CMT0_Init(); /* timer pre-process */ CMT0_Start(); for(;;){ /* wait pre-process */ Wait(); /* wait for passage of 500ms */ /* timer post-process */ } }
周辺クロックPCLKは48MHzであると仮定しています。本件のCMTでは割込みを利用しないためCMCRのCMIEビットは0です。これはリセット後の初期値でもあるため、設定はしなくても大丈夫です。
サンプルの使い方はポーリング向けにしていますが、Wait()関数で500ms経過まで黙んまりになってしまうので、500ms経過待ちの時も処理を行うには変更が必要です。
Wait()関数の変更例
char Wait(void) { char Ret; if(IR028.IR){ /* there're Interrupt Reqest */ IR028.IR = 0; Ret = -1; /* return TRUE */ }else{ /* no Interrupt Request */ Ret = 0; /* return FALSE */ } return Ret; } void main(void) { /* system setting */ /* pre-process */ CMT0_Init(); /* timer pre-process */ CMT0_Start(); for(;;){ /* wait pre-process */ for(; Wait();){ /* wait for passage */ } /* wait post-process */ } }
Wait()関数の中身をポーリング処理に変更しました。こうすると500msの経過を待ちつつ、空いた時間に別処理を行えます。