본문 바로가기

STM32/STM32

[STM32F1] Timer Interrupt

728x90

1. CubeMX 설정

- NVIC Setting : 인터럽트 Enabled 체크

 

- Code generation

 

2. 코드 작성

 

1) main.c

  /* USER CODE BEGIN 2 */
  HAL_TIM_Base_Start_IT(&htim3);   // Timer 시작

/* USER CODE END 2 */

 

 

2) stm32f1xx_it.c

 

// 인터럽트 발생 시, IRQ 핸들러 함수 호출 -> HAL_TIM_IRQHandler 함수 호출

void TIM3_IRQHandler(void)
{
  /* USER CODE BEGIN TIM3_IRQn 0 */

  /* USER CODE END TIM3_IRQn 0 */
  HAL_TIM_IRQHandler(&htim3);
  /* USER CODE BEGIN TIM3_IRQn 1 */
  /* USER CODE END TIM3_IRQn 1 */
}

 

 

3. HAL_TIM_IRQHandler 함수 호출되면 함수 내부에서 비교 문의 모두 true 상태이면 HAL_TIM_PeriodElapsedCallback() 함수를 호출

 /* TIM Update event */
  if (__HAL_TIM_GET_FLAG(htim, TIM_FLAG_UPDATE) != RESET)
  {
    if (__HAL_TIM_GET_IT_SOURCE(htim, TIM_IT_UPDATE) != RESET)
    {
      __HAL_TIM_CLEAR_IT(htim, TIM_IT_UPDATE);
#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1)
      htim->PeriodElapsedCallback(htim);
#else
      HAL_TIM_PeriodElapsedCallback(htim);
#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */
    }
  }

 

 

4. main 함수 아래에 HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) 함수 작성

 

 

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
  /* Prevent unused argument(s) compilation warning */
  UNUSED(htim);

  /* NOTE : This function should not be modified, when the callback is needed,
            the HAL_TIM_PeriodElapsedCallback could be implemented in the user file
   */
}

 

-----------------------------------------------------------------------------------------------------------------------------------------------------------------

< HAL Library 를 쓰지 않으려면 >

cubeMX 설정에서 call HAL handler 항목을 체크하지 않으면

stm32f1xx_it.c 에서 IRQHandler 함수에서 위와 다르게 HAL_TIM_IRQHandler 함수 호출이 되지 않는다.

IRQHandler 함수 내부에 직접 알맞은 코드를 작성하면 된다.

void TIM4_IRQHandler(void)
{
  /* USER CODE BEGIN TIM4_IRQn 0 */

  /* USER CODE END TIM4_IRQn 0 */
  /* USER CODE BEGIN TIM4_IRQn 1 */
// -------------- 함수 작성 ------------------

  /* USER CODE END TIM4_IRQn 1 */
}

 

 

728x90

'STM32 > STM32' 카테고리의 다른 글

Hard Fault(하드 폴트) - 0으로 나누기  (0) 2024.05.27
[STM32] multiple definition error  (0) 2024.03.14