본문 바로가기
DSP, MCU/STM32 (ARM Cortex-M)

STM32 ] SysTick Timer Callback 함수 사용하기

by eteo 2022. 7. 14.

 

이전에 분명 정리한 거 같은데 기록이 없어서 정리용도로 빠르게 테스트해봄

 

HAL_GetTick 함수를 따라가 보면 uwTick을 리턴하는 것으로 되어있다.

이 uwTick이 SysTick 타이머 클락 소스로 1밀리초마다 카운트되고 HAL_Delay 함수도 이 uwTick을 사용하고 있다.

 

 

 

Drivers - STM32F4xx_HAL_Driver - Src - stm32f4xx_hal_cortex.c 파일에 가면

 

 

 

아래와 같이 있다.

 

 

그중에 HAL_SYSTICK_IRQHandler() 함수를 가져와 stm32f4xx_it.c 에 있는 SysTick_Handler() 함수 안에 넣는다.

 

 

 

그리고 아까 IRQHandler() 함수 바로 아래 있던 HAL_SYSTICK_Callback 함수를 가져와 전역구간에서 재정의 해서 쓴다.

 

 

 

 

아래는 테스트용 소스코드

 

/* USER CODE BEGIN PV */
uint32_t count;
/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP */

#ifdef __GNUC__
  /* With GCC, small printf (option LD Linker->Libraries->Small printf
     set to 'Yes') calls __io_putchar() */
  #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
  #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif /* __GNUC__ */
PUTCHAR_PROTOTYPE
{
  /* Place your implementation of fputc here */
  /* e.g. write a character to the EVAL_COM1 and Loop until the end of transmission */
  HAL_UART_Transmit(&huart3, (uint8_t *)&ch, 1, 0xFFFF);

  return ch;
}

/* USER CODE END PFP */

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
void HAL_SYSTICK_Callback(void)
{
	if(uwTick%1000==0){
		printf("count : %d\n\r", count);
		count++;
	}
}
/* USER CODE END 0 */

 

count 변수를 만들어두고(전역변수는 초기값 미지정시 0) uwTick%1000==0 1이 될때 즉 1초마다 시리얼 터미널에 출력한다.

다만 sysTick 타이머에 영향을 미칠 수 있어서 웬만하면 다른 타이머를 쓰는게 좋은 것 같다.

 

 

 

실행결과