[LPC1K EVM] LPC1114 타이머 테스트 - 1초 만들기
CortexM0의 SysTick Timer 를 이용하여 1ms마다 인터럽트 발생하게 하여 1초간격으로 구동할 수 있다.
SysTick Timer는 24bit down counter타이머로 아래와 같은 구조를 가지고 있다.
인터럽트 핸들러(SysTick_Handler) 정의 해 주고 SysTick_Config()함수로 주기를 설정하면 된다.
여기서는 메인 클럭이 48Mhz이므로 1ms로 설정하기 위해 4800/48000000 = 0.001, 1ms로 설정 할 수 있다.
SysTick 타이머 초기화
SysTick_Config 함수는 core_cm0.h 에 정의되어 있다.
인터럽트 핸들러
LPC1114 타이머 테스트 예제코드
Timer32 사용하기
LPC11xx는 SysTick Timer외에 2개의 32bit 타이머와 2개의 16bit타이머가 있다.
타이머 초기화 함수
인터럽트 핸들러
LPC1114 Timer32 이용 테스트 예제 소스코드
int main()
{
SystemInit();
Led1Init();
Led1Off();
Led2Init();
Led2Off();
//SysTick 설정
InitTimer32B0(TIME_INTERVAL);
while(1)
{
//1초마다 Led 점등
if(TimeTick1_1ms>1000)
{
Led1Toggle();
TimeTick1_1ms = 0;
}
}
return 0;
}
CortexM0의 SysTick Timer 를 이용하여 1ms마다 인터럽트 발생하게 하여 1초간격으로 구동할 수 있다.
SysTick Timer는 24bit down counter타이머로 아래와 같은 구조를 가지고 있다.
인터럽트 핸들러(SysTick_Handler) 정의 해 주고 SysTick_Config()함수로 주기를 설정하면 된다.
여기서는 메인 클럭이 48Mhz이므로 1ms로 설정하기 위해 4800/48000000 = 0.001, 1ms로 설정 할 수 있다.
SysTick 타이머 초기화
SysTick_Config 함수는 core_cm0.h 에 정의되어 있다.
static __INLINE uint32_t SysTick_Config(uint32_t ticks)
{
if (ticks > SYSTICK_MAXCOUNT) return (1); /* Reload value impossible */
SysTick->LOAD = (ticks & SYSTICK_MAXCOUNT) - 1; /* set reload register */
NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1); /* set Priority for Cortex-M0 System Interrupts */
SysTick->VAL = (0x00); /* Load the SysTick Counter Value */
SysTick->CTRL = (1 << SYSTICK_CLKSOURCE) | (1<<SYSTICK_ENABLE) | (1<<SYSTICK_TICKINT); /* Enable SysTick IRQ and SysTick Timer */
return (0); /* Function successful */
}
{
if (ticks > SYSTICK_MAXCOUNT) return (1); /* Reload value impossible */
SysTick->LOAD = (ticks & SYSTICK_MAXCOUNT) - 1; /* set reload register */
NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1); /* set Priority for Cortex-M0 System Interrupts */
SysTick->VAL = (0x00); /* Load the SysTick Counter Value */
SysTick->CTRL = (1 << SYSTICK_CLKSOURCE) | (1<<SYSTICK_ENABLE) | (1<<SYSTICK_TICKINT); /* Enable SysTick IRQ and SysTick Timer */
return (0); /* Function successful */
}
인터럽트 핸들러
//-----------------------------------------------------------------------------
//SysTick interrupt handler
void SysTick_Handler(void)
{
Led2Toggle();
TimeTick1_1ms++;
}
//-----------------------------------------------------------------------------
//SysTick interrupt handler
void SysTick_Handler(void)
{
Led2Toggle();
TimeTick1_1ms++;
}
//-----------------------------------------------------------------------------
LPC1114 타이머 테스트 예제코드
#define SYSTICK_DELAY 48000 //1ms (48000/48M)
volatile uint32_t TimeTick1_1ms = 0;
//-----------------------------------------------------------------------------
//SysTick interrupt handler
void SysTick_Handler(void)
{
Led2Toggle();
TimeTick1_1ms++;
}
//-----------------------------------------------------------------------------
int main()
{
SystemInit();
Led1Init();
Led1Off();
Led2Init();
Led2Off();
//SysTick 설정
SysTick_Config( SYSTICK_DELAY );
while(1)
{
//1초마다 Led 점등
if(TimeTick1_1ms>1000)
{
Led1Toggle();
TimeTick1_1ms = 0;
}
}
return 0;
}
volatile uint32_t TimeTick1_1ms = 0;
//-----------------------------------------------------------------------------
//SysTick interrupt handler
void SysTick_Handler(void)
{
Led2Toggle();
TimeTick1_1ms++;
}
//-----------------------------------------------------------------------------
int main()
{
SystemInit();
Led1Init();
Led1Off();
Led2Init();
Led2Off();
//SysTick 설정
SysTick_Config( SYSTICK_DELAY );
while(1)
{
//1초마다 Led 점등
if(TimeTick1_1ms>1000)
{
Led1Toggle();
TimeTick1_1ms = 0;
}
}
return 0;
}
Timer32 사용하기
LPC11xx는 SysTick Timer외에 2개의 32bit 타이머와 2개의 16bit타이머가 있다.
타이머 초기화 함수
#define TIME_INTERVAL (SystemAHBFrequency/1000 - 1)
void InitTimer32B0(uint32_t TimerInterval)
{
LPC_SYSCON->SYSAHBCLKCTRL |= (1<<9);
LPC_TMR32B0->MR0 = TimerInterval;
LPC_TMR32B0->MCR = 3; /* Interrupt and Reset on MR0 */
/* Enable the TIMER0 Interrupt */
NVIC_EnableIRQ(TIMER_32_0_IRQn);
//타이머 Enalbe
LPC_TMR32B0->TCR = 1;
}
void InitTimer32B0(uint32_t TimerInterval)
{
LPC_SYSCON->SYSAHBCLKCTRL |= (1<<9);
LPC_TMR32B0->MR0 = TimerInterval;
LPC_TMR32B0->MCR = 3; /* Interrupt and Reset on MR0 */
/* Enable the TIMER0 Interrupt */
NVIC_EnableIRQ(TIMER_32_0_IRQn);
//타이머 Enalbe
LPC_TMR32B0->TCR = 1;
}
인터럽트 핸들러
//-----------------------------------------------------------------------------
//SysTick interrupt handler
void CT32B0_IRQHandler(void)
{
if ( LPC_TMR32B0->IR & 0x01 )
{
LPC_TMR32B0->IR = 1; /* clear interrupt flag */
TimeTick1_1ms++;
}
return;
}
//-----------------------------------------------------------------------------
//SysTick interrupt handler
void CT32B0_IRQHandler(void)
{
if ( LPC_TMR32B0->IR & 0x01 )
{
LPC_TMR32B0->IR = 1; /* clear interrupt flag */
TimeTick1_1ms++;
}
return;
}
//-----------------------------------------------------------------------------
LPC1114 Timer32 이용 테스트 예제 소스코드
int main()
{
SystemInit();
Led1Init();
Led1Off();
Led2Init();
Led2Off();
//SysTick 설정
InitTimer32B0(TIME_INTERVAL);
while(1)
{
//1초마다 Led 점등
if(TimeTick1_1ms>1000)
{
Led1Toggle();
TimeTick1_1ms = 0;
}
}
return 0;
}
반응형