#include "iodefine.h"
#include "intCMT.h"
//*******************************************
//	関数名	:Init_CMT0
//	内容	:タイマー（カウンター）割り込み機能の初期化関数
//*******************************************

unsigned long _systimer=0;	//システムタイマー
unsigned long _time_div=0;	//システムタイマー分解能

void init_CMT0(int T)
{
	long int LN;

	//	CMT0の割り込みレベル（優先順位）を設定
	INTC.IPRJ.BIT._CMT0 = 0xA;	// ※(0x0:最低〜0xF:最高)

	STB.CR4.BIT._CMT=0;			// CMTモジュールのスタンバイ解除

	//設定中なのでカウンター一時停止
	CMT.CMSTR.BIT.STR0=0;	// 0：カウント停止, 1：カウント開始

	CMT0.CMCSR.BIT.CMIE=1;	// コンペアマッチ割り込み許可　※1で割り込みを行う
	CMT0.CMCSR.BIT.CKS=2;	// クロックセレクト[1,0]  10=>2：Pφ/128

	//CMCORの値を算出	Tミリ秒→LNカウント
	LN = 195312 *  T/1000;		// 25MHz/128=195312Hz(1カウント5.12μs)
	if(LN < 1) LN = 1;
	else if(LN > 0xffff) LN = 0xffff;//335msに相当
	_time_div=LN;

	CMT0.CMCNT = 0;			// カウンタリセット
	CMT0.CMCOR = (int)LN;	// カウント目標値セット
	CMT.CMSTR.BIT.STR0=1;	// CMT0カウント開始
}	

void init_CMT1(int T)
{
	long int LN;

	//	CMT1の割り込みレベル（優先順位）を設定
	INTC.IPRJ.BIT._CMT1 = 0x6;	// ※(0x0:最低〜0xF:最高)

	STB.CR4.BIT._CMT=0;			// CMTモジュールのスタンバイ解除

	//設定中なのでカウンター一時停止
	CMT.CMSTR.BIT.STR1=0;	// 0：カウント停止, 1：カウント開始

	CMT1.CMCSR.BIT.CMIE=1;	// コンペアマッチ割り込み許可　※1で割り込み許可
	CMT1.CMCSR.BIT.CKS=3;	// クロックセレクト[1,0]  11=>3：Pφ/512　取説P469

	//	1.CMCORの値を算出	Tミリ秒→LNカウント
	LN = 48828 *  T / 1000 ;	//25MHz⇒(25/512)MHz=48828Hz(1カウント20.48μs)
	if(LN < 1) LN = 1;
	else if(LN > 0xffff) LN = 0xffff; //1340msに相当

	CMT1.CMCNT = 0;			// カウンタリセット
	CMT1.CMCOR = (int)LN;	// カウント目標値セット
	CMT.CMSTR.BIT.STR1=1;	// CMT1カウント開始
}	


//****************************************************************************
//	関数名	:CMT0_INT_CMI
//	内容	:CMT0の割り込み関数
//			 関数init_CMT0で設定した周期毎に実行される
//
//			この関数は、HEWのintprg.cで定義しておく必要がある
//			※CMT0の割り込み発生時に、HEWのINT_CMT0_CMI0関数からコールされる 
//****************************************************************************
void CMT0_INT_CMI(void)
{
	CMT0.CMCSR.BIT.CMF=0;		// CMT0リスタート
	_systimer++;
}

//****************************************************************************
//	関数名	:CMT1_INT_CMI
//	内容	:CMT1の割り込み関数
//			 関数init_CMT1で設定した周期毎に実行される
//
//			この関数は、HEWのintprg.cで定義しておく必要がある
//			※CMT1の割り込み発生時に、HEWのINT_CMT1_CMI1関数からコールされる 
//****************************************************************************
void CMT1_INT_CMI(void)
{
	CMT1.CMCSR.BIT.CMF=0;		// CMT1リスタート
}

//システム時刻を取得
unsigned long getsystime(void){
	return _systimer;
}

//システム時刻を100倍分解能で取得
unsigned long getsystime2(void){
	return (_systimer*100+(CMT0.CMCNT*100/_time_div));
}
