忘備録-備忘録

技術的な備忘録

RX62Nのタイマを使うその2

2015-11-25 14:06:39 | RX62N
RX62NのタイマCMTを使いusオーダーで時間待ちするプログラムです。割り込みを使用しています。頻繁に割り込みが発生するので実用的かどうかはわかりません。

  1. #include <machine.h>
  2. #include "timer.h"
  3. #include "iodefine.h"
  4. #include "vect.h"
  5. #define PCLK    48    //PCLK = 48MHz
  6. /* 1usecでカウントアップする変数 */
  7. static volatile unsigned int utimer;
  8. /*
  9.    タイマ初期化 使用するタイマCMT1
  10.    引数  無し
  11.    戻り値 無し
  12. */
  13. void initTimer(void)
  14. {
  15.     MSTP(CMT1) = 0;                                    // enable CMT1
  16.     CMT1.CMCR.WORD = 0x0040;                        // 1/8
  17.     //CMT1.CMCOR = PCLK*1000000L/1000L/8L - 1;        // 1000Hz(1ms)
  18.     CMT1.CMCOR = PCLK*1000000L/1000000L/8L - 1;        // 1MHz(1us)
  19.     ICU.IER[IER_CMT1_CMI1].BIT.IEN_CMT1_CMI1 = 1;    //Enable CMIE
  20.     ICU.IPR[IPR_CMT1_CMI1].BYTE = 8;                // Set interrupt priority level
  21.     CMT.CMSTR0.WORD |= 0x0002;                        // start CMT0 CMT1
  22.     
  23.     utimer = 0;    //タイマの初期化
  24. }
  25. /*
  26.    タイマカウンタの初期化
  27.    引数  タイマ番号
  28.    戻り値 無し
  29. */
  30. void clearTimer(void)
  31. {
  32.     utimer = 0;
  33. }
  34. /*
  35.    タイマの値を取得する
  36.    引数  タイマ番号
  37.    戻り値 タイマの値
  38. */
  39. unsigned int getTimer(void)
  40. {
  41.     return utimer;
  42. }
  43. /*
  44.    mSec単位でウェイトをかける
  45.    引数   待ち時間 ミリ秒
  46.    戻り値  無し
  47. */
  48. void delay_ms(unsigned int ms)
  49. {
  50.     unsigned int us;
  51.     us = 1000*ms;
  52.     clearTimer();
  53.     while(getTimer()<=us);
  54. }
  55. /*
  56.    uSec単位でウェイトをかける
  57.    引数   待ち時間 マイクロ秒
  58.    戻り値  無し
  59. */
  60. void delay_us(unsigned int us)
  61. {
  62.     clearTimer();
  63.     while(getTimer()<=us);
  64. }
  65. /*
  66.    タイマ割込みプログラム
  67.    CMT1割込みで起動
  68. */
  69. void Excep_CMT1_CMI1(void)
  70. {
  71.     utimer++;
  72. }

RX62Nのタイマを使うその1

2015-11-25 14:01:23 | RX62N
RX62NのタイマMTUを使いmsオーダーで時間待ちするプログラムです。割り込みを使用していません。

  1. #include "iodefine.h"
  2. /*
  3.  * タイマの初期化
  4.  *  使用タイマ MTU8
  5.  * 割込みは使用しないがフラグは使用する。
  6.  */
  7. void initTimer(void)
  8. {
  9.     MSTP(MTU8) = 0;
  10.     MTU8.TCR.BYTE = 0x43;
  11.     MTU8.TIER.BIT.TGIEB = 1;
  12.     MTU8.TCNT = 0;                
  13.     MTU8.TGRB = 750 - 1;        /* PCLK = 48MHzで1msecごとに割り込み        */
  14.     IR(MTU8,TGIB8) = 0;
  15. }
  16. /*
  17.  * タイマスタート
  18.  */
  19. void startMTU(void)
  20. {    
  21.     MTU8.TCNT = 0;
  22.     MTUB.TSTR.BIT.CST2 = 1;            /* Start MTU2_8 */
  23. }
  24. /*
  25.  * タイマストップ
  26.  */
  27. void stopMTU(void)
  28. {    
  29.     MTUB.TSTR.BIT.CST2 = 0;            /* Stop MTU2_8 */
  30. }
  31. /*
  32.  * 1msec経過したかチェック(割込みフラグをポーリング)
  33.  */
  34. unsigned char checkIRFlag(void)
  35. {
  36.     if(IR(MTU8,TGIB8) == 1)
  37.     {
  38.         IR(MTU8,TGIB8) = 0;
  39.         return(1);
  40.     }
  41.     else
  42.     {
  43.         return(0);
  44.     }
  45. }
  46. /*
  47.  * msecオーダーでの時間待ち
  48.  */
  49. void delay_ms(unsigned int ms)
  50. {
  51.     startMTU();
  52.     while(ms > 0) {
  53.         if( checkIRFlag() == 1 ) {
  54.             ms--;
  55.         }
  56.     }
  57.     stopMTU();
  58. }