board_android-IoT/STM32F 2025. 3. 7. 14:06

STM32F437VITx에서 TIM2를 0.1ms(100µs) 간격으로 인터럽트 발생시키는 설정 방법

STM32F437VITx의 TIM2는 32비트 범용 타이머로 동작하며, 기본 클록 소스를 사용하여 0.1ms 간격으로 인터럽트를 발생시키도록 설정할 수 있습니다.


1. CubeMX 설정 방법

CubeMX에서 TIM2를 설정하여 0.1ms(100µs) 간격으로 인터럽트 발생하도록 설정하는 방법입니다.

① TIM2 타이머 설정

  1. STM32CubeMX에서 TIM2 활성화
    • Mode: Internal Clock
    • Clock Source: Internal Clock
    • Prescaler: SystemCoreClock에 따라 설정
    • Counter Mode: Up
    • ARR (Auto-reload register): 999 (1ms 기준에서 10배 빠르게)
    • Prescaler 설정을 통해 원하는 주기로 맞춤

② 계산: 0.1ms(100µs) 인터럽트 발생

① TIM2 클록 확인

STM32F437VITx에서 APB1 버스는 최대 45MHz(최대 90MHz / 2) 속도로 동작합니다.

  • TIM2는 APB1에 연결되어 있으며, 타이머 클록이 x2 배속이므로 TIM2의 기본 클록은 90MHz입니다.

② TIM2 설정값 계산

타이머 인터럽트 주기 공식:

Timer Period=(PSC+1)×(ARR+1)TIM_CLK\text{Timer Period} = \frac{(\text{PSC} + 1) \times (\text{ARR} + 1)}{\text{TIM\_CLK}}

  • 0.1ms(100µs) = ((PSC + 1) * (ARR + 1)) / 90MHz
  • 적절한 값 선택:
    • PSC = 89 (즉, 90MHz / (89+1) = 1MHz)
    • ARR = 99 (즉, 1MHz / (99+1) = 10kHz → 100µs)

③ CubeMX에서 NVIC 인터럽트 활성화

  • TIM2 global interrupt 활성화
  • 코드 자동 생성 후 stm32f4xx_it.c에서 인터럽트 서비스 루틴(ISR) 작성

2. Keil / uVision 코드 작성

CubeMX에서 생성된 코드에서 tim.c 파일과 인터럽트 핸들러에 추가합니다.

① main.c에서 TIM2 시작

#include "tim.h"

HAL_TIM_Base_Start_IT(&htim2);

② stm32f4xx_it.c에서 TIM2 인터럽트 핸들러

void TIM2_IRQHandler(void)
{
    HAL_TIM_IRQHandler(&htim2);
}

③ tim.c에서 인터럽트 콜백 함수 추가

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
    if (htim->Instance == TIM2)
    {
        // 0.1ms마다 실행할 코드
    }
}

3. 직접 레지스터 설정 (Keil/uVision)

CubeMX 없이 Keil/uVision에서 직접 타이머 설정할 수도 있습니다.

① RCC에서 TIM2 클록 활성화

RCC->APB1ENR |= RCC_APB1ENR_TIM2EN; // TIM2 클록 활성화

② TIM2 설정

TIM2->PSC = 89;   // 프리스케일러 (90MHz / (89+1) = 1MHz)
TIM2->ARR = 99;   // 자동 재로드 값 (1MHz / 100 = 10kHz = 0.1ms)
TIM2->DIER |= TIM_DIER_UIE; // 업데이트 인터럽트 활성화
TIM2->CR1 |= TIM_CR1_CEN;   // 타이머 시작

③ NVIC 설정 (인터럽트 활성화)

NVIC_EnableIRQ(TIM2_IRQn);
NVIC_SetPriority(TIM2_IRQn, 1);

④ 인터럽트 핸들러 구현

void TIM2_IRQHandler(void)
{
    if (TIM2->SR & TIM_SR_UIF) // 업데이트 인터럽트 플래그 확인
    {
        TIM2->SR &= ~TIM_SR_UIF; // 플래그 클리어
        // 0.1ms마다 실행할 코드
    }
}

4. 요약

  • CubeMX 사용 시
    • TIM2를 Internal Clock으로 설정
    • PSC = 89, ARR = 99 설정 (100µs 인터럽트 발생)
    • NVIC 인터럽트 활성화 후 HAL_TIM_PeriodElapsedCallback에서 코드 작성
  • Keil/uVision 직접 설정
    • RCC->APB1ENR에서 TIM2 클록 활성화
    • PSC = 89, ARR = 99으로 설정
    • TIM2->DIER |= TIM_DIER_UIE;로 인터럽트 활성화
    • TIM2_IRQHandler()에서 인터럽트 처리

이제 TIM2가 0.1ms(100µs) 간격으로 정상 동작할 것입니다. 🚀

 

 

 

posted by cskimair
: