임베디드

18. GPIO 옵션 (출력)

sdafdq 2026. 2. 5. 17:09

 

 

 

GPIO output level : 초기값. GPIO 초기값을 전압이 흐르고 있는 상태로 둘지, 말지.

 Write 하는거랑 같음.

High로 해 놓으면 자동으로 생성되는 Init에서도 저렇게 Write 함수 씀. (GPIO_PIN_SET = 1, GPIO_PIN_RESET = 2)

 

 

GPIO mode : 

2개가 있음.

Output Push Pull이랑

Output Open Drain

 

이건 회로 이해가 있어야 함.

PUSH-PULL 구성하는 회로도 방식이 BJT랑 MOSFET 두가지 방식이 있음.

둘 다 PUSH-PULL회로.

SW2쪽이 GND쪽, 0V쪽이라고 치고, 둘 중 하나만 연결

SW1연결하면 OUTPUT쪽으로 흘러서 OUTPUT에서 LED연결되고 LED가 켜지고,

SW2연결하면 GND랑 OUTPUT이 연결되어서 0V를 OUTPUT -> LED쪽으로 밀어주는거라 전압차 없어서 (OUTPUT->LED->GND 이렇게 연결되어 있을 거니까) 전류가 안 흐름.

 

 

일단 칩 쪽에 SW1, SW2 둘 다 있음.

 

저 위가 PUSH-PULL 방식. 

 

이름의 유래는 3.3V로 밀어주거나, 0V로 당기거나 할 수 있어서.

결국 칩도 GND랑 연결되어 있으니까 거기로 빠져나가게끔 저 GPIO핀을 0V로 설정해두면 외부에서 들어오는 3.3V전압을 당겨올 수 있음.

 

그래서 그걸 이용한 회로가,

보드의 LED회로임.

PC13은 GPIO인데, 외부에 3.3V가 있어서 GPIO 전압을 0V로 만들어서 전압차 이동으로 당겨주면서 전류가 이동하게 함.

그래서 Pull이라고 하고,

 

이건 사실 스위치 입력용 회로라서 좀 그렇긴 한데, Push-pull은 출력모드에 대해서 이야기 하는거라서,

 

근데 만약 저기 SW가 LED였다고 치면, GPIO쪽에서 전압을 밀어서 LED쪽 GND로 가니까 Push임.

 

그래서 이게 양쪽 다 가능한 거니 Push-Pull 모드라고 명명함.

 

이거는 MCU칩 내부의 모습이고, (칩 안에 저렇게 GPIO회로마다 SW2개가 있고, 그거에 따라서 전압을 줄지 말지 제어한다고 보면 됨.)

 

이건 보드의 회로임.

 

즉, 우리가 지금 프로그래밍 하고 있는 건 IDE에서 칩에 따라 자동으로 설정을 해 주고 있는거라서, 보드의 회로까지는 IDE가 모른다는 거임. 그래서 설정하는거.

 

 

여튼 그래서 다른 모드,

Open Drain은

이렇게 생김.

우리는 한 GPIO에 SW1, SW2 둘 다 있어서, 

Open-Drain 방식은 SW2만 조종하면 되는거니까, 저 두 방식 모두 사용 가능.

 

Open-Drain은 NMOS 트랜지스터(스위치)에서, GND쪽으로 가는 단자를 Drain이라고 부른다. 아마 전류를 빨아들이니까 그렇게 이름 붙인 듯.

 

여튼 이 방식은 GND쪽만 열고 닫는거임.

 

 

 

Push-Pull 구조를 다시 보면,

이런 식.

여기서 위쪽 스위치나 아래쪽 스위치중 하나를 연결하면 다른 하나는 반드시 끊어야 함.

만약 3.3V쪽, 위쪽 스위치를 연결하면,

이 LED는 외부에서도 3.3V니

GPIO전압 쪽에서도 3.3V니

둘의 전압 차는 0이니까 전류가 안 흐름. LED가 안 켜짐.

 

반대로 아래쪽 스위치, GND로 가는 스위치를 연결하면 외부에서 3.3V가 들어오고 GND니 0V라서 전압차가 생겨서 전류가 이동해서 LED가 켜짐.

 

GPIO는 전류를 줄지 안줄지 그것만 제어하는 느낌.

 

 

 

 

그리고, 

GPIO에서 입력을 받았는지 안 받았는지 확인하는 것은,

GPIO핀 마다 슈미트 트리거라는 게 있음.

 

이건 전위의 전압차를 기준으로 측정.

 

