LoginSignup
0
0

More than 3 years have passed since last update.

Delay関数(コンペアマッチタイマー CMT)

Last updated at Posted at 2020-07-18

はじめに

コンペアマッチタイマー CMTで作成するDelay関数の設定諸々についての記述.マイコンボードはGR-CITRUSとする.ハードウェアマニュアルの参考先はHM *.*.*と表記する(例:HM 3.3.4ならばハードウェアマニュアルの3.3.4節を参考).

資料(必需品)
RX63Nグループ、RX631グループ ユーザーズマニュアル
GR-CITRUS回路図

Delay関数の作成

初期化関数

Timer割り込みの時と異なり,初期化の時点ではタイマーを動作させない.

"hwsetup.c"
void CMT0_init(void);

void HardwareSetup(void)
{
     CMT0_init();
}
/*=================================
 * 関数名 : CMT0_init
 * 機能 : CMT0の初期化
 * 引数 : なし
 * 戻り値 : なし
 * 備考 :設定周期 :1ms 割り込み優先度:4
 * ===============================*/
void CMT0_init(void)
{
    /*=== プロテクト解除 ===*/
    SYSTEM.PRCR.WORD = 0xA502;
    /*=== CMTを有効化 ===*/
    MSTP(CMT0) = 0;
    /*=== プロテクト ===*/
    SYSTEM.PRCR.WORD = 0xA500;
    /*=== CMT動作停止 ===*/
    CMT.CMSTR0.BIT.STR0 = 0;
    /*=== CMT設定 ===
     * クロック選択 : PCLK/8 = 6MHz
     * CMT割り込み許可
     * ===========*/
    CMT0.CMCR.BIT.CKS =0;
    CMT0.CMCR.BIT.CMIE = 1;
    /*=== カウントリセット ===*/
    CMT0.CMCNT = 0;
    /*=== 周期カウント設定 ===
     * 設定周期 : 1ms
     * CMCOR = 設定周期[s]*PCLKB[Hz]/分周比-1
     * ================*/
    CMT0.CMCOR = 5999;
    /*=== CMT動作開始 ===*/
    CMT.CMSTR0.BIT.STR0 = 1;
    /*=== 割り込み優先度設定 ===*/
    IPR(CMT0,CMI0) = 4;
    /*=== 割り込み許可 ===*/
    IEN(CMT0,CMI0) = 1;
}

Delay関数

icu_cmt.h
void Delay(unsigned int time);
icu_cmt.c
#include"iodefine.h"
#include"icu_cmt.h"
/*=================================
 * 関数名 : Delay
 * 機能 : 任意時間待機する
 * 引数 : 待機時間[ms]
 * 戻り値 : なし
 * 備考 :
 * ===============================*/
void Delay(unsigned int time)
{
    int i;
    /*=== カウントリセット ===*/
    CMT0.CMCNT = 0;
    /*=== time[ms]待機 ===*/
    for(i=0;i<time ; i++)
    {
        while( IR(CMT0,CMI0) == 0 );
        CMT0.CMCNT = 0;
        IR(CMT0,CMI0) = 0;
    }
}

IR(CMT0,CMI0)は割り込み要求が発生した時に1になるマクロ関数.必要に応じて関数内でクロックの動作開始終了を記述する.その場合,初期化関数のカウント開始はコメントアウトする.(他の割り込みの時にカウントできなくなるトラブルがあったので使いどころに注意)

void Delay(unsigned int time)
{
    int i;
    /*=== カウント開始 ===*/
    CMT.CMSTR0.BIT.STR0=1;
    /*=== カウントリセット ===*/
    CMT0.CMCNT = 0;
    /*=== time[ms]待機 ===*/
    for(i=0;i<time ; i++)
    {
        while(!IR(CMT0,CMI0));
        CMT0.CMCNT = 0;
        IR(CMT0,CMI0) = 0;
    }
    /*=== カウント停止 ===*/
    CMT.CMSTR0.BIT.STR0=0;
}

他の割り込みがある場合は注意が必要な関数.

"HelloWorld.c"
#include"iodefine.h"
#include"icu_cmt.h"

void main(void)
{
    while(1)
    {

        LED = LED_ON;
        Delay(1000);
        LED = LED_OFF;
        Delay(1000);

    }
}

参考文献

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0