
수정 발진기 (quartz oscillator) 는 정확한 주기 신호를 발생시키는 부품소자로, MCU에 Clock을 공급 해주는 역할을한다.
CPU: 연산하고 명령어 실행하는 두뇌버스(Bus): CPU와 메모리, 주변장치 사이에 데이터를 주고받는 통로주변장치(Peripheral): 타이머, UART, SPI, I2C, ADC 같은 부품들
CPU가 메모리에 값을 읽으려고 하는데, 버스나 메모리가 아직 준비 안 되어 있으면 문제가 생긴다.
예를들어 CPU 와 메모리가 서로 다른 Clock을 기준으로 동작한다면 당연히 CPU가 메모리에 요청하고,
값을 읽는 타이밍이 메모리가 값을 준비하고 출력하는 타이밍과 엇갈려서 이상한 값을 읽게될 것이다.
모든 부품이 같은 시간 기준을 공유해서 “같은 박자”에 맞춰서 움직여야 데이터 손실이나 오작동이 없다.
MCU가 동작하려면 CPU와 버스, 주변장치들이 동기화된 일정한 속도로 동작해야한다.
- 이때 기준이 되는 메인 주파수가 System Clcok(SYSCLK) 이다.
- 이 SYSCLK를 한 번 분주하여
HCLK를 만들고,HCLK가 실제 CPU와 버스, 주변장치들이 동기화된클럭이 된다.
이 클럭 신호에 맞춰서 CPU, 버스, 주변장치들이 "틱-틱-틱" 하고 동작한다.
(일반적으로 MCU에서 "Clock"이라고 하면 이 SYSCLK를 가리킨다)
MCU 클럭이 48 MHz라면, 1초에 48,000,000번 "틱" 하고 각 "틱"마다 CPU, BUS, 주변 장치들이 동작한다.

SYSCLK는 보통 위의 그림처럼 3가지 (HSI,HSE,PLL) 중 하나에서 가져온다.
이러한 고속 클럭은 주파수가 MHz 단위이다.
MCU 내부에 내장된 RC 오실레이터
주파수: 보통 8~16 MHz
단점: 온도·전압 변화에 따라 오차가 커짐 (±1%~5%)
외부 크리스털(Quartz) 또는 세라믹 공진기등의 외부 오실레이터
주파수: 보통 4~25 MHz
장점: 정확도 높음 (20~50 ppm 수준)
단점: 외부 부품 필요, 부팅 시 안정화 시간 필요
위의
HSI나HSE를 입력으로 받아 주파수를 배수(승주)하거나 나누어(분주) 원하는 SYSCLK로 만들어주는 회로
예: 8 MHz HSE × 10 = 80 MHz SYSCLK
SYSCLK 말고, 특정 기능을 위해 별도의 저속 클럭을 쓰는 경우도 있다.
이러한 저속 클럭은 보통 주파수가 kHz 단위이다.
약 32 kHz의 내부 RC 오실레이터
장점: 외부 부품 필요 없음, 저전력
단점: 정확도 낮음 (±5% 이상)
32.768 kHz 외부 크리스털
장점: 매우 정확함 (±20 ppm 수준)
단점: 외부 부품 필요

위의 그림에서 보이는 것 처럼 HSE,HSI,PLL 중 한 소스를 골라서 SYSCLK를 결정하고,
SYSCLK를 한 번 분주해서 HCLK를 얻는다.
이후, HCLK는 CPU, 메모리, 버스,,기타 주변장치들의 동기화된 CLK으로 동작한다.
Clock Tree는 datasheet에서 찾을 수 있다.

이 부분이 Clock Tree 이다.
OSC_IN,OSC_OUT 핀**외부 고속 클럭 (High-Speed External Clock, HSE)이 연결되는 핀
4~16 MHz 의 oscillator가 연결된다.OSC32_IN,OSC32_OUT핀외부 저속 클럭(Low-Speed External Clock, LSE)가 연결되는 핀
- 주파수 범위:
32.768 kHz의oscillator가 연결된다.

PLL이라는 회로가 존재한다. 이 회로는 MCU나 CPU에서 클럭 주파수를 정밀하게 곱하거나 나누는 회로이다.
크리스털이 8 MHz인 경우,MCU가 80 MHz로 동작해야 한다면
HSE 입력 (OSC_IN/OSC_OUT + 8 MHz 크리스털) 을 받아서
PLL 회로를 이용해×10 → 80 MHz 로 승주(Multiply)해서 사용할 수 있다.- 만약,
MCU가 40 MHz로 동작해야 한다면
PLL 회로를 이용해÷2 → 40 MHz로 분주(Divide)해서 사용할 수 있다.
이렇게 하면 MCU는 입력 주파수(오실레이터)를 기반으로 원하는 속도의 내부 클럭을 만들어낼 수 있다.