전위란 현재 부품이 어디에 종속되어 있는지.

이게 무슨 뜻 이냐면 어디쪽 저항이 낮아서 그 쪽과 더 잘 흐르는 지.

예를 들어,

Vcc ──[10kΩ]── PA0

이러면 Vcc와 핀 PA0간에 10k옴 저항이 있어 저항이 조금 있지만 어쨌든 간에 Vcc랑만 연결되어 있으므로  Vcc쪽 전위임.

 

Vcc ──[Pull-up 10kΩ]── PA0 ── 버튼 ── GND

근데 만약 이러면 버튼 저항이 살짝 있긴 하지만 미비해서 GND쪽 전위라고 함.

 

 

 

여튼간에,

그러니까 일단은 Vcc와 핀 사이에 저항이 붙어있느니 안 붙어있는지 그 구조는 잘 모르겠고,

Vcc ---- PA0 ----- SW ----- GND

이렇게 있을 때, SW가 눌리지 않았을 때, Vcc쪽은 어쨌든간에 계속 3.3V를 주는 상태고,

그리고 여튼간에 PA0쪽 회로는 계속해서 3.3V전류가 흐르는 상태고. 그럼 PA0의 슈미트 트리거는 3.3V여서 전기가 흐르지 않고 있다 이렇게 판단하는거라고 한다.

 

 

근데 SW를 누르면 GND쪽 전위가 되니까 GND는 0V니까 슈미트 트리거

로 측정해서 저게 전압이 있냐 없냐만 측정.

 

 

 

 

 

뭐Pull-up Pull-down 이런 걸로 핀의 전압을 고정시킨다고 함.

일단 그걸 알아야 할 듯.

여튼간에 나는 일단 추상적으로 3.3V가 어디 빠져나가지 못하고 핀에 모여있으면 슈미트 트리거가  차 있어서 칩에서 그걸 1이라고 읽는거고,

빠져나가면 모일 새도 없이 쭉 빠져나가니까 0V여서 슈미트 트리거에 안착할 새가 없어서 0이라고 봄.

원인과 결과는 맞는데 정확히 이런 원리는 아니라고 함. 풀업, 풀다운, 회로도 등등을 더 봐야 알 수 있는 말 인듯.

 

 

 

위에도 일단은 아직 더 배워야 할 거임.

정확히 저 뜻은 아닐거임.

 

 

 

 

여튼 그리고 이거.

통신이 디지털회로에서는 뭐 전압의 정도가 아니라 그 타이밍으로 준다고 함.

전기있음 1 전기없음 0 

저걸 빠르게 줘서 

11001010 

이런 식으로 통신.

 

그래서 나는 그럼 보통은 Vcc 있는 쪽에서 그런 걸 하는 게 더 안정적일테니까 저거는 GND쪽이라 데이터 안 받을려나? 그렇게 생각했는데 아니라고 함.

GND쪽으로도 빠르게 열고 닫는 걸로도 데이터 주고 받는다고 함.

단 저게 뭔게 버스형식으로 한 선에 여러 개 연결되어 있는 경우는 GND쪽에서 저렇게 통신 받는 게 좋다고 함.

 

내가 생각한 Vcc쪽에서 하는 건 보통 GPIO 1:1통신이 그렇다고 함.

 

 

여튼간에 위쪽 다시 더 공부해야 함.

 

Push-Pull은 3.3V도 줄 수 있고 0V로 만들 수 있고,

Open Drain은 GND쪽 열거나 닫거나만.

 

지금은 GPIO output을 하고 있는거임. 일단은.

Pull up Pull down은 input임.

 

 

Maximum output speed

 

우리가 뭐 디지털이라고 보면 이렇게 표현 하는데,

 

사실 상은

 

 

실상으로는 뭐 노이즈도 있고 저런 식으로 전압이 들어왔다 1임.

 

 

저기 보면 보아뱀처럼 시간이 필요함.

 

 

 

저 차를 줄여주는 게 maximum output speed

 

저게 중요할 때는 

신호, 통신할 때

I2C나 SPI 등

고속통신 빨리 해야 하니까 저런 차를 최대한 줄이는 게 좋음.

 

 

 

 

 

 

'임베디드' 카테고리의 다른 글

19. GPIO 옵션 (입력) Pull up, Pull down (불완성)  (0) 2026.02.08
17. 데이터시트 보고 코드 확인  (0) 2026.02.04
16. 구조체  (0) 2026.02.04
15. HAL 드라이버 분석  (0) 2026.02.03
14. GPIO 제어  (0) 2026.02.03