STM32

STM32 GPIO 기본 개념과 구조, LED 제어

임베디드 친구 2024. 11. 21. 15:37
반응형

안녕하세요, '소프트웨어 공장' 블로그에 오신 것을 환영합니다. 오늘은 STM32F429ZI의 GPIO 기본 개념과 구조를 살펴보고, 이를 활용하여 간단한 LED 제어를 하는 방법에 대해 소개하려고 합니다. 특히, GPIO 설정 방법에 대해 자세히 설명하고, STM32CubeIDE를 활용한 전체 코드 예제도 함께 다루어 보겠습니다.

STM32의 GPIO는 다양한 주변 장치와의 연결을 통해 기능을 확장할 수 있도록 해주는 중요한 기능입니다. 오늘의 글을 통해 GPIO의 구조와 동작 방식을 이해하고, 실제로 간단한 LED를 제어하는 프로젝트를 진행해 보세요.

1. GPIO란 무엇인가?

GPIO(General Purpose Input/Output)는 말 그대로 범용 입출력 핀입니다. STM32F429ZI와 같은 마이크로컨트롤러에서는 GPIO를 사용하여 외부 장치와의 상호 작용이 가능합니다. GPIO는 단순히 입력과 출력을 수행하는 것뿐만 아니라 다양한 기능을 지원합니다.

  • 입력 모드(Input Mode): 외부 신호를 마이크로컨트롤러로 읽어오는 용도로 사용됩니다.
  • 출력 모드(Output Mode): 마이크로컨트롤러가 외부 장치에 신호를 보내기 위한 용도로 사용됩니다.
  • 고속 출력 모드(Alternate Function): GPIO 핀을 특정 주변 장치의 기능으로 설정할 수 있습니다.
  • 아날로그 모드(Analog Mode): ADC, DAC와 같은 아날로그 장치와 상호작용하기 위한 용도로 사용됩니다.

2. GPIO의 구조와 개념

STM32의 GPIO는 포트와 핀으로 나누어집니다. STM32F429ZI는 여러 GPIO 포트를 가지고 있으며, 각 포트에는 최대 16개의 핀이 존재합니다. 예를 들어, GPIOA 포트는 GPIOA0에서 GPIOA15까지 총 16개의 핀을 가집니다.

GPIO 설정은 각 포트의 레지스터를 통해 이루어지며, 각 레지스터는 GPIO 모드, 출력 속도, 풀업/풀다운 설정 등을 제어합니다.

  • GPIO 모드 레지스터 (MODER): 각 핀의 동작 모드를 설정합니다.
  • GPIO 출력 데이터 레지스터 (ODR): 출력 데이터를 설정하거나 읽을 수 있습니다.
  • GPIO 입력 데이터 레지스터 (IDR): 입력 데이터를 읽어오는 용도로 사용됩니다.

3. GPIO 설정 방법

STM32CubeIDE를 이용하여 GPIO를 설정하고 LED를 제어하는 방법을 소개하겠습니다. 이번 예제에서는 STM32F429ZI 보드의 내장 LED를 제어해 보겠습니다.

3.1 STM32CubeIDE를 이용한 GPIO 설정

STM32CubeIDE에서 직접 GPIO 설정을 할 수 있습니다.

  1. 프로젝트 생성: STM32CubeIDE를 열고, 새로운 STM32F429ZI 프로젝트를 생성합니다.
  2. 핀 설정: 보드에 있는 사용 가능한 핀들을 확인할 수 있습니다. 여기서 LED가 연결된 핀을 선택하고, 모드를 'GPIO Output'으로 설정합니다.
  3. 클럭 활성화: GPIO를 사용하려면 해당 포트의 클럭을 활성화해야 합니다. 소스 코드에서 직접 클럭 활성화를 해주어야 합니다.
  4. 코드 작성: 설정이 완료되면 GPIO 설정을 포함한 코드를 직접 작성합니다.

3.2 GPIO 초기화 코드 분석

GPIO를 설정하는 초기화 코드는 다음과 같습니다.

void MX_GPIO_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStruct = {0};

    /* GPIO 포트 클럭 활성화 */
    __HAL_RCC_GPIOG_CLK_ENABLE();

    /* GPIO 핀 구성 */
    GPIO_InitStruct.Pin = GPIO_PIN_13;
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    HAL_GPIO_Init(GPIOG, &GPIO_InitStruct);
}

