[FRDM-KL25Z] Kinetis - Timer 테스트
KL25Z 타이머 테스트 정리
Timer
-Six channel Timer/PWM (TPM)
-Two 2-channel Timer/PWM (TPM)
-Periodic interrupt timers
-16-bit low-power timer (LPTMR)
-Real-time clock
KL25Z 타이머 레지스터
PIT_LDVALn
Timer Start Value
Sets the timer start value. The timer will count down until it reaches 0, then it will generate an interrupt and
load this register value again. Writing a new value to this register will not restart the timer; instead the
value will be loaded after the timer expires. To abort the current cycle and start a timer period with the new
value, the timer must be disabled and enabled again.
PIT Lower Lifetime Timer Register (PIT_LTMR64L)
Freescale 사의 Kinetis 시리즈에서 특이한점으로 64비트 타이머가 있다.
타이머 0, 1을 이용하여 64비트 타이머로 사용할 수 있다고 한다. 레지스터 LTMR64H를 먼저 읽고 LTMR64L를 읽으면 된다.
KL25Z 타이머 초기화 함수
void Timer1_Init(void)
{
SIM_SCGC6 |= SIM_SCGC6_PIT_MASK; // enable PIT module
//Enable PIT Interrupt in NVIC
enable_irq(INT_PIT - 16);
//MCR레지스터의 MDIS(BIT30)비트가 0이 되면 Timer Enable 된다.
Cbi(PIT_MCR, BIT30);
PIT_TCTRL1 = 0x00; // disable PIT0
//타이머 시작값
PIT_LDVAL1 = 48000;
// enable PIT0 and interrupt
PIT_TCTRL1 = PIT_TCTRL_TIE_MASK;
// clear flag
PIT_TFLG1 = 0x01;
//Start Timer
Sbi(PIT_TCTRL1, PIT_TCTRL_TEN_MASK);
}
KL25Z 타이머 인터럽트 핸들러
#undef VECTOR_038
#define VECTOR_038 Pit1_isrv
extern void Pit1_isrv(void);
//-----------------------------------------------------------------------------
// Timer1 Interrupt Handler
void Pit1_isrv(void)
{
PIT_TFLG1 = 0x01; // clear flag
gTimerTick1_1ms++;
}
//-----------------------------------------------------------------------------
KL25Z 타이머 테스트 예제코드
KL25Z 의 타이머를 이용하여 1초단위로 Led를 On/Off 하는 예제
int main (void)
{
_SystemInit();
Led1Init();
Led1Off();
Led2Init();
Led2On();
DebugInit(BAUD_115200);
DebugPrint("LKM25 Timer Test\r\n");
Timer1_Init();
while(1)
{
if(gTimerTick1_1ms>1000)
{
gTimerTick1_1ms = 0;
Led1Toggle();
}
}
}