문제 설명
// timer.c
void TIM4_Repeat(int time)
{
Macro_Set_Bit(RCC->APB1ENR, 2);
// TIM4 CR1: ARPE=0, down counter, repeat mode
// PSC(50KHz), ARR(reload시 값) 설정
// UG 이벤트 발생
// Update Interrupt Pending Clear
// Update Interrupt Enable
// TIM4 start
}
int TIM4_Check_Timeout(void)
{
// 타이머가 timeout 이면 1 리턴, 아니면 0 리턴
}
void TIM4_Stop(void)
{
Macro_Clear_Bit(TIM4->CR1, 0);
Macro_Clear_Bit(TIM4->DIER, 0);
Macro_Clear_Bit(RCC->APB1ENR, 2);
}
정답 코드
#include "device_driver.h"
#define TIM2_TICK (20) // usec
#define TIM2_FREQ (1000000/TIM2_TICK) // Hz
#define TIME2_PLS_OF_1ms (1000/TIM2_TICK)
#define TIM2_MAX (0xffffu)
#define TIM4_TICK (20) // usec
#define TIM4_FREQ (1000000/TIM4_TICK) // Hz
#define TIME4_PLS_OF_1ms (1000/TIM4_TICK)
#define TIM4_MAX (0xffffu)
void TIM2_Stopwatch_Start(void)
{
Macro_Set_Bit(RCC->APB1ENR, 0);
TIM2->CR1 = (1<<4)|(1<<3);
TIM2->PSC = (unsigned int)(TIMXCLK/50000.0 + 0.5)-1;
TIM2->ARR = TIM2_MAX;
Macro_Set_Bit(TIM2->EGR,0);
Macro_Set_Bit(TIM2->CR1, 0);
}
unsigned int TIM2_Stopwatch_Stop(void)
{
unsigned int time;
Macro_Clear_Bit(TIM2->CR1, 0);
time = (TIM2_MAX - TIM2->CNT) * TIM2_TICK;
return time;
}
/* Delay Time Max = 65536 * 20use = 1.3sec */
#if 0
void TIM2_Delay(int time)
{
Macro_Set_Bit(RCC->APB1ENR, 0);
TIM2->CR1 = (1<<4)|(1<<3);
TIM2->PSC = (unsigned int)(TIMXCLK/(double)TIM2_FREQ + 0.5)-1;
TIM2->ARR = TIME2_PLS_OF_1ms * time;
Macro_Set_Bit(TIM2->EGR,0);
Macro_Clear_Bit(TIM2->SR, 0);
Macro_Set_Bit(TIM2->DIER, 0);
Macro_Set_Bit(TIM2->CR1, 0);
while(Macro_Check_Bit_Clear(TIM2->SR, 0));
Macro_Clear_Bit(TIM2->CR1, 0);
Macro_Clear_Bit(TIM2->DIER, 0);
}
#else
/* Delay Time Extended */
void TIM2_Delay(int time)
{
int i;
unsigned int t = TIME2_PLS_OF_1ms * time;
Macro_Set_Bit(RCC->APB1ENR, 0);
TIM2->PSC = (unsigned int)(TIMXCLK/(double)TIM2_FREQ + 0.5)-1;
TIM2->CR1 = (1<<4)|(1<<3);
TIM2->ARR = 0xffff;
Macro_Set_Bit(TIM2->EGR,0);
Macro_Set_Bit(TIM2->DIER, 0);
for(i=0; i<(t/0xffffu); i++)
{
Macro_Set_Bit(TIM2->EGR,0);
Macro_Clear_Bit(TIM2->SR, 0);
Macro_Set_Bit(TIM2->CR1, 0);
while(Macro_Check_Bit_Clear(TIM2->SR, 0));
}
TIM2->ARR = t % 0xffffu;
Macro_Set_Bit(TIM2->EGR,0);
Macro_Clear_Bit(TIM2->SR, 0);
Macro_Set_Bit(TIM2->CR1, 0);
while (Macro_Check_Bit_Clear(TIM2->SR, 0));
Macro_Clear_Bit(TIM2->CR1, 0);
Macro_Clear_Bit(TIM2->DIER, 0);
}
#endif
void TIM4_Repeat(int time)
{
Macro_Set_Bit(RCC->APB1ENR, 2);
TIM4->CR1 = (1<<4)|(0<<3);
TIM4->PSC = (unsigned int)(TIMXCLK/(double)TIM4_FREQ + 0.5)-1;
TIM4->ARR = TIME4_PLS_OF_1ms * time - 1;
Macro_Set_Bit(TIM4->EGR,0);
Macro_Clear_Bit(TIM4->SR, 0);
Macro_Set_Bit(TIM4->DIER, 0);
Macro_Set_Bit(TIM4->CR1, 0);
}
int TIM4_Check_Timeout(void)
{
if(Macro_Check_Bit_Set(TIM4->SR, 0))
{
Macro_Clear_Bit(TIM4->SR, 0);
return 1;
}
else
{
return 0;
}
}
void TIM4_Stop(void)
{
Macro_Clear_Bit(TIM4->CR1, 0);
Macro_Clear_Bit(TIM4->DIER, 0);
}
메모
printf 내부의 \n 습관화 필요