본문 바로가기

hardwares/stm32

SysTick 시간기기(timer) (1/2)

 

 

 

 

전체 보기 : https://makershackers.tistory.com/tag/baremetal_stm32_f411

 

 

 

아가야 물한잔만 가져오렴!!

 

 

flickr.com, Seattle Municipal Archives,  Boy with glass of water, 2000

tick 

 ① 째깍거리다, 똑딱거리다
 ② 똑딱거리는 소리, 재깍거리는 소리

timing

 ① 시기 선택,  속도를 맞추는, 적절한 시기를 찾아내는 기술, 시간을 잘 맞춤 

 ② 박자, 박자 감각

time

어떤 시각에서 어떤 시각까지의 사이

 

Time, 우리는 이렇게 저렇게 시간을 재려고 노력해왔습니다. 

 

 

이런것이 대표적인 시간을 재는 것이었죠. 

 

 

그런데 시간의 결정적인 변화는 이런 발견에서 확 바뀌게 되었죠. 

 

 

아래와 같은 주기적으로 떨리는 현상을 발견하게 되죠. 

 

 

그때 사용된 것이 크리스탈이었습니다. 

 

 

나중에 이렇게 확인할 수 있죠. 

 

SysTick 시간기기(계시기, timer)
 Systick 시간기기(계시기, timer)는 Cortex-M 코어에서 지원하는 24비트 시간기기입니다. 

SysTick
Systick 시간기기(계시기, timer)는 Cortex-M 코어에서 지원하는 24비트 시간기기로써 칩 제조회사에서 지원하는 시간기기보다는 적은 기능을 하는 아주 간단한 시간기기입니다. 보통은 계수기(counter)가 16비트이거나 32비트를 지원하는데 SysTick의 경우에는 24비트를 지원합니다. SysTick을 1ms로 설정하였을 때 약 4시간에 한 번씩 넘침(Overflow)이 발생합니다. 

SysTick Register 
Arm에서 Systick을 위해 4개의 등록부(Register)를 사용합니다. 4개의 등록부(Register)는 아래와 같습니다.

- SysTick Reload Register

- SysTick Current Value Register
- SysTick Control and Status Register
- SysTick Calibation Register

 

 

 

 SysTick reload value register(STK_LOAD)

ex. SysTick -> LOAD =3200000-1; //  (*SysTick).LOAD = 3200000-1;

 SysTick reload value register는 ① 계수기(counter)가 활성화되어있고, ② 0에 도달하면, STK_VAL 등록부(register)에 새로 시작하도록 올릴 값을 설정하는 등록부입니다. 

RELOAD 값 계산

RELOAD 값은 0x00000001-0x00FFFFFF 범위의 모든 값일 수 있습니다. 0이라는 시작 값도 가능하지만, 1에서 0까지 셀때(count)할 때 SysTick 예외요청(exception request)과 COUNTFLAG가 활성화되기 때문에 효과가 없습니다. RELOAD 값은 용도에 따라 계산됩니다.

STM32 Cortex®-M4 MCUs and MPUs programming manual - Programming manual, 248p

 SysTick current value register(STK_VAL)
ex. SysTick -> VAL = 0; // (*SysTick).VAL = 0; 
SysTick current value는 계수기(counter)의 현재값을 나타내는 등록부(Register)이다.
계수기(counter)의 시작은 Reload Register의 값에서 시작하여 Tick마다 하나씩 감소시킨다.
zero가 되면 COUNTFLAG가 1로 된다. 

STM32 Cortex®-M4 MCUs and MPUs programming manual - Programming manual, 249p

 

 

③ SysTick Control and Status Register(STK_CTRL)

ex. SysTick -> CTRL = 5; // (*SysTick).CTRL = 5; 

SysTick Control and Status Register는 SysTick 관련 설정과 상태를 확인하는 등록부(Register)이다.
bit 0은 박자 계수기(clock counter)를 시작할 때 1로 설정해주면 된다.
bit 1은 SysTick의 counter를 감소시키다가 0이 되면 exception request를 발생시킨다. 즉 zero가 되었을 때 간섭(interrupt)을 발생시키기 위해서는 이 등록부(Register)를 1로 설정해야 한다. 간섭(interrupt)이 발생했을 때 bit 16을 읽으면 count 가 zero임을 알수 있다.
bit 2는 SysTick에서 사용하는 박자계(clock)의 바탕값(source)을 그대로 쓰거나 1주기를 8로 나눔(8분주)한 것을 사용하거나 선택할 수 있다.  바탕값(source)을 그대로 사용할 것이라면 1로 설정하면 된다. 
그러면, 내 시스템에서 SysTick으로 사용하는 박자계(clock) 바탕값(source)이 어떤 것인지 확인해야 한다.

(예제)

#include "stm32f4xx.h"
int main (void)
{
	(*RCC).AHB1ENR |= 1;                              // ①
	(*GPIOA).MODER |= 0x400;                          // ②
  // system tick timer 설정
	(*SysTick).LOAD = 16000*1000 -1;                  // ③
	(*SysTick).VAL = 0;                               // ④
	(*SysTick).CTRL = 5;                              // ⑤

	while(1)
	{
	   if(	(*SysTick).CTRL & 0x10000)                // ⑥
	   {
		   (*GPIOA).ODR ^= 0x20; // Toggle LED    // ⑦
	   }
	}
}

 

(해설)

 

[1] (*RCC).AHB1ENR |= 1;    

reference manual stm32f411, 118p

Bit 0 GPIOAEN: IO port A clock enable
Set and cleared by software.
0: IO port A clock disabled
1: IO port A clock enabled

 

[2] (*GPIOA).MODER |= 0x400; 

reference manual stm32f411, 157p

 

     (16진수) 0x400 = (2진수) 0100 0000 0000 

 

[3,4,5] SysTick 설정

 

[6] (*SysTick).CTRL & 0x10000 

 ⑥ Bit 16 COUNTFLAG: Returns 1 if timer counted to 0 since last time this was read. 

     가장 최근에 읽었을때 시간기기가 '0'에 도달했으면, '1'을 반환 합니다. 

     (16진수) 0x10000 = (2진수) 0001 0000 0000 0000 0000

[7] (*GPIOA).ODR ^= 0x20; // Toggle LED

- bitwise XOR (^)

 

한 개만 1인 경우에만 1, 나머지는 0

 

     1 1 0 0 

     1 0 1 0 

(^) =====

     0 1 1 0

(16진수) 0x20 = (2진수) 0010 0000

 

template_002_makershackers_systick_wo_movie.pptx
9.17MB