Embeded/ARM Cortex-M4

Timer / Timer_Handler 소스

gharlic 2015. 7. 8. 03:16
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
void Init_Timer() {
     uint16_t PrescalerValue;
     TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
 
     NVIC_InitTypeDef NVIC_InitStructure;
     NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0f;
     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0f;
     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
     NVIC_Init(&NVIC_InitStructure);
 
     RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
     SystemCoreClockUpdate();
     PrescalerValue = (uint16_t) (SystemCoreClock / TIMER_PRESCALER_FREQ) -1; 
 
     TIM_TimeBaseStructure.TIM_Period = (TIMER_PRESCALER_FREQ / TIMER_FREQ) -1 ;
     TIM_TimeBaseStructure.TIM_Prescaler = PrescalerValue;
     TIM_TimeBaseStructure.TIM_ClockDivision = 0;
     TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
     TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
 
     TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
     TIM_Cmd(TIM2, ENABLE);
}
 
void TIM2_IRQHandler(void) {
     if (TIM_GetITStatus(TIM2, TIM_IT_Update) == SET) {
          TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
          if(i%2==0)
               GPIOA->BSRRH = GPIO_Pin_15;
          else
               GPIOA->BSRRL = GPIO_Pin_15;
          i = 1-i;
     }
}
cs

타이머와 타이머핸들러의 소스이다.

 

3. Timer 관련 구조체로 이 구조체에 값을 채워넣은 뒤 마지막에 타이머 레지스터에 이 구조체를 전달하므로써 초기화를 한다.

4~10. 인터럽트 우선순위에 관한 부분이다. IRQ(Interrupt ReQuest)에 대해 0~15의 PP와 SP를 설정한다.

14~16. 타이머의 속도를 정하는 부분이다. Prescaler는 주기가 아닌 주파수 형식으로 나타낸다.

 

26~ . 타이머 핸들러에서 GPIO A포트의 15번 핀을 Set / Reset시킨다.

        A포트 15번은 m4 내부 LED를 제어하는 핀이다.

 

......

......

이해하기 어려울 것 같으니까

다음 게시물에서 좀 더 쉬운 예제로 전체소스를 공개하겠다...

반응형