클럭 트리: 클럭이 어디서 와서 어떻게 나뉘나
HSE, PLL, 프리스케일러. 시스템 클럭과 버스 클럭, 타이머 클럭이 어떻게 정해지는지 따라갑니다.
클럭 소스
| 소스 | 특징 |
|---|---|
| HSI | 내부 RC, 16MHz 등. 정확도 1% 내외 |
| HSE | 외부 크리스털 8~25MHz. 정확 |
| LSI / LSE | 32kHz. 워치독, RTC |
| PLL | 위 소스를 곱해 높은 주파수 생성 |
예: STM32F411 100MHz
HSE 8MHz → ÷M(8) = 1MHz → ×N(200) = 200MHz → ÷P(2) = SYSCLK 100MHz
그다음 AHB, APB1, APB2 프리스케일러로 나뉩니다. APB1 최대가 50MHz라서 ÷2를 줍니다.
타이머 클럭의 함정
APB 프리스케일러가 1이 아니면, 타이머 클럭은 APB 클럭의 2배입니다. APB1이 50MHz여도 TIM2는 100MHz로 동작합니다. PWM 주파수 계산이 2배 틀리는 흔한 이유입니다.
Flash 대기 상태
클럭을 높이면 Flash가 따라오지 못해 대기 상태(wait state)를 늘려야 합니다. 순서가 틀리면(클럭 먼저 올리고 대기 상태를 나중에) 바로 하드폴트가 납니다. CubeMX의 클럭 설정 화면은 이 계산과 순서를 대신해 줍니다.
클럭이 지나가는 길
HSI(내부 RC) ─┐
HSE(외부 크리스털) ─┼─> PLL(곱하기) ─> SYSCLK ─> AHB 분주 ─> HCLK ─┬─> APB1 분주 ─> 타이머, UART, I2C
└─> APB2 분주 ─> ADC, SPI, 고속 타이머
칩이 켜지면 내부 발진기(HSI)로 시작합니다. 스타트업 코드나 초기화 함수가 외부 크리스털을 켜고, PLL로 주파수를 올린 뒤, 시스템 클럭을 PLL 쪽으로 바꿉니다.
클럭 소스 고르기
| 소스 | 정확도 | 쓰임 |
|---|---|---|
| 내부 RC (HSI) | 약 1% (온도에 따라 변함) | 부품을 줄일 때, 빠른 기동 |
| 외부 크리스털 (HSE) | 수십 ppm | USB, CAN, 정확한 UART |
| 저속 크리스털 (LSE, 32.768 kHz) | 수십 ppm | 시계(RTC), 저전력 타이머 |
UART는 양쪽 속도 차이가 약 2%를 넘으면 글자가 깨지기 시작합니다. 양쪽이 모두 내부 RC를 쓰면 오차가 더해져 위험합니다. CAN과 USB는 요구 정확도가 훨씬 높아 크리스털이 사실상 필수입니다.
예제: 8 MHz 크리스털로 72 MHz 만들기
HSE 8 MHz × PLL 9 = 72 MHz (SYSCLK)
AHB ÷1 → HCLK 72 MHz
APB1 ÷2 → PCLK1 36 MHz (이 버스의 최대 주파수 제한 때문에)
APB2 ÷1 → PCLK2 72 MHz
무료 전자책이 주제를 한 권으로 이어 읽기 (PDF 3권)→타이머 클럭이 두 배가 되는 규칙
많은 MCU에서 APB 분주비가 1이 아니면 그 버스의 타이머 클럭은 버스 클럭의 두 배가 됩니다. 위 예에서 APB1은 36 MHz지만 APB1에 달린 타이머는 72 MHz로 동작합니다. PWM 주파수가 계산의 두 배로 나오면 이 규칙을 놓친 것입니다.
주변장치는 클럭을 켜야 동작한다
전력을 아끼려고 모든 주변장치의 클럭은 처음에 꺼져 있습니다.
RCC->APB2ENR |= RCC_APB2ENR_USART1EN; // 켠 뒤에야 레지스터에 쓸 수 있음
레지스터에 값을 썼는데 읽어 보면 0이라면 클럭이 꺼져 있는 것입니다.
속도를 올리기 전에: Flash 대기 시간
Flash는 CPU만큼 빠르지 않습니다. 클럭을 올리면 Flash에서 명령을 읽어 오는 데 기다리는 주기(wait state)를 늘려야 합니다. 순서가 중요합니다.
- Flash 대기 시간을 먼저 늘린다.
- 그다음 클럭을 올린다.
반대로 하면 잘못 읽힌 명령을 실행해 즉시 폴트가 납니다. 속도를 낮출 때는 반대 순서입니다.
클럭이 실제로 얼마인지 확인하는 법
- MCO 핀: 내부 클럭을 핀으로 내보내는 기능입니다. 오실로스코프로 직접 잽니다.
- LED 1초 깜박임: 시스템 틱으로 1초를 만들어 스톱워치와 비교합니다.
- UART 한 글자:
0x55('U')를 보내 비트 폭을 재면 실제 보레이트가 나옵니다.
현업에서 자주 터지는 문제
- 크리스털이 발진하지 않음: 부하 커패시터 값이 맞지 않거나 배선이 깁니다. 기동 타임아웃을 두고 실패하면 내부 발진기로 계속 동작하게 합니다.
- 코드의 클럭 상수와 실제가 다름:
HSE_VALUE를 8 MHz로 두고 보드에는 25 MHz 크리스털이 달려 있으면 모든 타이밍이 3배 틀어집니다. - 저전력 모드에서 깨어난 뒤 느려짐: 깨어나면 내부 발진기로 돌아가 있습니다. 클럭 설정을 다시 해야 합니다.
영상으로 이어 보기회로와 하드웨어 시리즈 8편전자제품 속 회로 소자는 어떻게 동작할까? · 저항 · 커패시터 · 인덕터 완벽 정리PROJECT COURSE레지스터 설정을 실제 보드에서 해 보고 싶다면밸런싱 로봇 하나를 요구사항, 회로와 PCB, 펌웨어, 앱까지 실무 순서대로 만드는 강의입니다. 10파트 165강.강의 살펴보기 →FREE PDF무료 전자책 3권 받기이 주제를 한 권으로 이어서 읽고 싶다면. BLDC 모터 제어, 직렬통신, 센서를 책 분량으로 묶었습니다. 이메일만 남기면 바로 받습니다.무료로 받기 →