전체 보기 : https://makershackers.tistory.com/tag/baremetal_stm32_f411
아가야 물한잔만 가져오렴!!
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 값은 용도에 따라 계산됩니다.
② 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로 된다.
③ 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;
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;
(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
'hardwares > stm32' 카테고리의 다른 글
STM32F103 스터디 모임 (8일/8일) (0) | 2022.01.03 |
---|---|
SysTick 시간기기(timer) (2/2), 1초 이상 (0) | 2021.07.20 |
Nucleo-F411RE 내장 LED 깜빡이기 - BSRR (0) | 2021.03.11 |
[ 번역 ] MOOC - STM32Cube.AI workshop (2/2) (0) | 2021.02.18 |
[ 번역 ] MOOC - STM32Cube.AI workshop (1/2) (0) | 2021.02.18 |