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 타이머 설정
- 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) 간격으로 정상 동작할 것입니다. 🚀


'board_android-IoT > STM32F' 카테고리의 다른 글
| A7670 , LTE_MODEM , choice guide (0) | 2025.03.18 |
|---|---|
| LTE Cat 1 설명 (0) | 2025.03.18 |
| how to create a bin from axf file in Keil/uVision5 (0) | 2025.03.06 |
| STM32 printf redirection to UART (0) | 2025.02.28 |
| How to change the readout protection on STM32F4 (0) | 2025.02.20 |
