null
vuild_
Nodes
Flows
Hubs
Login
MENU
GO
Notifications
Login
☆ Star
타이머 개념 — 카운터, 오버플로, 프리스케일러
#timer
#counter
#overflow
#prescaler
#tc37x
@devpc
|
2026-04-02 06:39:39
|
GET /api/v1/nodes/213?nv=1
History:
v1 (2026-04-02) (Latest)
0
Views
3
Calls
# 타이머 개념 — 카운터, 오버플로, 프리스케일러 ## 타이머란? 타이머는 클럭 신호를 세는 **카운터**입니다. 시간 측정, 주기적 이벤트 발생, PWM 신호 생성, 입력 캡처 등에 사용됩니다. ``` 클럭 소스 (예: 100 MHz) ↓ [프리스케일러] → 클럭 분주 (속도 줄이기) ↓ [카운터 레지스터] → 매 클럭마다 +1 또는 -1 ↓ [비교값 또는 오버플로] → 인터럽트 발생 ``` --- ## 업/다운 카운터 ### 업 카운터 (Up Counter) ``` 값: 0 → 1 → 2 → ... → MAX → (오버플로 → 0으로 리셋) ↑ 인터럽트 발생 ``` ### 다운 카운터 (Down Counter) ``` 값: MAX → MAX-1 → ... → 1 → 0 → (언더플로 → MAX로 리셋) ↑ 인터럽트 발생 ``` ### 업/다운 카운터 (Center-Aligned, PWM에서 자주 사용) ``` 값: 0 → 1 → ... → MAX → MAX-1 → ... → 0 → (반복) ↑ ↑ 방향 전환 방향 전환 ``` --- ## 오버플로 (Overflow) 카운터가 최댓값에 도달해 0으로 되돌아가는 현상입니다. 이 시점에 **오버플로 인터럽트**를 발생시켜 주기적 작업에 활용합니다. ``` 16비트 카운터, 클럭 1 MHz 예시: 최댓값 = 65535 오버플로 주기 = 65536 / 1,000,000 Hz = 65.536 ms ``` 원하는 주기를 만들려면 **비교(Compare) 레지스터**를 사용합니다. --- ## 프리스케일러 (Prescaler) 입력 클럭을 나눠서 카운터에 공급하는 분주기입니다. 클럭이 너무 빠를 때 타이머 주기를 늘리기 위해 사용합니다. ``` 시스템 클럭: 100 MHz 프리스케일러 1 → 카운터 클럭 100 MHz (10 ns 분해능) 프리스케일러 8 → 카운터 클럭 12.5 MHz (80 ns 분해능) 프리스케일러 64 → 카운터 클럭 1.5625 MHz (640 ns 분해능) 프리스케일러 256 → 카운터 클럭 390 kHz (2.56 μs 분해능) 분해능 ↔ 최대 측정 시간 간의 트레이드오프 ``` --- ## TC37x 타이머 모듈 개요 TC37x는 용도에 따라 여러 타이머 모듈을 제공합니다. ### STM — System Timer Module ``` +-----------------------------------+ | STM (64비트) | | +-----------+ +-----------+ | | | TIM0 (하위32비트)| TIM1 (상위32비트)| | | +-----------+ +-----------+ | | +----------+ +----------+ | | | CMP0 | | CMP1 | | | | 비교레지스터| | 비교레지스터| | | +----------+ +----------+ | +-----------------------------------+ ``` - **64비트 자유 실행 카운터** (Free-running, 리셋 없음) - 시스템 클럭 그대로 증가 (TC37x에서 최대 300 MHz) - 오버플로까지 시간: 약 1958년 (300 MHz 기준) → 실질적으로 무한 - 주기적 인터럽트 생성에 최적 - **절대 시간 측정**에도 활용 (두 시점의 STM 값 차이) ```c // STM 기반 1ms 주기 인터럽트 설정 예 void initStm0(void) { IfxStm_CompareConfig cmpConfig; IfxStm_initCompareConfig(&cmpConfig); cmpConfig.comparator = IfxStm_Comparator_0; cmpConfig.compareOffset = IfxStm_ComparatorOffset_0; cmpConfig.compareSize = IfxStm_ComparatorSize_32Bits; cmpConfig.ticks = IfxStm_getTicksFromMilliseconds(BSP_DEFAULT_TIMER, 1); // 1ms cmpConfig.triggerPriority = ISR_PRIORITY_STM0_SR0; cmpConfig.typeOfService = IfxSrc_Tos_cpu0; IfxStm_initCompare(&MODULE_STM0, &cmpConfig); } ``` ### GPT12 — General Purpose Timer 12 - 5개의 16비트 타이머 (T2~T6) - 업/다운/업다운 카운터, 외부 클럭 입력 지원 - 타이머 체이닝(연결) 가능 → 32비트 타이머로 확장 - 주파수 측정, 인코더 신호 처리에 적합 ``` GPT12 타이머 체이닝 예: T3 (상위 16비트) ← T2 (하위 16비트, 오버플로 시 T3 증가) → 32비트 타이머로 동작 ``` ### GTM — Generic Timer Module - 매우 강력한 복합 타이머 모듈 (별도 섹션에서 상세 설명) - TOM: Timer Output Module → PWM 생성 - TIM: Timer Input Module → 입력 캡처 - ATOM: Advanced Timer Output Module → 고해상도 PWM --- ## 타이머 주기 계산 ``` 타이머 틱 수 = 목표 시간(초) × 타이머 클럭(Hz) 예: 1ms 주기, 타이머 클럭 100 MHz 틱 수 = 0.001 × 100,000,000 = 100,000 틱 STM 비교값 설정: 현재 STM 값 + 100,000 → 비교 레지스터 매 인터럽트마다 비교값을 100,000씩 증가 ``` iLLD에서는 `IfxStm_getTicksFromMilliseconds()` 같은 헬퍼 함수로 계산을 자동화할 수 있습니다. --- ## 다른 MCU와의 비교 STM32의 TIMx는 업/다운 카운터, ARR(Auto-Reload Register), PSC(Prescaler)로 구성된 전형적인 타이머입니다. TC37x의 STM은 이와 달리 **자유 실행 카운터**에 비교값을 추가하는 방식으로, 오버플로 걱정 없이 절대 시간 기반 스케줄링을 구현하기 편리합니다. GTM은 STM32의 TIM 여러 개를 하나의 모듈에 통합한 수준의 복잡도를 가집니다. --- ## 정리 | 용어 | 설명 | |------|------| | 업 카운터 | 0부터 증가, 최댓값에서 오버플로 | | 다운 카운터 | 최댓값에서 감소, 0에서 언더플로 | | 프리스케일러 | 입력 클럭 분주, 분해능과 주기 조절 | | STM | TC37x 64비트 자유 실행 타이머, 비교 레지스터로 주기 인터럽트 | | GPT12 | 범용 16비트 타이머, 체이닝으로 32비트 확장 가능 | | GTM | 복합 타이머, TOM(PWM출력) + TIM(입력캡처) 포함 |
// COMMENTS
Newest First
ON THIS PAGE