위 코드에서 중요한 부분은 다음과 같습니다:

  • __HAL_RCC_GPIOG_CLK_ENABLE(): GPIOG 포트의 클럭을 활성화합니다. GPIO를 사용하기 위해서는 해당 포트의 클럭을 반드시 활성화해야 합니다.
  • GPIO_InitTypeDef 구조체: GPIO 핀의 설정을 정의합니다. 여기서 핀 번호, 모드, 풀업/풀다운 설정, 속도 등을 지정할 수 있습니다.
  • HAL_GPIO_Init(GPIOG, &GPIO_InitStruct): GPIOG 포트에 대해 설정을 적용합니다.

4. LED 제어 예제

이번에는 GPIO를 활용하여 LED를 제어하는 전체 코드를 작성해 보겠습니다. LED를 1초 간격으로 켜고 끄는 간단한 예제입니다.

4.1 전체 코드

아래는 STM32CubeIDE에서 사용할 수 있는 전체 코드입니다. LED가 연결된 GPIOG의 13번 핀을 이용하여 LED를 깜빡이게 만듭니다.

#include "main.h"

void SystemClock_Config(void);
static void MX_GPIO_Init(void);

int main(void)
{
    /* MCU Configuration--------------------------------------------------------*/
    /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
    HAL_Init();

    /* Configure the system clock */
    SystemClock_Config();

    /* Initialize all configured peripherals */
    MX_GPIO_Init();

    /* Infinite loop */
    while (1)
    {
        /* LED On */
        HAL_GPIO_WritePin(GPIOG, GPIO_PIN_13, GPIO_PIN_SET);
        HAL_Delay(1000); // 1초 대기

        /* LED Off */
        HAL_GPIO_WritePin(GPIOG, GPIO_PIN_13, GPIO_PIN_RESET);
        HAL_Delay(1000); // 1초 대기
    }
}

/** System Clock Configuration */
void SystemClock_Config(void)
{
    // 시스템 클럭 설정 코드 (생략)
}

/** GPIO Initialization Function */
static void MX_GPIO_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStruct = {0};

    /* GPIO Ports Clock Enable */
    __HAL_RCC_GPIOG_CLK_ENABLE();

    /*Configure GPIO pin Output Level */
    HAL_GPIO_WritePin(GPIOG, GPIO_PIN_13, GPIO_PIN_RESET);

    /*Configure GPIO pin : PG13 */
    GPIO_InitStruct.Pin = GPIO_PIN_13;
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    HAL_GPIO_Init(GPIOG, &GPIO_InitStruct);
}

4.2 코드 설명

  • HAL_GPIO_WritePin(GPIOG, GPIO_PIN_13, GPIO_PIN_SET): GPIOG의 13번 핀에 '1'을 출력하여 LED를 켭니다.
  • HAL_GPIO_WritePin(GPIOG, GPIO_PIN_13, GPIO_PIN_RESET): GPIOG의 13번 핀에 '0'을 출력하여 LED를 끕니다.
  • HAL_Delay(1000): 1000ms(1초) 동안 대기합니다.

위의 코드에서는 LED를 1초 간격으로 켜고 끄는 동작을 무한 반복합니다. GPIO 핀을 설정하고 출력 신호를 제어하는 과정을 통해 간단한 외부 장치를 제어할 수 있음을 확인할 수 있습니다.

5. 마무리

오늘은 STM32F429ZI의 GPIO에 대해 기본 개념을 배우고, 이를 활용하여 LED를 제어하는 방법을 알아보았습니다. GPIO는 임베디드 시스템에서 외부 장치와 상호작용하는 가장 기본적인 방법이며, 이를 잘 이해하는 것이 중요합니다.

이제 GPIO 설정 방법과 LED 제어 예제를 통해 STM32CubeIDE에서 직접 GPIO를 활용해 보세요. 이를 바탕으로 버튼 입력, 다양한 센서와의 인터페이스 등 더 많은 주변 장치와의 상호작용을 시도해 볼 수 있을 것입니다.

다음 시간에는 버튼을 활용한 LED 제어 예제를 통해 GPIO 입력 모드에 대해 더 깊이 알아보겠습니다.

반응형