Embedded/STM32

STM32 시리즈 GPIO(General Purpose Input/Output) 포트 학습 정리

변화의 물결1 2025. 2. 11. 12:04

 

 

 

 

안녕하세요.

 

 STM32 MCU의 GPIO 내용을 간단하게 정리해보려고 합니다. STM32 MCU 시리즈를 보면 32핀, 64핀 144핀을 가지고 있는 제품을 보았을 것이고 세부적으로 상품번호에 따라 메모리 용량 기능 등에 차이가 있습니다.

 

 여기서, 물리적인 핀에 관한 것을 우선 보면 핀이 많으면 많을수록 여러 가지 입출력 제어가 가능한 장점이 있습니다. 그러나 불필요하게 핀이 많은 제품을 선정해서 원가 높일 필요가 없습니다.

 

 

 

 다시 돌아와서, 모든 핀을 입출력으로 사용할 수 있는 것은 아니고, 기본적으로 전원 연결하는 핀, GND핀 등 고정적으로 사용되는 핀 말고, MCU 핀냅에서 PA ~ PE 등 P로 시작하는 핀을 보았을 것입니다.

 

 

 

 핀맵에서 P로 시작한다면 보통 GPIO 기능을 가진 핀이라고 생각하면 좋습니다. 임베디드를 시작하시는 분은 GPIO(General Purpose Input/Output)를 한 번씩 들어 보셨을 것이라 생각됩니다.

 

 간단히 말해서 GPIO는 다용도 입력과 출력기능 핀 또는 포트를 의미합니다. 여기서 다용도라 함은 ADC 입력, UART 통신, SPI 통신, PWM 출력 신호 핀으로 변경해서 사용가능 하다는 것입니다. 아래 사진은 STM32G071 MCU의 PA0 핀에서 설정가능한 기능입니다.

 

 

 

핀 이름을 조금 나누어서 보겠습니다. 예를 들어 핀맵에 PA ~ PD까지 있다면 PA는 다시 PA0 ~ PA15까지 이렇게 핀으로 되어 있습니다. 여기서 PA를 크게 포트라고 부르고 PA0~15을 개별 핀번호라고 부르면 아래 설명을 조금 쉽게 이해할 수 있을 것입니다.

 


 

1. STM32 MCU 시리즈 GPIO 제어를 위한 중요 레지스터

 

  시리즈 버전에 따라 다를 수 있으므로 꼭 사용하는 MCU 버전에 맞는 DataSheet는 확인해야 합니다.

 GPIO 핀을 사용하기 위해서 알아야 할 레지스터가 있습니다. 위에서 본 포트마다 설정할 수 있게 되어 있습니다.

 

1) GPIO Configuration 레지스터 1

 

 GPIOx_MODER (Mode Register)로 해당 핀을 입력/출력/Alternate Function/Analog 모드 중 선택할 수 있습니다. x에 포트 명을 넣어 주면 됩니다. 예로 GPIOA_MODER 가 되며 설정 값을 넣을 수 있게 각 핀마다 2비트가 할당되어 있습니다.

 

 

 

2)  GPIO Configuration 레지스터 2

 

 GPIOx_OTYPER (Output Type Register)로 출력핀으로 설정했을 때 Push-Pull로 할지 Open-drain으로 할지 결정하는 레지스터입니다. x에 포트 명을 넣어 주면 됩니다. 예로 GPIOA_OTYPER 가 되며 설정값을 넣을 수 있게 각 핀마다 1비트가 할당되어 있습니다.

 

 

 

여기서 Push-Pull과 Open-drain이 무엇인가 질문이 생길 텐데, 그림으로 쉽게 설명한 블로그가 있어 링크 걸어 놓았습니다.

https://idsn.tistory.com/50

 

 간단하게 설명하자면, Push-Pull은 MCU 측에서 HIGH/LOW 제어로 MCU단의 High Level(예 3.3V), Low Level(0V)를 출력하는 것입니다.

 

 Open-Drain은 Level Conver로 외부에 풀업 저항을 달고 외부 전압레벨에 맞게 제어하기 위해서 사용합니다. MCU가 출력할 수 있는 전압은 3.3V인데 MCU가 제어해야 하는 IC신호 레벨이 5V 이상일 때 5V 전원에 풀업저항을 달아서 MCU의 Open-Drain 설정된 핀에 연결해서 HIGH/LOW로 IC를 제어하기 위해서 사용합니다.

 

 

 

3) GPIO Configuration 레지스터 3

 

 GPIOx_OSPEEDR (Output Speed Register)로 출력핀(PWM)으로 설정했을 때 속도를 설정하는 레지스터입니다. x에 포트 명을 넣어 주면 됩니다. 예로 GPIOA_OSPEEDR가 되며 설정값을 넣을 수 있게 각 핀마다 2비트가 할당되어 있습니다.

 

 

 

