Microprocessor/STM32 STM32 TIMER Counter Mode
  • 728x90
    반응형

     

     

    STM32F103 Timer(Counter Mode)

     

    (feat. open103V)


     

    TIMER (TIM2) DataSheet 분석

    STM32F103 칩 안에는 여러개의 타이머가 있다. 각 타이머는 아래 DataSheet의 내용과 같이 16bit로 동작한다.

     

     

     

    타이머의 기능을 살펴보면 여러가지 모드가 있는데 가장 기본적인 Counter Mode(Upcounting & Downcounting)에 대하여 살펴본다.

     

    1초 단위로 카운터를 세는 일부 코드는 아래와 같다.

     

    static void MX_TIM2_Init(void)
    {
        TIM_ClockConfigTypeDef sClockSourceConfig = {0};
        TIM_MasterConfigTypeDef sMasterConfig = {0};
        htim2.Instance = TIM2;
        htim2.Init.Prescaler = 72-1;
        htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
        htim2.Init.Period = 1000-1;
        htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
        htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
        if (HAL_TIM_Base_Init(&htim2) != HAL_OK) {
        	Error_Handler();
        }
        sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
        if (HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig) != HAL_OK) {
        	Error_Handler();
        }
        sMasterConfig.MasterOutputTrigger = TIM_TRGO_UPDATE;
        sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
        if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK) {
        	Error_Handler();
        }
    }
    
    void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* htim_base)
    {
        if(htim_base->Instance==TIM2) {
        	__HAL_RCC_TIM2_CLK_ENABLE();
    
        	HAL_NVIC_SetPriority(TIM2_IRQn, 5, 0);
        	HAL_NVIC_EnableIRQ(TIM2_IRQn);
        }
    }
    
    int main(void)
    {
        uint32_t time2CounterTemp = 0;
        HAL_Init();
        SystemClock_Config();
        MX_GPIO_Init();
        MX_USART1_UART_Init();
        MX_TIM2_Init();
    
        HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_1);
    
        while (1) {
            if (time2Counter%1000 == 0) {
                if (time2CounterTemp != time2Counter) {
                	printf("%d\r\n", time2Counter/1000);
                    time2CounterTemp = time2Counter;
                }
            }
        }        
    }
    
    void TIM2_IRQHandler(void)
    {
        HAL_TIM_IRQHandler(&htim2);
        time2Counter++;
    }

     

    NVIC(Nested vectored interrupt controller)에 TIM2의 인터럽트를 확인해 보면 28번에 할당되어 있음을 아래와 같이 알 수 있다.

     

     

    TIM2를 사용하려면 클럭을 인가해 줘야하는데 블록도를 보면 APB1 클럭버스에 물려있는것을 알 수 있다.

    따라서 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE) 이렇게 클럭신호를 넣어준다.

     

     

     

    NVIC 설정중에 TIM2_IRQn 이라는 값을 사용하는데 Define된 값을 살펴보면 위에서 확인한 바와 같이 28번으로 정의되어 있다.

     

     

     

    Timer 주기 설정

    STM32F103 칩에서 APB1 Timer clock은 아래와 같이 72MHz 이다.

     

     

     

    타이머의 prescaler 와 period를 구하는 식은 아래와 같다. 아래와 같은 식으로 계산하면 1msec 주기로 타이머 인터럽트가 발생하게 된다.

     

     

    위에서 계산한 값을 반영하여 STM32CubeMx 에서 TIM2에 관한 설정은 아래와 같다.

     

     

    위 그림에서 Prescaler과 Period 값에서 -1을한 이유는 아래 타이밍도와 같이 프리스케일이 3일때 0부터 시작하여 3을 넣으면 4개가 한세트가 되는 것을 알 수 있다. 그럼으로 -1을한 값을 설정해준다.

     

     

    모든 타이머 설정이 끝나면 아래와 같이 타이머 인터럽트 시작함수를 main에서 호출하여 타이머를 시작해주면 된다.

     

     

     

     

     

     

     

     

     

     

    728x90
    반응형
상단으로