MCU는 NUC029SGE를 사용하였고 관련 데이터 시트는 아래 첨부했습니다.
코드 분석
static void sSysTimer_Init(void)
{
/* Enable TIMER0 module clock */
CLK_EnableModuleClock(TMR0_MODULE);
/* Select TIMER module clock source */
CLK_SetModuleClock(TMR0_MODULE, CLK_CLKSEL1_TMR0SEL_HIRC, MODULE_NoMsk);
TIMER_Open(TIMER0, TIMER_PERIODIC_MODE, 1000);
TIMER_EnableInt(TIMER0);
/* Enable Timer0 NVIC */
NVIC_EnableIRQ(TMR0_IRQn);
}
1) CLK_EnableModuleClock(TMR0_MODULE);
범용 타이머0 모듈의 Clock을 활성화시키겠다.
NUC029SGE는 TMR0~TMR3까지 4개의 범용 타이머가 있다. 여기서는 이 타이머 중 TMR0을 활성화시켰다.
2) CLK_SetModuleClock(TMR0_MODULE, CLK_CLKSEL1_TMR0SEL_HIRC, MODULE_NoMsk);
CLK_SetModuleClock(Module index, Clock source, Divider);
타이머0 모듈을 HIRC Clock source로 설정하고, clock divider는 0으로 설정하겠다.
※ clock divider
클럭 분배기로 낮은 주파수가 필요할 때 사용한다.
3) TIMER_Open(TIMER0, TIMER_PERIODIC_MODE, 1000);
uint32_t TIMER_Open(TIMER_T *timer, uint32_t u32Mode, uint32_t u32Freq)
타이머0 모듈을 TIMER_PERIODIC_MODE로 설정하고 주파수는 1000Hz로 하겠다.
1000Hz는 1초에 1000번(주기)이므로 1ms에 1번(주기) 돈다.
따라서 이 함수는 1ms을 주기로 동작하는 타이머가 된다.
4) TIMER_EnableInt(TIMER0);
타이머0 인터럽트를 활성화하겠다.
5) NVIC_EnableIRQ(TMR0_IRQn);
NVIC 인터럽트 컨트롤러에 타이머0 IRQ를 활성화하겠다.
※ IRQ(Interrupt ReQuest)
인터럽트
※ NVIC(Nested Vectored Interrupt Controller)
중첩 벡터형 인터럽트 제어기로 모든 인터럽트 예외에 대한 우선 순위를 결정하고 처리한다.
결론
타이머0의 Clock은 HIRC, 1ms에 1주기를 갖는 주기적 모드로 설정한다.
타이머0의 인터럽트를 NVIC 인터럽트 컨트롤러에 활성화한다.
즉, 타이머0은 1ms에 한번씩 인터럽트를 발생시킨다.
'개발환경 > Keil' 카테고리의 다른 글
ADC 설정 - NUC029SGE (1) | 2023.11.18 |
---|---|
UART 설정 - NUC029SGE (1) | 2023.11.18 |
Clock 설정 - NUC029SGE (0) | 2023.11.18 |