본문 바로가기
Stm32/실제 구동(stm32cubeide)

Timer Interrupt

by [Akashic Records] 개발의선지자 2024. 6. 18.

개인 공부 목적입니다.

 

사용 IDE : Stm32Cubeide

사용 Board : stm32F429ZI

 

STM32에 내장된 Timer에는 여러 가지 기능(PWM , Input capture, Output capture)이 내장되어 있지만, 여기서 다룰 Timer란  특정 주기마다 이벤트가 발생시키는 동작을 이야기 한다.

 

STM32 모델들마다 사용할수 있는 Timer 수와 기능들이 제한되어있다. 여기서는 stm32f429ZI Timer를 사용하기로 한다.

Datasheet 상에 Memory Map을 보면 각 사용 가능한 Timer과 어떤 Clock bus를 이용하는지 확인 할 수 있다.

 

 

사용하려는 Timer 번호에 맞는 Bus에 맞게 Clock 설정 후 이에 따라 주기를 설정한다.

이번 실습에서는 General Timer를 사용하기에 Timer2 Timer3를 두개를 사용하겠다.

 

타이머 인터럽트를 사용하기 위해 STM32CubeIde에서 아래와 같이 먼저 설정한다.

TIMER2는 위와 같이 설정

 

 

 

Timer2는 주기를 1초로 설정하고 , Timer3는 주기를 3초로 설정하여 LED 2개를 각각 1초, 3초 간격으로 토글한다.

 

stm32f429ZI는 APB1와 APB2 Timer  Clock을 180Mhz로 동일

Tim2와 Tim3가 사용하는 APB1 Clock : 180mhz,  Prescaler : 18, 000 (최대 65535, 16비트)

주파수 f = 180, 000, 000 / 18, 000 = 10000[Hz] = 0.1Mhz

1카운터가 증가하는데 걸리는 시간 : T  = 1/f = 1/10000

Auto reload Register(ARR) -> 카운터에서 언제 overflow가 발생하는 결정 

1) 주기가 0.5일때 ARR : 5000

2)주기 1초일 때 ARR : 10000

3)주기 3초일때 ARR : 30000

 

 타이머 인터럽트를 이용하기 위해 Hal driver 함수가 필요하다.

 

void HAL_TIM_Base_Start_IT( TIM_HandleTypeDef *htim ) -> 타이머 인터럽트 시작 함수

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) -> 타이머 인터럽트 발생시 실행 함수

 

/* Private variables ---------------------------------------------------------*/
TIM_HandleTypeDef htim2;
TIM_HandleTypeDef htim3;

/* USER CODE BEGIN PV */

/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
static void MX_TIM2_Init(void);
static void MX_GPIO_Init(void);
static void MX_TIM3_Init(void);
/* USER CODE BEGIN PFP */

/* USER CODE END PFP */

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
int timer_flag = 0;
/* USER CODE END 0 */

/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_TIM2_Init();
  MX_GPIO_Init();
  MX_TIM3_Init();
  /* USER CODE BEGIN 2 */
  HAL_TIM_Base_Start_IT(&htim2);
  HAL_TIM_Base_Start_IT(&htim3);


  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
	  switch(timer_flag){

	  	  case 1:
	  		  HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_1);
	  		  break;
	  	  case 2:
	  		  HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_2);
	  		  break;
	  	  default:
	  		  break;

	  }
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

 

/* USER CODE BEGIN 4 */
HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim){

	if(htim->Instance == TIM2){
		timer_flag = 1;
	}

	if(htim->Instance == TIM3){
		timer_flag = 2;
	}
}
/* USER CODE END 4 */

 

추후에 ADC 활용시 타이머 인터럽트를 이용하는 예제를 올릴 예정이다.