[Embedded] GPIO - LED, SW 제어

강지원·2025년 2월 3일

STM32 강의

목록 보기
24/33

1. GPIO (General Purpose Input/Output)란?

GPIO(General Purpose Input/Output)는 마이크로컨트롤러(MCU)나 임베디드 시스템에서 범용적으로 사용할 수 있는 입출력 핀을 의미합니다.

  • "범용(General Purpose)"이라는 의미처럼 특정한 기능이 정해져 있지 않고, 소프트웨어적으로 제어하여 다양한 용도로 사용할 수 있는 핀입니다.
  • 디지털 신호(0 또는 1)를 입력받거나 출력하는 기능을 수행합니다.
  • 센서, LED, 버튼, 모터 드라이버 등 다양한 외부 장치와 인터페이스하는 데 사용됩니다.

1) GPIO의 기본 동작 모드

GPIO는 입력(input) 모드와 출력(output) 모드를 가지며, 필요에 따라 추가적인 기능을 수행할 수 있습니다.

📌 (1) 입력 모드 (Input Mode)

MCU가 외부의 디지털 신호를 읽는 용도로 사용됩니다.

버튼, 스위치, 센서의 출력을 MCU가 감지할 때 사용됨.
입력값은 HIGH(1) 또는 LOW(0) 상태를 가짐.
풀업(Pull-up) 또는 풀다운(Pull-down) 저항을 사용하여 신호 안정성을 유지함.

📌 (2) 출력 모드 (Output Mode)

MCU가 외부 장치에 신호를 보내는 용도로 사용됩니다.

LED를 켜거나 끄는 경우
모터, 릴레이 등을 제어하는 경우

📌 3) 기타 동작 모드

✅ 풀업(Pull-up) / 풀다운(Pull-down) 모드

신호가 불안정하거나 부정확한 입력(플로팅, Floating)이 발생하는 것을 방지하기 위해 사용됨.
내부적으로 저항을 통해 HIGH 또는 LOW 상태를 유지함.
✅ 인터럽트(Interrupt) 모드

특정 이벤트(예: 버튼이 눌리는 순간)를 감지하여 즉시 특정 코드를 실행하도록 하는 모드.
CPU가 계속해서 GPIO를 감시하지 않아도 되므로 전력 소비를 줄이고, 효율적인 코드 실행이 가능.

✅ PWM (Pulse Width Modulation) 모드

GPIO를 이용하여 아날로그 신호를 흉내내는 방식.
LED 밝기 조절, 모터 속도 조절 등에 사용됨.
하드웨어 타이머를 활용하여 설정 가능.

2. LED 회로

PB6 - 3.3V이면 LED OFF / GND이면 LED ON

(1) LED

다리 긴 쪽이 +(전원), 짧은 쪽 -(GND)

(2) 저항

220R = 빨, 빨, 갈, (?)

(3) LED 회로에 GND 연결하기

LED ON 상태

검정색 선 - GND
빨간색 선 - 전원

1) LED 회로 하드웨어

노란색 선 - PB6

2) LED 회로 소프트웨어

(1) 핀 세팅

GPIO output - LED

(2) LED 1초 간격으로 점등

/* Infinite loop */
  /* USER CODE BEGIN WHILE */

    while (1)
    {
    	HAL_GPIO_WritePin(PB6_LED1_GPIO_Port, PB6_LED1_Pin, 0);  // ON
    	HAL_Delay(1000);

    	HAL_GPIO_WritePin(PB6_LED1_GPIO_Port, PB6_LED1_Pin, 1);  // off
    	HAL_Delay(1000);

    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
    }

3. SW 회로

스위치를 누르지 않으면, 회로가 연결되지 않기 때문에 PB0 = 1
스위치가 눌리면, 회로가 연결되어 PB0 = 0

(1) SW

한 면에 나란히 있는 부분이 1,2 / 반대편 3,4

(2) 저항

4.7K = 노 + 보 + 빨 + ?

1) SW 회로

주황선 - PB0

2) 소프트웨어

(1) 핀 세팅

4. LED, SW 동작

OUTPUT - LED

: PB6 연결
PB6 = 1 이면, LED OFF
PB6 = 0 이면, LED ON

INPUT - SW

: PB0 연결
SW를 누르지 않으면, PB0 = 1
SW를 누르면, PB0 = 0

1) 회로 연결

2) 스위치를 누르면 점등, 떼면 소등

/* Infinite loop */
  /* USER CODE BEGIN WHILE */

  	int button;
    while (1)
    {
    	button = HAL_GPIO_ReadPin(PB0_SW_GPIO_Port, PB0_SW_Pin);


    	if(button){
    		HAL_GPIO_WritePin(PB6_LED1_GPIO_Port, PB6_LED1_Pin, 1);  // OFF
    		HAL_Delay(1000);
    	}else{
    		HAL_GPIO_WritePin(PB6_LED1_GPIO_Port, PB6_LED1_Pin, 0);  // ON
    		HAL_Delay(1000);
    	}

    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
    }

0개의 댓글