위와 같이 MUX를 이용해 소스를 선택한다.

Clock Tree를 보면 위와같이 매우 많은 분주기들이 있는 것을 확인할 수 있다.
분주기란 무엇일까?
주파수 클록을 받아서 1/2, 1/4, 1/8 … 이런 식으로 나눠서 낮은 주파수로 출력하는 장치이다.
주파수가 빠르면 더 빨리 동작해서 좋은건데 왜 굳이 분주를 하는 것일까?
전력 소모를 줄이기 위함.최대 허용 클록 제한을 맞추기 위해서등의 이유가 있다.
각 분주기에 대해서 알아볼 것이다.

SYSCLK (PLL/HSE/HSI 등에서 만들어진 시스템 클록)HCLKClock Tree를 보면 알 수 있듯이 HCLK는 AHB bus에 공급되는 클럭 신호로, CPU(ARM 코어), DMA, 메모리 등이 전부 HCLK 를 공급받아 클럭 신호로 사용한다는 것을 알 수 있다.
보통 최대의 성능을 위해 AHB Prescaler = 1 로 설정해 SYSCLK = HCLK로 사용한다.

입력: HCLK
출력: PCLK1, PCLK2
역할: APB 버스에 연결된 주변장치들(USART, I2C, TIM, ADC 등)에 공급할 클록을 결정한다.
즉, APB 버스 에는 여러 주변 장치들이 연결되어있고, APB Prescaler 의 분주를 거친 클럭 신호가 APB 버스로 전송된다.
APB 버스에 연결된 주변 장치들은 해당 클럭 신호를 받아서 쓰게된다.

위의 사진을 보면 알 수 있듯이
TIM 1,2,3,4에 공급되는 클럭 신호의 경우 APB Prescaler 값이 1이면 x1을, 1보다 크면 x2를 해준다.
그 이유는 타이머의 해상도 때문이다.
타이머의 해상도는 타이머가 시간을 측정할 떄 얼마나 정밀하게 측정할 수 있는지를 나타낸다.
타이머가 사용하는 클럭 신호의 주파수가 높을수록 1초동안 더 많은 카운트이 일어나고
-> 그 결과 시간을 더 작은 단위로 쪼갤 수 있는 것이다.
-> 이렇게 세밀하게 카운트하는 타이머는 PWM, 모터 정밀 제어등에 사용될 수 있다.


보면 알겠지만, DataSheet의 Clock Tree와 Clock Configuration이 거의 1:1로 대응되는 것을 확인할 수 있다.
(STM32CubeIDE의 Clock Configuration이 Clock Tree 를 간략화해서 보여주는것 같다.)

보드의 클락을 설정하는 부분이다.

위는 STM32F103RB의 Schematic의 일부이다. (https://www.st.com/en/evaluation-tools/nucleo-f103rb.html#cad-resources)
우선, MCU의 OSC_IN,OSC_OUT 핀과 OSC32_IN,OSC32_OUT핀에 각각 MCU 외부의 오실레이터가 연결되어 있는 것을 확인할 수 있다.
Not Assembled라는 의미이며, 패드는 있는데 장착은 안되어있음을 의미한다.

위와같이 X3 패드는 있는데 오실레이터가 장착되지 않은 것을 확인할 수 있다.
위와같이 HSE or LSE가 보드에 탑재되어있지 않은 경우, MCU에는 보통 내장 오실레이터가 기본적으로 존재한다.
즉, OSC_IN/OUT이 없는경우 MCU는 내부 클럭으로 동작한다.

앞서 확인했듯이 해당 보드이 HSE는 존재하지않고, LSE는 존재한다.
이 프로젝트에서는 내부 클럭 소스를 사용할 예정이므로 Clock Configuration에서는 HSE와 LSE를 둘다 Disable 시킨다.
아무것도 하지않고 그대로 두면 위와같이 기본값이 Disable 이다.

(HSE와 LSE가 disable되어, Clock 설정하는 GUI에서 회색으로 처리되어 있는 것을 확인할 수 있다)
HCLK를 72MHz로 설정해줬더니 위와 같이 현재 선택된 소스로는 72MHz를 만들 수 없다 고 뜬다.

OK를 누르니 위와같이 선택된 소스로는 최대가 64MHz라고한다.
다시한 번 OK를 눌러주자.

Clock 설정 끝!