1: void Timer_INIT0(unsigned int uiRate, unsigned int uiRC, void (*handler)(void))
2: {
3: PMC_PCER = (1 << TC0); //타이머/카운터0에 전력공급. (clock)
4:
5: TC0_CCR = (1 << CLKDIS); //TC0에 클록이 공급되지 않도록.
6: TC0_IDR = 0xFFFFFFFF; //TC0인터럽트 금지.
7: TC0_SR; //TC0상태레지스터를 읽어 오기만 함. (임베디드에서 많이 사용) -> SR은 0으로 초기화됨.
8: AIC_IDCR = (1 << TC0); //타이머/카운터장치 전체 인터럽트 비활성.
9:
10: AIC_SVR[TC0] = (unsigned int)handler; //인터럽트 서비스 루틴의 주소값 저장. SVR[] (배열의 값)은 unsigned int형
11: AIC_SMR[TC0] = (2 << SRCTYPE) |(0 << PRIOR); //High레벨 검출, 우선순위 최하
12: AIC_ICCR = (1 << TC0); //엣지 검출기 클리어.
13:
14: TC0_CMR = (1 << CPCTRG) | (uiRate << TCCLKS); //compare모드, 분주비 128 (MCK/128)
15: //today...분주비 설정에 의한 RC값과 인터럽트 허용.
16: TC0_RC = uiRC; // 58.8us를 설정하기 위해 58.8us / (MCK/128)를 넣음.
17:
18: TC0_IER = (1 << CPCS); //RC 비교 인터럽트 활성.
19: AIC_IECR = (1 << TC0); //TC0 전체 인터럽트 활성.
20:
21: //today...타이머 동작.
22: //TC0_CCR = (1 << CLKEN); //먼저 클록 공급 허용하고,
23: //TC0_CCR = (1 << SWTRG); //소프트웨어적으로 트리거하여 카운터를 리셋시킨 후 클록 공급.
24:
25: return ;
26: }
27:
28: void MyCounter(void) // 58.8us마다 호출되는 ISR
29: {
30: TC0_SR;
31:
32: //여기에 할 일을 코딩할 것. TO DO (MFC에서는 자동으로 생성.)
33: ++ICNT;
34:
35: return ;
36: }