본문 바로가기

[STM32F746G-DISCO] Timer 사용하기

by rudals.kim 2024. 7. 9. 댓글 개
반응형
아래 테스트는 STM32CubeIDE 1.6.1/STM32Cube_FW_F7_V1.16.1를 사용하여 테스트 되었습니다.


STM32F746NG 데이터시트에서 Timer 관련 부분을 살펴보았습니다.
아래는 각 Timer에서 사용되는 어드레스와 버스가 적혀 있습니다.

STM32F746NG의 Timer는 총 14개의 Timer를 가지고 있으며 TIM1/TIM8은 Advance-control로, TIM2/TIM3/TIM4/TIM5/TIM9/TIM10/TIM11/TIM12/TIM13/TIM14은 General-purpose로, TIM6/TIM7은 Basic timer로 사용됩니다. 그 외에 소모전력을 줄이기 위해 사용되는 Low-power timer(LPTIM)가 있습니다.

각 Timer의 자세한 스펙은 데이터시트를 참고해 주시고 간략한 특징은 아래와 같습니다.

# Advanced-control timers (TIM1/TIM8)

• 16-bit up, down, up/down auto-reload counter.
• 16-bit programmable prescaler allowing dividing (also “on the fly”) the counter clock frequency either by any factor between 1 and 65536.
• Up to 6 independent channels for:
– Input Capture (but channels 5 and 6)
– Output Compare
– PWM generation (Edge and Center-aligned Mode)
– One-pulse mode output
• Complementary outputs with programmable dead-time
• Synchronization circuit to control the timer with external signals and to interconnect several timers together.
• Repetition counter to update the timer registers only after a given number of cycles of the counter.
• 2 break inputs to put the timer’s output signals in a safe user selectable configuration.
• Interrupt/DMA generation on the following events:
– Update: counter overflow/underflow, counter initialization (by software or internal/external trigger)
– Trigger event (counter start, stop, initialization or count by internal/external trigger)
– Input capture
– Output compare
• Supports incremental (quadrature) encoder and Hall-sensor circuitry for positioning purposes
• Trigger input for external clock or cycle-by-cycle current management

# General-purpose timers (TIM2/TIM3/TIM4/TIM5)

• 16-bit (TIM3, TIM4) or 32-bit (TIM2 and TIM5) up, down, up/down auto-reload counter.
• 16-bit programmable prescaler used to divide (also “on the fly”) the counter clock frequency by any factor between 1 and 65535.
• Up to 4 independent channels for:
– Input capture
– Output compare
– PWM generation (Edge- and Center-aligned modes)
– One-pulse mode output
• Synchronization circuit to control the timer with external signals and to interconnect several timers.
• Interrupt/DMA generation on the following events:
– Update: counter overflow/underflow, counter initialization (by software or internal/external trigger)
– Trigger event (counter start, stop, initialization or count by internal/external trigger)
– Input capture
– Output compare
• Supports incremental (quadrature) encoder and hall-sensor circuitry for positioning purposes
• Trigger input for external clock or cycle-by-cycle current management

# General-purpose timers (TIM9/TIM10/TIM11/TIM12/TIM13/TIM14)

◈ TIM9/TIM12 main features
• 16-bit auto-reload upcounter
• 16-bit programmable prescaler used to divide the counter clock frequency by any factor between 1 and 65536 (can be changed “on the fly”)
• Up to 2 independent channels for:
– Input capture
– Output compare
– PWM generation (edge-aligned mode)
– One-pulse mode output
• Synchronization circuit to control the timer with external signals and to interconnect several timers together
• Interrupt generation on the following events:
– Update: counter overflow, counter initialization (by software or internal trigger)
– Trigger event (counter start, stop, initialization or count by internal trigger)
– Input capture
– Output compare

◈ TIM10/TIM11/TIM13/TIM14 main features
• 16-bit auto-reload upcounter
• 16-bit programmable prescaler used to divide the counter clock frequency by any factor between 1 and 65536 (can be changed “on the fly”)
• independent channel for:
– Input capture
– Output compare
– PWM generation (edge-aligned mode)
– One-pulse mode output
• Interrupt generation on the following events:
– Update: counter overflow, counter initialization (by software)
– Input capture
– Output compare

# Basic timers (TIM6/TIM7)

◈ TIM6/TIM7 main features
• 16-bit auto-reload upcounter
• 16-bit programmable prescaler used to divide (also “on the fly”) the counter clock frequency by any factor between 1 and 65535
• Synchronization circuit to trigger the DAC
• Interrupt/DMA generation on the update event: counter overflow

ST의 타이머 관련 자료를 보던 중 Timer에 대해 일목요연하게 정리된 표가 있어서 발췌해 왔습니다.

위 Timer중 General-purpose용으로 사용할 수 있는 TIM3를 사용하여 테스트해 보겠습니다.

 

간단히 TIM3를 1Hz 타이머로 구동해 보았습니다.
STM32CubeIDE에서 새 프로젝트를 생성하여 핀 초기화 후 RCC/SYS/TIM3/USART1/GPIO(PI1)만 초기화했습니다.
RCC에서 외부 클럭을 사용하도록 설정 후 HCLK는 최댓값인 200MHz로 설정하였습니다.
기본적으로 HCLK를 설정하면 자동으로 TIM3에서 사용되는 APB1의 클럭은 HCK/2인 100MHz로 설정됩니다.

원하는 타이머 주파수 = APB1 clock/((Prescaler+1)* (AutoReload Register+1))로 계산할 수 있으며 시간으로 변경은 1/주파수를 하면 시간값으로 변환 할 수 있습니다.

여기서 Precaler와 AutoReload Register는 16bit 값으로 0 ~ 65535 범위내의 값으로 사용할 수 있습니다.
따라서 1Hz(= 1초)를 만들려면 100MHz/(10000 * 10000)하면 됩니다.

해당 PSC, ARR 값을 아래 TIM3 configuration에 적용시킵니다.

main 함수의 초기화 부분에서 TIM3를 초기화시킵니다.

/* USER CODE BEGIN 2 */
HAL_TIM_Base_Start_IT(&htim3);
/* USER CODE END 2 */

 

User Code 부분에 타이머가 종료 시 호출되는 callback 함수를 등록합니다.

/* USER CODE BEGIN 0 */
static uint32_t old_tick = 0;
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
  uint32_t new_tick;

  if(htim->Instance == TIM3){
    HAL_GPIO_TogglePin(D13_GPIO_Port, D13_Pin);
    new_tick = HAL_GetTick();
    printf("TIM3 expired!!!(%d ms)\r\n", (int)(new_tick - old_tick));
    old_tick = new_tick;
  }
}
/* USER CODE END 0 */


위와 같이 TIM3를 설정 후 빌드하여 실행해 보면 아래와 같이 999ms마다 타이머가 실행되는 것을 확인할 수 있습니다.

이상하게도 printf 문을 이용해서 측정된 시간 간격을 찍으니 999ms로 나옵니다.
그래서 제가 가지고 있는 저렴한 Logic Analyzer를 사용하여 LED 토글 간격을 측정해 보았습니다.

측정해 보니 하드웨어상으로는 1초 간격으로 동작되고 있었습니다.
아마도 인터럽트 우선순위나 tick 값이 프로그램의 영향을 받는 듯 보입니다.

반응형

댓글