본문 바로가기

[NXP]/LPC1k

[LPC1K EVM] LPC1114 타이머 테스트 - 1초 만들기

[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 에 정의되어 있다.
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 */
}


인터럽트 핸들러
//-----------------------------------------------------------------------------
//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;
}




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;  


인터럽트 핸들러
//-----------------------------------------------------------------------------
//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;
}
반응형