STM32

STM32 Timer 활용 - PWM 생성 및 타이머 인터럽트 설정

임베디드 친구 2024. 11. 22. 14:17
반응형

STM32F429ZI의 타이머는 다양한 기능을 제공하여 마이크로컨트롤러의 타이밍 제어나 PWM 생성 등 다양한 작업을 수행할 수 있게 도와줍니다. 이번 포스팅에서는 타이머의 종류와 기본 개념을 다루고, PWM 생성, 타이머 인터럽트 설정 및 사용 방법에 대해 알아보겠습니다. 특히 GPIO 설정을 포함하여 타이머 기능을 사용하는 방법을 자세히 설명하고, 예제 소스 코드도 제공할 것입니다.

1. STM32 타이머의 종류 및 기본 개념

STM32F429ZI에는 다양한 타이머가 포함되어 있습니다. 주요 타이머는 다음과 같습니다:

  1. Advanced Control Timer (타이머 1, 8): 고급 PWM 기능과 다양한 타이밍 제어를 제공합니다.
  2. General Purpose Timer (타이머 2-5, 9-14): 기본적인 타이밍 제어 및 PWM 생성 기능을 제공합니다.
  3. Basic Timer (타이머 6, 7): 주로 시간 지연(dela)의 생성에 사용됩니다.

타이머는 기본적으로 카운터, 프리스케일러, 자동 재로드 레지스터 등을 사용하여 주기적으로 인터럽트를 발생시키거나 PWM 신호를 생성할 수 있습니다.

1.1 타이머의 주요 개념

  • 카운터(Counter): 타이머의 주요 요소로서, 일정 주기로 값을 증가(혹은 감소)시킵니다.
  • 프리스케일러(Prescaler): 클록을 분주하여 타이머의 주기를 결정하는 요소입니다. 프리스케일러를 통해 타이머가 작동하는 속도를 조절할 수 있습니다.
  • ARR (Auto Reload Register): 자동 재로드 레지스터로, 카운터가 특정 값에 도달하면 다시 초기값으로 리셋되도록 합니다.

이러한 기본 요소들을 이용해 타이머는 여러 기능을 수행할 수 있습니다.

2. PWM 생성 및 제어

PWM(Pulse Width Modulation)은 펄스의 폭을 조절하여 출력 신호의 평균 전력을 제어하는 방법입니다. STM32F429ZI에서는 일반 목적으로 타이머를 이용해 PWM 신호를 쉽게 생성할 수 있습니다. PWM은 LED 밝기 제어나 모터의 속도 조절 등에 자주 사용됩니다.

2.1 PWM 설정 단계

  1. 타이머 인스턴스 초기화: 원하는 타이머를 선택하여 기본적인 설정을 수행합니다.
  2. GPIO 설정: PWM 신호를 출력할 핀을 설정합니다.
  3. PWM 채널 구성: 타이머의 특정 채널을 선택하여 PWM 모드로 설정합니다.

3. 타이머 인터럽트 설정 및 사용

타이머는 카운터가 일정 값에 도달할 때 인터럽트를 발생시킬 수 있습니다. 이를 이용해 주기적인 작업을 수행하거나 정확한 시간 지연을 구현할 수 있습니다.

3.1 타이머 인터럽트 설정 단계

  1. 타이머 초기화: 타이머를 원하는 주기로 설정합니다.
  2. 인터럽트 설정: NVIC(내부 인터럽트 컨트롤러)를 이용해 타이머 인터럽트를 활성화합니다.
  3. 인터럽트 서비스 루틴 작성: 타이머에 의해 호출될 인터럽트 핸들러 코드를 작성합니다.

4. GPIO 설정 방법

타이머를 이용해 PWM을 생성하거나 타이머 인터럽트를 사용하는 경우, 관련 GPIO 핀을 설정하는 것이 중요합니다. STM32CubeIDE를 이용해 GPIO를 설정하는 방법은 다음과 같습니다.

4.1 STM32CubeIDE를 이용한 GPIO 설정 과정

  1. 핀 설정: STM32CubeIDE의 핀아웃 구성 화면에서 타이머와 연결할 GPIO 핀을 선택합니다. 해당 핀을 클릭하여 타이머 출력(Timer Output) 모드로 설정합니다.
    • 예를 들어, TIM3 채널 1의 PWM 출력을 사용하려면 GPIO PA6 핀을 선택하고 Alternate Function으로 TIM3_CH1을 설정합니다.
  2. 퍼리페럴 설정: 타이머 설정 화면에서 원하는 타이머와 채널을 설정합니다. PWM 모드를 선택하고, 프리스케일러와 주기를 원하는 값으로 설정합니다.
  3. 코드 생성: 설정이 완료되면 상단의 Code Generation 버튼을 클릭하여 초기화 코드가 생성되도록 합니다.

