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를 제어하는 핀이다.
......
......
이해하기 어려울 것 같으니까
다음 게시물에서 좀 더 쉬운 예제로 전체소스를 공개하겠다...
반응형
'Embeded > ARM Cortex-M4' 카테고리의 다른 글
GPIO(General Purpose Input Output) IN, OUT 소스 (0) | 2015.07.08 |
---|---|
GPIO/Timer를 활용한 FND제어 소스 (0) | 2015.07.08 |
라이브러리(library)코딩과 레지스터(Register)코딩 (0) | 2015.07.08 |
펌웨어(Firmware)의 구조 (0) | 2015.07.08 |
타이머(timer)와 인터럽트(interrupt) (0) | 2015.07.08 |