STM32 강좌

STM32CubeMX - SysTick (System Tick Timer)

plainy 0 7,313 2017.04.28 10:58

프로그램은 일정 시간마다 인터럽트를 발생시키는 기준 타이머를 사용하여 Delay함수에 사용하거나 코드의 수행시간을 측정하는 용도로 사용합니다. 또한 RTOS등에서는 Task간 전환에 사용되기도 합니다.

이런 용도로 사용되는 타이머를 Tick Timer라고 합니다.

모든 Cortex-M Core는 Tick Timer로 사용할 수 있는 System Timer(SysTick)을 포함하고 있습니다.

STM32역시 Cortex-M Core를 사용하므로 모든 Device에서 SysTick을 사용할 수 있습니다.

 

SysTick 특징

 

  • 24Bit Down counter
  • Auto Reload
  • 두가지 Clock사용 (System Clock 또는 System Clock/8)
  • Maskable Interrupt

 

 

 

관련문서

SysTick은 Cortex-M Core에 내장되어 있는 Peripheral이기 때문에 STM32 Reference Manual에는 관련 내용이 설명되어 있지 않습니다.

ARM사에서 제공하는 Cortex™-Mx Devices Generic User Guide 또는 STM32 Cortex-Mx Programming Manual에서 SysTick관련 내용을 찾을 수 있습니다.

 

Cortex™-M3 Devices Generic User Guide문서의 SysTick 관련 내용

1b2c326854089e594a4d7c9632f3307b_1493344650_3674.png

 

 

STM32 Cortex-Mx Programming Manual문서의 SysTick 관련 내용

1b2c326854089e594a4d7c9632f3307b_1493344658_6711.png


 

 

두 문서의 내용 중 Register의 이름이 다르게 명시되어 있으므로 주의가 필요합니다.

CMSIS Library에서는 STM32 Programming Manual의 Register명을 사용하며 IAR EWARM 컴파일러의 Register창에서는 Cortex™-M3 Devices Generic User Guide의 Register명을 사용하고 있습니다.

 

 

SysTick

SysTick은 24Bit Down counter입니다.

즉 Reload값은 0부터 0xFFFFFF (16,777,215) 까지 설정할 수 있으며 설정된 Reload값에서 0까지 감소하며 동작합니다.

Reload값으로 0을 사용할 경우 아무런 동작도 하지 않습니다.

 

Reload값 설정시 SysTick Interrupt를 계속 발생시킬 경우 0에서 Reload값으로 변경되는 1Cycle필요하기 때문에 원하는 값에 1을 빼주어야 합니다.

SysTick Interrupt를 한번만 발생시킬 경우 원하는 값을 설정하면 됩니다.

일반적으로 SysTick Interrupt를 반복적으로 사용하기 때문에 원하는 값에 1을 뺀 값을 사용합니다.

(HAL Library에서 제공하는 SysTick_Config함수는 입력 값에 -1을 하기 때문에 추가로 1을 빼지 않아도 됩니다.)

 

자세한 내용은 아래를 참고하시기 바랍니다.

 

1b2c326854089e594a4d7c9632f3307b_1493344667_2413.png

 

Counter가 0에 도달하면 설정에 따라 인터럽트가 발생되며 Counter값은 Reload값으로 자동으로 설정됩니다.

Clock은 System Clock(AHB)또는 System Clock/8(AHB/8)을 사용할 수 있습니다. 

 

 

최대 설정 시간

SysTick의 Clock은 System Clock과 System Clock을 8로 나눈 값을 사용할 수 있습니다.

 

 

 System Clock

1Cycle

(1/System Clock) 

최대 설정 시간

(1Cycle * 0xFFFFFF) 

 72Mhz

13.89nS 

233.0mS 

 120Mhz

8.333nS

139.8mS 

 168Mhz

5.952nS 

99.8mS 

 180Mhz

5.556nS 

93.2mS 

 

 System Clock/8

1Cycle

(1/System Clock) 

최대 설정 시간

(1Cycle * 0xFFFFFF) 

 9Mhz (72Mhz/8)

111.1nS 

1863.9mS 

15Mhz (120Mhz/8)

66.67nS

1118.5mS 

21Mhz (168Mhz/8)

47.62nS 

798.9mS 

22.5Mhz (180Mhz/8)

44nS 

738.1mS 

 

 

SysTick Calibration Register

SysTick Calibration Register는 특정 Clock을 사용할 때 1mS 또는 10mS를 만들 수 있는 값이 들어 있습니다.

제조사마다 다른 값을 넣어둘 수 있기 때문에 Calibration Register의 값는 Device의 설명서를 참고하여야 합니다.

또한 Readonly Register이기 때문에 값을 변경할 수 없으며 값을 읽어 현재 설정된 값과 비교하는 용도로 사용합니다.

 

STM32는 HCLK/8의 Clock을 사용할 때 1mS를 만들 수 있는 값이 들어 있습니다.

명시된 Clock을 사용할 경우 Calibration Register의 값을 읽어 Reload Register에 넣으면 1mS를 만들 수 있습니다.

Calibration Register의 값은 Reference Manual에 명시되어 있습니다.

 

 

STM32F1의 경우 HCLK/8로 8Mhz를 사용할 경우 1mS를 만들 수 있는 9000의 값이 들어 있습니다.

 

1b2c326854089e594a4d7c9632f3307b_1493344675_7474.png



 

STM32F4의 경우 HCLK/8로 18.75Mhz를 사용할 경우 1mS를 만들 수 있는 18750의 값이 들어 있습니다.

 

1b2c326854089e594a4d7c9632f3307b_1493344681_3408.png

 

STM32F1또는 STM32F2의 경우 최대 System Clock과 동일한 값이 들어 있으나 STM32F4의 경우 최대 System Clock과  다른 값이 들어 있기 때문에 사용시 주의가 필요합니다.

   

Comments

Category
Facebook Twitter GooglePlus KakaoStory NaverBand