STM32 SysTick 사용하기

CPU/STM32F103 2013. 2. 8. 14:24

이번엔 STM32의 SysTick를 사용하여 Delay를 구현 해보도록 하겠습니다.


1. SysTick 사용설정

먼저 stm32f10x_conf.h에서 다음과 같이 설정합니다.

#define _SysTick

이래야 SysTick를 쓰겠죠!


2. SysTick를 프로젝트에 추가합니다.

stm32f10x_systick.c


3. Clock설정확인

SysTick에 공급되는 Clock에 따라서 타이머가 동작되는데..얼마나 공급할까요?

The RCC feeds the Cortex System Timer (SysTick) external clock with the AHB clock

(HCLK) divided by 8. The SysTick can work either with this clock or with the Cortex clock

(HCLK), configurable in the SysTick Control and Status Register.

이렇게 되어 있네요.

그림상으로는 8M OSC - PLL (72M) -ABH - /8 - Cortex System Timer

즉 9MHz가 되네요.


4. 기본설정

int main(void)

{

.......

/* SysTick end of count event each 1ms with input clock equal to 9MHz (HCLK/8, default) */

1>  SysTick_SetReload(9000);


  /* Enable SysTick interrupt */

2>  SysTick_ITConfig(ENABLE);


while (1)

  {

/* Insert 300 ms delay */

    Delay(300);

// do somthing

  }

}

1> The SysTick calibration value is set to 9000, which gives a reference time base of 1 ms with

the SysTick clock set to 9 MHz (max HCLK/8).라고 표시 되어 있네요.

즉 입력 clock이 9MHz이니 Timer에 9000를 설정하면 카운트하고 넘치거나하면 인터럽트가 발생하겠네요. 그러니 1msec마다 인터럽트가 발생하겠지요..


2>는 인터럽트 Enable하고 있네요.


그럼 여기서 Delay함수를 살펴봐야겠네요.

void Delay(u32 nTime)

{

  /* Enable the SysTick Counter */

 1> SysTick_CounterCmd(SysTick_Counter_Enable);

  

  2> TimingDelay = nTime;


  3> while(TimingDelay != 0);


  /* Disable SysTick Counter */

  4> SysTick_CounterCmd(SysTick_Counter_Disable);

  /* Clear SysTick Counter */

  5> SysTick_CounterCmd(SysTick_Counter_Clear);

}

1>에서 Timer를 동작시키네요.

2>는 Delay(300);이라고 호출되었으니 TimingDelay  = 300 이 되고

3> TimingDelay 가 0이 될때 까지 기다리는 군요. 요건 인터럽트에서 하나씩 감소 시키다 0으로 되겠네요.

4> Timer를 Disable시키고, 

5> 카운트 값을 Clear하네요.



5. 인터럽트 서비스 루틴 등록

void SysTickHandler(void)

{

  TimingDelay_Decrement();

}

인터럽트가 발생하면 TimingDelay_Decrement()를 호출하네요.

void TimingDelay_Decrement(void)

{

  if (TimingDelay != 0x00)

  { 

    TimingDelay--;

  }

}

TimingDelay_Decrement는 단순히 값을 하나씩 감소 시키네요.


이렇게 해서 SysTick Timer를 구현해 보았습니다.

다른건 Clock Enable이 있는데..SysTick은 없네요. 클럭도 /8로 고정되어 있고. 다른 모듈보다는 간단해서 좋네요..


인제 타이머 모듈로 넘어 갈까 합니다.



'CPU > STM32F103' 카테고리의 다른 글

STM32 TIM3 PWM MODE  (0) 2013.02.08
STM32F103 TIM2 OUTPUT COMPARE TIMMING  (0) 2013.02.08
STM32 ADC2 Interrupt Mode 사용  (1) 2013.02.08
STM32 ADC1 DMA 사용방법1  (1) 2013.02.07
STM32 GPIO INPUT 사용하기  (0) 2013.02.07