STM32CubeIDE는 이러한 과정을 통해 자동으로 GPIO 초기화 코드와 타이머 설정 코드를 생성해 주며, 사용자는 필요한 부분을 추가로 수정하여 사용할 수 있습니다.

4.2 코드로 직접 GPIO 설정

아래는 코드로 GPIO를 설정하는 방법을 보여줍니다.

// GPIO 및 타이머 관련 헤더 파일 포함
#include "stm32f4xx_hal.h"

TIM_HandleTypeDef htim3;

// GPIO 및 타이머 초기화 함수
void SystemClock_Config(void);
void MX_GPIO_Init(void);
void MX_TIM3_Init(void);

int main(void)
{
  // HAL 라이브러리 초기화
  HAL_Init();

  // 시스템 클록 설정
  SystemClock_Config();

  // GPIO 초기화
  MX_GPIO_Init();

  // 타이머 초기화
  MX_TIM3_Init();

  // PWM 출력 시작 (TIM3의 채널 1)
  HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1);

  while (1)
  {
    // 메인 루프: 추가 기능 구현 가능
  }
}

// 타이머 3 초기화 함수
void MX_TIM3_Init(void)
{
  TIM_OC_InitTypeDef sConfigOC = {0};

  htim3.Instance = TIM3;
  htim3.Init.Prescaler = 83;
  htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim3.Init.Period = 999;
  htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
  if (HAL_TIM_PWM_Init(&htim3) != HAL_OK)
  {
    // 초기화 에러 처리
    Error_Handler();
  }

  sConfigOC.OCMode = TIM_OCMODE_PWM1;
  sConfigOC.Pulse = 499;
  sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
  sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
  if (HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
  {
    // 설정 에러 처리
    Error_Handler();
  }
}

// GPIO 초기화 함수
void MX_GPIO_Init(void)
{
  GPIO_InitTypeDef GPIO_InitStruct = {0};

  // GPIO 클럭 활성화
  __HAL_RCC_GPIOA_CLK_ENABLE();

  // PA6 핀을 타이머 3 채널 1의 PWM 출력으로 설정
  GPIO_InitStruct.Pin = GPIO_PIN_6;
  GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  GPIO_InitStruct.Alternate = GPIO_AF2_TIM3;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}

// 시스템 클록 설정 함수 (기본 설정)
void SystemClock_Config(void)
{
  // 기본적인 클록 설정 코드 작성 (생략)
}

// 에러 핸들러 함수
void Error_Handler(void)
{
  // 에러 발생 시 처리 방법 (무한 루프 등)
  while(1)
  {
  }
}

위 코드는 타이머 3을 이용해 PWM을 생성하고, GPIO PA6을 타이머 출력 핀으로 설정하는 예제입니다. PWM 신호의 주기와 듀티 사이클을 조정하여 출력 신호의 특성을 변경할 수 있습니다.

5. 결론

이번 포스팅에서는 STM32F429ZI의 타이머에 대해 알아보았습니다. 타이머의 종류와 기본 개념을 설명하고, PWM 생성 및 타이머 인터럽트를 설정하고 사용하는 방법을 설명하였습니다. 또한 GPIO를 설정하고 이를 활용해 타이머와 연동하는 방법을 예제 코드와 함께 소개하였습니다. STM32CubeIDE를 이용하여 손쉽게 개발할 수 있으며, 직접 코드를 작성하여 타이머의 동작 원리를 이해하는 것도 매우 유익합니다.

타이머를 잘 활용하면 정밀한 시간 제어가 가능하고, 다양한 임베디드 시스템 프로젝트에서 강력한 도구로 사용될 수 있습니다.

반응형

'STM32' 카테고리의 다른 글

STM32 SPI 설정 및 활용 가이드  (0) 2024.11.25
STM32 I2C 설정 및 센서 통신 예제  (0) 2024.11.24
STM32 UART 설정 및 사용 가이드  (0) 2024.11.23
STM32 GPIO 기본 개념과 구조, LED 제어  (0) 2024.11.21
STM32 시리즈  (0) 2024.11.21