GPIO

moonsyu·2026년 8월 9일

stm32

목록 보기
3/9

개념

  • General Purpose Input/Output
  • MCU가 외부 장치와 디지털 신호를 주고받을 수 있도록 만든 범용 입출력 핀

동작

  • 버튼 상태 확인
  • LED On/Off
  • 릴레이나 모터 드라이버 제어
  • Sensor의 디지털 신호 읽기
  • UART, SPI, I^2C 같은 통신 핀으로 사용

GPIO 핀 이름

  • 하나의 GPIO 포트에는 최대 0 ~ 15까지의 핀 번호 존재
  • 다만 MCU 패키지에 따라 실제 핀의 수는 다름
이름의미
PA5GPIOA의 5번 핀
PB11GPIOB의 11번 핀
PC13GPIOC의 13번 핀


동작 모드

  • 각 핀의 모드는 GPIOx_MODER 레지스터에서 설정 (핀 하나당 2비트 사용)
MODER 값모드기능
00Input외부 디지털 신호 읽기
01OutputHIGH 또는 LOW 출력
10Alternate FunctionUART, SPI, 타이머 등으로 사용
11AnalogADC, DAC 같은 아날로그 기능

입력과 출력

  • 입력
    - 외부 핀의 전압 상태(High, Low)를 읽음
    - High: 전압 != 0;
    - Low: 전압 == 0;

    /* GPIOA 클럭 활성화 */
    RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN;
    
    /* 입력 모드 설정 */
    /* (PA8의 MODER 비트를 00으로 설정) */
    GPIOA->MODER &= ~(3U << (8U * 2U));
    
    /* PA8의 전압이 0인지 아닌지 확인 */
    if ((GPIOA->IDR & (1U << 8)) != 0U) {
    	/* PA8이 HIGH */
    } else {
    	/* PA8이 LOW */
    }
    
  • 출력
    - 외부 핀에 전압(High, Low) 출력
    - High: 3.3V
    - Low: 0V

    /* GPIOA 클럭 활성화 */
    RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN;
    
    /* 모드 초기화 */
    /* PA8의 기존 MODER 비트를 00으로 초기화 */
    GPIOA->MODER &= ~(3U << (8U * 2U));
    
    /* 출력 모드 설정 */
    /* PA8의 MODER 비트를 01로 설정 */
    GPIOA->MODER |= (1U << (8U * 2U));
    
    /* 출력 예시 */
    while (1)
    {
        /* PA8 HIGH */
        GPIOA->BSRR = (1U << 8);
        HAL_Delay(500);
    
        /* PA8 LOW */
        GPIOA->BSRR = (1U << (8U + 16U));
        HAL_Delay(500);
    }
    
    

※ BSRR

Alternate Function Mode

  • GPIO 핀의 제어권을 UART, SPI, I2C, Timer 같은 MCU 내부 주변장치에 연결하는 기능
  • 연결된 주변장치가 핀의 입력 또는 출력을 제어한다
// PA2 핀을 USART2_TX에 연결하는 예시

/* GPIOA Clock Enable */
RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN;

/* PA2 Alternate Function Mode: 10 */
GPIOA->MODER &= ~(3U << (2U * 2U));
GPIOA->MODER |=  (2U << (2U * 2U));

/* PA2 AF 필드를 0000으로 초기화 */
GPIOA->AFR[0] &= ~(0xFU << (2U * 4U));

/* PA2 AF7: 0111 */
GPIOA->AFR[0] |= (7U << (2U * 4U));

/* USART TX는 Push-Pull */
GPIOA->OTYPER &= ~(1U << 2U);

/* PA2 Fast speed: 10 */
GPIOA->OSPEEDR &= ~(3U << (2U * 2U));
GPIOA->OSPEEDR |=  (2U << (2U * 2U));

/* PA2 No Pull-up / Pull-down */
GPIOA->PUPDR &= ~(3U << (2U * 2U));

※ AF 필드, AFR

  • AFR: Alternate Function을 설정하는 32비트 레지스터
  • AF 필드: AFR 안에서 핀 하나에 할당된 4비트 영역
  • AFR[2]: 두 개의 AFR 레지스터를 CMSIS에서 배열로 표현한 것

Analog Mode

  • GPIO의 디지털 입·출력 기능을 끄고 ADC, DAC와 같은 아날로그 회로에 연결하기 위한 모드
    - ADC: 핀에 입력된 아날로그 전압을 디지털 값으로 변환
    - DAC: 디지털 값을 아날로그 전압으로 출력
    - 디지털 입력 회로가 비활성화되어 불필요한 소비전류를 줄일 수 있음
    - 사용하지 않는 핀을 저전력 상태로 둘 때도 사용 가능
// PA0 핀을 Analog 모드로 전환하는 설정 예시

/* GPIOA Clock Enable */
RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN;

/* PA0 Analog Mode: 11 */
GPIOA->MODER &= ~(3U << (0U * 2U));
GPIOA->MODER |=  (3U << (0U * 2U));

/* PA0 No Pull-up / Pull-down: 00 */
GPIOA->PUPDR &= ~(3U << (0U * 2U));

0개의 댓글