본문 바로가기
Stm32/개인 학습

TIMER [1]

by [Akashic Records] 개발의선지자 2024. 5. 9.

해당 글은 개인 공부 기록을 남겨놓는 것이 목적임으로 오류가 발생할수 있습니다.

    오류 또는 업데이트된 사항이 있다면 댓글로 알려주시면 감사하겠습니다.

    아래 글은 STM32F429ZI datasheet와 Reference manual를 기준으로 작성되었습니다.

    (임베디드 개발자에게 datasheet와 Reference manual을 지도와 나침판과 다름없이 존재)

 

해당 글에서는 STM32 TIMER 제어용 레지스터와 HAL_DRIVER 함수를 정리하고자 한다.

STM32 타이머는 다양한 기능들은 내장하고 있다. 대표적으로

기본 타이머 또는 카운터 , PWM,  Compare out , input Capture 등을 지원한다.

이번 포스트는 기본 타이머 또는 카운터에 대해 설명한다.

 

HAL_DRIVER란? 

In computers, a Hardware abstraction layer (HAL) is a layer of programming that allows a computer OS to interact with a hardware device at a general or abstract level rather than at a detailed hardware level. HAL can be called from either the OS's kernel or from a device driver. In either case, the calling program can interact with the device in a more general way than it would otherwise.

 

1 .STM32 사용 타이머의 종류

 

1). SysTimer : 항상 동작하는 타이머 , HAL_Delay() 함수 등에 사

 

2). WatchDog(IWDG, WWDG) : CPU의 오동작 탐지하여 문제 발생시 재부팅 타이머

 

3). Basic Timer : 입출력 기능은 없고 시간 타이머 용도 TIMx (x : 6,7)

 

4). General Purpsose : 범용 타이머, 출력 비교, 원펄스 , 입출력 캡쳐 등으로 사용하는 타이머 TIMx (x : 2 ~ 5, 9 ~ 14)

-> 가장 많이 사용

 

5). Advanced - control : 범용 타이머보다 많은 기능을 가지는 타이머 , 주로 모터 제어와 디지털 파워 변환 용도로 사용 TIMx (x : 1, 8)

 

2. 타이머 특징에 따른 분류

 

1). 카운터 해상도(resolution) : 16비트 또는 32비트

 

2) 카운터 타입 :

-  up counter :  CNT 값이 0에서 자동 재로드 값(TIMx_ARR 레지스터 값)까지 CNT 값 증가

CNT이 ARR 같은 후 0에서 다시 시작하여 CNT  값 증가하는 작업 계속 반복. CNT = 0이 될 때 오버플로 및 업데이트 이벤트 발생

 

- down counter : CNT 값이 CNT 값을 자동 재로드 값(TIMx_ARR 레지스터 값) 값부터 시작하여 0까지 CNT 값 감소

 다시 CNT = ARR 후 시작하여 0까지 CNT 값 감소하는 작업 계속 반복. CNT = ARR이 될 때 언더플로우 및 업데이트 이벤트 발생                            

 

- up/down counter : CNT 값이 증가한 후 다시 감소하면서 카운팅하는 모드. 카운터는 0부터 ARR 값 까지 증가한 후 ARR에서 0으로 감소 -> ARR 값까지 증가 -> 0까지 감소하는  작업 계속 반복한다. 이 모드에서 업 카운터는 0 ~ (ARR-1) 까지 카운팅, 다운 카운터는 ARR ~ 1 까지 카운팅을 한다. 업/다운 카운팅 모드를 센터 얼라인(Center Aligned) 모드라고도 함.

                           

 

3. 주요 타이머 레지스터들(**중요, 자주 사용)

레지스터 이름 역할
 Counter register(TIMx_CNT) 32비트 카운터 값 저장
Prescaler regisner(TIMx_PSC)  16비트 분주비 레지스터, 공급 클럭(Fck_psc)을 16비트 크기인
1 ~ 65,536 범위의 값으로 분주비 설정 레지스터
Auto-reload register(TIMx_ARR) 16비트 카운터 주기 설정 레지스터
Capture/Compare register(TIMx_CCR)  캡쳐/비교기 레지스터, 입력신호가 주어질때 TIMx_CNT의 값을 캡쳐하거나, TIMx_CNT와 TIMx_CCR가 동일해지면 인터럽트를 발생하거나 출력 채널로 0또는 1을 출력한다.

 

Timer 공급 버스 Clock 속도, Presclaer 값, Counter Period(AutoRelad Register value)

 

4.  원하는 주파수 계산 : (공급 버스 Clock Speed  / ((Prescaler+1) *(Counter Period+1))

원하는 주기 계산 : (Counter Period+1 * Prescaler + 1) / (공급 버스 Clock Speed )

주기 : 1/주파수

 

ex) 100Mhz 클럭, Counter Periods : 50000 ,  Precaler : 20

 

50000 / (100 * 1000000) * 200 = 0.1초(second)

 

 

5. 타임 베이스 함수(Function)

함수 명 설명
 HAL status HAL_TIM_Base_Init(TIM_HandleDef * htim) TIM의 카운터 부분(Time Base Unit)을 TIM_HandleTypeDef 
구조체의 설정값에 맞추어 초기화 하고 TIM Base Handle 생성
HAL status HAL_TIM_Base_DeInitTIM_HandleDef * htim) TIM의 카운터 부분(Time Base Unit)을 초기화 해제
HAL status HAL_TIM_Base_Start(TIM_HandleDef * htim) TIM Base의 동작 시작
HAL status HAL_TIM_Base_Stop(TIM_HandleDef * htim) TIM Base의 동작 정지
HAL status HAL_TIM_Base_Start_IT(TIM_HandleDef * htim) TIM Base의 동작을 인터럽트 모드로 시작
HAL status HAL_TIM_Base_Stop_IT(TIM_HandleDef * htim) TIM Base의 인터럽트 모드 동작 종료

 

 

인터럽트에 대해 다룰 때 "타이머 인터럽트"에 대해 자세히 설명할 예정입니다.

'Stm32 > 개인 학습' 카테고리의 다른 글

Timer[3] - PWM  (0) 2024.06.19
Timer[2] - 타이머 인터럽트  (0) 2024.06.13
Interrupt(EXTI)  (0) 2024.06.08
GPIO(3) 입력 제어  (0) 2024.05.09
GPIO(1)  (0) 2024.04.26