4) GPIO Configuration 레지스터 4

 

GPIOx_PUPDR (Pull-up/Pull-down Register)로 입력핀으로 설정했을 때 Pull-up이나 Pull-down을 설정할 수 있는 레지스터입니다. STM32 칩 내부에 Pull-up, Pull-down 저항이 있어 외부에 따로 저항을 설치할 필요가 없습니다. x에 포트 명을 넣어 주면 됩니다. 예로 GPIOA_PUPDR 가 되며 설정값을 넣을 수 있게 각 핀마다 2비트가 할당되어 있습니다.

 

 

 

5) GPIO Data 레지스터 1

 

 GPIOx_IDR (Input Data Register)로 입력핀으로 설정했을 때 핀에 실리는 레벨값을 알려주는 레지스터입니다. 해당 비트를 읽으면 현재 핀에 걸린 전압이 0V인지 3.3V인지 알 수 있습니다. 데이터시트에 'r'로 표시되어 있는데 읽기만 가능하다는 의미입니다. x에 포트 명을 넣어 주면 됩니다. 예로 GPIOA_IDR 가 되며 설정값을 넣을 수 있게 각 핀마다 2비트가 할당되어 있습니다.

 

 

 

6) GPIO Data 레지스터 2

 

 GPIOx_ODR (Output Data Register)로 출력핀으로 설정했을 때 핀에 실리는 레벨값을 결정하는 레지스터입니다. 해당 비트에 1을 쓰면 전압이 3.3V으로 출력되고 0을 쓰면 0V로 출력합니다. x에 포트 명을 넣어 주면 됩니다. 예로 GPIOA_ODR 가 되며 설정값을 넣을 수 있게 각 핀마다 2비트가 할당되어 있습니다.

 

  

 

7) GPIO Set/Reset 레지스터

 

 GPIOx_BSRR(Bit Set/Reset Register)로 출력핀으로 설정했을 때 핀에 실리는 레벨값을 결정하는 레지스터입니다. GPIOx_ODR레지스터와 같은 기능이며 제어 방식만 다릅니다. x에 포트 명을 넣어 주면 됩니다. 예로 GPIOA_BSRR이 되며 설정값을 넣을 수 있게 각 핀마다 Set 1bit, Reset 1비트가 할당되어 있습니다.

 

 

 

8) GPIO Lock 레지스터

 

 GPIOx_LCKR(Configuration Lock Register)로 핀의 설정값이 변하지 않도록 Lock을 거는 레지스터입니다. 설정을 변화시킨 후 Lock을 걸어 두면 Reset이 걸리기 전까지 설정이 변하지 않습니다. 16번 비트를 가지고 Lock bit 활성화 여부를 결정할 수 있습니다. x에 포트 명을 넣어 주면 됩니다. 예로 GPIOA_LCKR이 되며 설정값을 넣을 수 있게 각 핀마다 Set 1bit, Reset 1비트가 할당되어 있습니다.

 

 

 

9) GPIO Alternate Function Selection 레지스터

 

GPIOx_AFRL, GPIOx_AFRH(Alternate Low/High Register)로 Alternate Function이 여러 가지이기 때문에 핀당 4개의 비트를 할당합니다. GPIO, UART, USB, Ethernet 등 기능으로 설정 가능합니다. 각각 x에 포트 명을 넣어 주면 됩니다. 예로 GPIOA_AFRL이 되며 GPIOx_AFRL, GPIOx_AFRH 각각 설정값을 넣을 수 있게 각 핀마다 Set 4bit가 할당되어 있습니다.

 

 

 

 

 

 위와 같이 GPIO관련된 많은 레지스터를 확인했지만, MCU 종류에 따라 혹은 버전업이 되면서 사라지거나 새로 생긴 레지스터들이 있습니다. 기본적으로 GPIO를 핀에 많은 기능이 있다는 것을 인지하고 데이터시트를 확인한다면 도움이 되지 않을까 합니다.

 

 

감사합니다.

 

 

<참고 사이트>

1. Daily Study Note :: [임베디드 시스템] GPIO 설정 - PUSH-PULL, OPEN DRAIN 파헤치기https://idsn.tistory.com/50

2. STM32 - GPIO 레지스터에 대하여 (MODER ~ AFRH)

https://insoobaik.tistory.com/606

3. stm32F0xx (CORTEX-M0)를 다뤄.. : 네이버블로그

https://blog.naver.com/wararat/220172314291  

 

 

 

반응형