STM32 강좌

STM32CubeMX - SysTick 사용

plainy 2 8,862 2017.04.28 10:58

STM32CubeMX에서 Tick Timer

HAL Driver는 기본적으로 SysTick을 사용하여 Delay함수를 구현합니다.

따라서 STM32CubeMX에서 생성된 Code는 SysTick설정을 포함하고 있습니다.

 

아래 Code는 STM32CubeMX에서 System Clock을 설정하는 Code입니다.

 

 

  1. /** System Clock Configuration
  2. */
  3. void SystemClock_Config(void)
  4. {
  5.  
  6. RCC_OscInitTypeDef RCC_OscInitStruct;
  7. RCC_ClkInitTypeDef RCC_ClkInitStruct;
  8.  
  9. __PWR_CLK_ENABLE();
  10.  
  11. __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
  12.  
  13. RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
  14. RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  15. RCC_OscInitStruct.HSICalibrationValue = 16;
  16. RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  17. RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
  18. RCC_OscInitStruct.PLL.PLLM = 8;
  19. RCC_OscInitStruct.PLL.PLLN = 168;
  20. RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
  21. RCC_OscInitStruct.PLL.PLLQ = 4;
  22. HAL_RCC_OscConfig(&RCC_OscInitStruct);
  23.  
  24. RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
  25. |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  26. RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  27. RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  28. RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;
  29. RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;
  30. HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5);
  31.  
  32. HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);
  33.  
  34. HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);
  35.  
  36. /* SysTick_IRQn interrupt configuration */
  37. HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
  38. }

32번째 줄의 HAL_SYSTICK_Config함수는 SysTick을 설정한 후 활성화하는 함수입니다.

Reload 레지스터에 들어갈 값을 인자로 사용합니다.

 

HAL_SYSTICK_CLKSourceConfig 함수는 SysTick에 사용할 Clock Source를 선택하는 함수입니다.

HCLK와 HCLK/8 중 하나를 선택할 수 있습니다.

 

 

SysTick Reload값 설정

SysTick의 Reload값은 다음과 같이 설정할 수 있습니다.

 

HAL_RCC_GetCLKFreq함수는 HCLK값을 반환합니다.

HCLK값을 1000으로 나누어 1mS로 SysTick이 동작합니다.

HCLK를 주파수로 나누면 원하는 SysTick값을 얻을 수 있습니다.

 

SysTick Interrupt 주기 = HCLK / Frequency


HCLK / 1000(Hz) = 1mS

HCLK / 100(Hz) = 10mS

HCLK / 1234(Hz) = 810.4uS

 

Comments

임베디드초보 03.18 15:50
SysTick Interrupt 주기 = HCLK / Frequency




HCLK / 1000(Hz) = 1mS

HCLK / 100(Hz) = 10mS

HCLK / 1234(Hz) = 810.4uS

HCLK 값 관계없이 나누는거에 의해 시간이 나오는건가요??
plainy 03.21 00:56
네. 맞습니다.
HCLK에 따라 계산되는 값이 다르기 때문에 이에 맞춰 Systick이 동작됩니다.
Category
글이 없습니다.
글이 없습니다.
Facebook Twitter GooglePlus KakaoStory NaverBand