Home > Study > C Language > ARM System Programming > [ex14] TIMER_DRIVER_LAB #1 TIM2 stopwatch test

[ex14] TIMER_DRIVER_LAB #1 TIM2 stopwatch test
Study Language

문제 설명


// timer.c
void TIM2_Stopwatch_Start(void)
{
	Macro_Set_Bit(RCC->APB1ENR, 0);

	// TIM2 CR1 설정: down count, one pulse
	// PSC 초기값 설정 => 20usec tick이 되도록 설계 (50KHz)
	// ARR 초기값 설정 => 최대값 0xFFFF 설정
	// UG 이벤트 발생
	// TIM2 start

}

unsigned int TIM2_Stopwatch_Stop(void)
{
	unsigned int time;

	// TIM2 stop
	// CNT 초기 설정값 (0xffff)와 현재 CNT의 펄스수 차이를 구하고
	// 그 펄스수 하나가 20usec이므로 20을 곱한값을 time에 저장
	// 계산된 time 값을 리턴(단위는 usec)

}

정답 코드


#define TIM2_TICK		20 // usec
#define TIM2_FREQ		(1000000./TIM2_TICK)  // Hz
#define TIM2_CNT_MAX	0xFFFF	

void TIM2_Stopwatch_Start(void)
{
	Macro_Set_Bit(RCC->APB1ENR, 0);

	// TIM2 CR1 설정: down count, one pulse
	TIM2->CR1 = (0x3<<3);

	// PSC 초기값 설정 => 20usec tick이 되도록 설계 (50KHz)
	TIM2->PSC = (int)((TIMXCLK / TIM2_FREQ) + 0.5) - 1;

	// ARR 초기값 설정 => 최대값 0xFFFF 설정
	TIM2->ARR = TIM2_CNT_MAX;

	// UG 이벤트 발생
	Macro_Set_Bit(TIM2->EGR, 0);

	// TIM2 start
	Macro_Set_Bit(TIM2->CR1, 0);
}

unsigned int TIM2_Stopwatch_Stop(void)
{
	unsigned int time;
	// TIM2 stop
	Macro_Clear_Bit(TIM2->CR1, 0);

	// CNT 초기 설정값 (0xffff)와 현재 CNT의 펄스수 차이를 구하고
	// 그 펄스수 하나가 20usec이므로 20을 곱한값을 time에 저장
	time = (TIM2->ARR - TIM2->CNT) * TIM2_TICK;
	
	// 계산된 time 값을 리턴(단위는 usec)
	return time;
}

메모


printf 내부의 \n 습관화 필요