C

RX621 コンペアマッチタイマの使い方

かふぇルネに投稿しました

コメントの内容は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の経過を待ちつつ、空いた時間に別処理を行えます。

ABOUT ME
Nozomu.Kon
トータルソフトウェアコーディネーターがあなたのお困りを即時に解決!