ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • TIMER 실습 코드
    Note/임베디드 노트 2020. 11. 27. 12:05

     

     

    Step:

    1. LED 테스트용 GPIO를 설정한다.

    2. 타이머 주기, 분주비, 클럭디비전,  카운트 모드설정.

    3. 타이머에 클럭신호제공 및 타이머와 타이머 인터럽트를 Enable한다.

    4. NIVC를 통해 인터럽트를 초기화시킨다.

      1) 인터럽트 채널을 TIMER 채널로 설정

      2) 인터럽트 최우선순위 설정

      3) 두번째 우선순위 설정

      4) IRQ채널 Enable

     

    5. Timer 인터럽트의 핸들러 함수를 작성한다.

      +) 인터럽트가 들어오면 Pending Bit를 초기화 시켜주어야 인터럽트를 다시 대기하는 상태로 초기화 할 수 있다.

    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    #include "stm32f10x.h"
     
     
     
     
    volatile unsigned int Timer2_Counter=0;
     uint16_t cnt_ms =0;
     
    void GPIO_Configuration()
    {   
        GPIO_InitTypeDef PORTB;                                         //PORTB라는 이름의 구조체 생성
     
       RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE);          //사용하고자 하는 포트에 클럭신호를 제공
         
        PORTB.GPIO_Pin = 0x000f;                                        //구성하고 싶은 핀번호 설정
        PORTB.GPIO_Mode = GPIO_Mode_Out_PP;                             //출력모드를 Push_Pull 로설정
        PORTB.GPIO_Speed = GPIO_Speed_50MHz;                            //GPIO의 동작 속도를 50MHz로 설정
        GPIO_Init(GPIOB, &PORTB);                                       //실제 레지스터에 설정한 값들을 작성 
    }
     
    void TIM2_IRQHandler(void)
    {
        if(TIM_GetITStatus(TIM2,TIM_IT_Update) != RESET)
        {
            TIM_ClearITPendingBit(TIM2, TIM_IT_Update);                 // Clear the interrupt flag
            Timer2_Counter++;                                           //1us단위로 카운트
                
                if(Timer2_Counter %1000 == 0)
                {
                    cnt_ms++;                                           //1ms단위로 카운트
                }
        }
    }
     
    void NVIC_Configuration()
    {
        // Enable TIM2 Global Interrupt     
         NVIC_InitTypeDef NVIC_InitStructure;                           //NVIC_InitStructure이름의 구조체 생성
     
          NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;                //TIM2_IRQn로 채널 설정
            NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;    //최우선순위 설정
            NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;           //두번째 우선순위 설정
            NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;              //IRQ채널을 사용할지 설정
            NVIC_Init(&NVIC_InitStructure);                              //해당 레지스터에 값 저장
    }
     
     
    void Tim2_Configuration()
    {
       TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;              //TIM_TimeBaseStructure이름의 구조체 생성
         
        // TIM2 Clock Enable 
       RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);        //TIM2에 클럭신호 제공
         
         
        // TIM2 Initialize  
        TIM_TimeBaseStructure.TIM_Period=1000-1;                    //1MHz의 주파수를 1000개 단위로 셈 -> 1kHz
        TIM_TimeBaseStructure.TIM_Prescaler=8-1;                    //8MHz의 주파수를 8로 나눔 -> 1MHz
        TIM_TimeBaseStructure.TIM_ClockDivision=0;                  //클럭을 DIVSION하지 않는다.
        TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;   //카운터업모드를 사용
        TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);              //타이머레지스터에 값 저장
         
        // TIM2 Enale 
       TIM_Cmd(TIM2,ENABLE);                                       //타이머 인에이블
            // interrupt enable
       TIM_ITConfig(TIM2,TIM_IT_Update, ENABLE);                   //인터럽트 인에이블
    }
     
    void delay_ms(unsigned int del)
    {
        Timer2_Counter=0;
        while(Timer2_Counter < del);
    }
     
     
     
    int main()
    {
        
        //SystemInit(); 사용하지 않는 함수
        
        
        GPIO_Configuration();
        Tim2_Configuration();
            NVIC_Configuration();
     
        
        while(1)
        {       
     
                GPIO_WriteBit(GPIOB,0x000f1);
                delay_ms(1000);
                
                GPIO_WriteBit(GPIOB,0x000f0);
                            delay_ms(1000);
     
        }
    }
     
    cs

     

    'Note > 임베디드 노트' 카테고리의 다른 글

    ADC에 대해  (0) 2020.11.27
    외부인터럽트 정리 및 실습 코드  (0) 2020.11.27
    PWM 실습 코드  (0) 2020.11.27
    TIMER/PWM  (0) 2020.11.26
    CAN(Controller Area Network) 통신  (0) 2020.11.26
Designed by Tistory.