GPIO도 코어가 아닌 MCU 제조사가 정하는 부분이다. ATmega의 경우 AVR이 코어의 설계부터 GPIO의 설계까지 모두 했기 때문에 혼동이 된 부분이다. GPIO도 마찬가지로 Peripheral로 취급된다.
- 출력을 할 때 Push-Pull / Open-Drain 사용 가능
- 입력을 받을 때 내부 풀업, 풀다운 저항 연결 가능
- 인터럽트 라인에 연결 가능
Push-Pull / Open-Drain이란?
IO 포트의 출력 시 회로의 구성

위는 Push-Pull 방식이다.
Push-Pull은 P-type과 N-type MOSFET 사이에 놓여있으며, HIGH 출력에 반드시 VCC, LOW 출력에 GND 출력이 강제된다.

위는 open-drain 방식이다. (BJT를 사용한다면 open-collecter)
Open-Drain은 N-type MOSFET의 Drain을 출력으로 가지며, HIGH일 때는 Output Pin이 Open되며, LOW일 때는 GND로 SINK된다.
왜 Open-Drain을 사용하는가?
그냥 Push-Pull을 쓰면 되지, 왜 Open-Drain을 사용할까? 첫 번째는 동작 전압을 높이기 위함이고, 두 번째는 버스 충돌 처리이다.
예를 들어 IO에서는 3.3v의 출력 만을 갖는 MCU로 5v 짜리 회로 구동 시키기 어렵다. 따라서 Pull-Up 저항으로 외부 5v 전압원에 연결해주면 IO 출력을 5v로 만들 수 있다. 이를 보통 Level-Converting, 혹은 Level-Driving 이라고 한다.
두 번째는 버스 충돌 시의 전기적 보호이다. I2C나 SPI와 같은 회로가 대표적인데, 이들 회로를 사용하는 데는 여러 모듈이 동시에 통신을 진행한다. 어느 순간 두 회로에서 한쪽은 5v, 한 쪽은 GND를 입력하는 경우가 있을 것이다.

Push - Pull을 사용한다면, 각각의 MCU에서 VCC, GND 출력이 강제 된다.


Open-Drain은 논리적 AND 게이트와 유사한 모습을 보인다.
I2C 등에서 Open-Drain 사용 예시
- SDA에 물린 모든 슬레이브-마스터는 Open-Drain이다.
- ACK 시 슬레이브가 SDA를 LOW로 당기면 마스터 측에서 감지한다.
- 따라서 읽기 중인 각 마스터, 슬레이브의 Open-Drain 게이트는 HIGH (Z) 상태여야 한다.
- STM32의 I2C 모듈은 이를 자동으로 처리한다.