문제 설명
// 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 습관화 필요