티스토리 뷰

ARM Cortex-M

System Timer

Just4Fun 2017. 2. 24. 22:41

STM32F103의 블럭도를 자세히 보면 타이머 블럭이 APB2버스에 하나, APB1버스에 세개, 모두 4개의 타이머가 연결되어 있는것을 볼 수 있다.

이렇게 여러개의 타이머 블럭들이 주변장치의 한가지로 버스에 연결되어 있는데, powerPC나 MIPS CPU의 경우 CPU core 안에 OS에서 사용할 수 있도록 시스템 타이머가 기본적으로 들어 있다.

ARM의 경우에는 이러한 시스템타이머가 없었는데 Cortex 시리즈가 나오면서 ARM 코어 내에 시스템 타이머가 기본으로 들어가게 되었다.

당연히 Cortex-M3 코어가 내장되어 있는 STM32F103에도 시스템 타이머가 들어가 있다.

이번 글에서는 이 시스템 타이머를 이용하여 정확한 delay() 함수를 구현해 보도록 하겠다.

Datasheet 문서의 클럭체계도를 보면 알겠지만 Cortex System timer로 들어가는 클럭은 AHB 클럭의 8분주값이 들어가게 된다.

시스템 타이머를 동작 시키기 위한 레지스터는 다음과 같다.

위의 그림에는 4개의 레지스터가 보이지만 실제로는 앞의 세개만 사용된다고 보면된다.

첫번째 레지스터인 STK_CTRL에는 4개의 컨트롤 비트가 할당되어 있는데,  STK_VAL 레지스터의 값이 0이 되는 순간 COUNTFLAG 비트가 1이 되고, 이 값을 읽는 동작을 수행하면 다시 0이 된다.

CLKSOURCE 비트는 시스템 타이머로 들어오는 클럭을 어떤걸 사용할지 결정하기 위하여 사용한다.

문서에 보면 CLKSOURCE 비트값의 정의를 위와 같이 설명하고 있다. 이 비트값이 0이면 AHB/8의 클럭이 사용되고, 1이면 AHB값을 그대로 사용하게 된다.  좀 더 정밀한 설정을 위해서는 AHB클럭을 그대로 사용하면 되고, 그렇게 정밀할 필요가 없을때는 그냥 0으로 사용하면 된다.

TICKINT는 COUNTFLAG값이 1이 될때 SYSTICK 인터럽트를 발생하도록 하기 위해서 설정하면 된다.

ENABLE 비트를 1로 설정하면 시스템 타이머가 동작한다.

STK_LOAD 레지스터는 24비트 값을 설정할 수 있는데, 타이머가 동작하면 STK_VAL가 STK_LOAD값에서부터 1씩 감소하게 된다.  STK_VAL값이 0이 되면 COUNTFLAG값이 1이 되고 STK_VAL값은 다시 STK_LOAD값에서부터 감소하게 된다.

시스템 타이머 동작은 STK_LOAD값만 적당하게 설정한 후 ENABLE만 해주면 되는 아주 간단한 구조로 되어 있으므로 코드가 크게 복잡하지 않다.

delay() 함수는 msec 단위의 값을 인자로 받아들이게 되어 있다.  따라서 STK_LOAD값을 1msec의 시간만큼 설정해주고, 인자로 들어온 값만큼 반복 수행하면 정확하게 해당 시간동안 지연을 할 수 있게 된다.


참고로 UART 블럭의 BRR레지스터 설정코드가 이전에는 float 연산을 한것에 반해 이번에는 integer 계산으로 변경하였으니 이 부분도 같이 분석해 보기 바란다.


systimer.zip



'ARM Cortex-M' 카테고리의 다른 글

printf()를 만들어 보자  (3) 2017.03.12
interrupt  (0) 2017.02.25
UART - STDIO  (5) 2017.02.18
UART  (0) 2017.02.18
Clock 설정  (0) 2017.02.17
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함