GPIO 입출력

한 줄 요약 — MCU 핀은 약합니다. 전류 한계를 알고, 아날로그 회로와의 간섭(interference)을 관리해야 합니다.


GPIO 출력 모드

모드설명용도
푸시풀High/Low 모두 능동 구동일반
오픈 드레인(open drain)오픈 드레인 open drain출력이 끌어내리기만 하고 올리지는 못하는 구조로, 여럿을 한 선에 묶을 수 있어 I2C 가 이것을 씁니다.자세히 보기 →Low만 구동, High는 풀업(pull-up)풀업 pull-up아무도 신호선을 잡고 있지 않을 때 전압을 높은 쪽으로 끌어 두어, 떠 있는 입력을 없애는 저항입니다.자세히 보기 →I2C, 와이어드-OR, 레벨 시프트

GPIO 입력 모드

모드설명
플로팅외부에서 확실히 구동될 때만
내부 풀업/풀다운20~50 kΩ (부정확)
아날로그ADC 입력 (디지털 입력 버퍼 비활성화)

⚠️ 플로팅 입력을 두지 마세요. 문턱 근처에서 떠 있으면 입력 버퍼에 관통 전류가 흘러 전력을 낭비하고 노이즈를 만듭니다.


★ 전류 한계 — 세 가지를 모두 확인

한계전형값초과하면
핀당 최대8~25 mA핀 손상
포트당 합계50~100 mA
칩 전체 (VDD/VSS 핀)100~200 mA칩 손상, 전압 강하

⚠️ LED 8개를 각 10 mA로 켜면 80 mA입니다. 포트 한계에 걸릴 수 있습니다. 여러 개를 구동할 때는 반드시 합계를 확인하세요.

출력 전압 강하

전류를 뽑으면 VOHV_{OH}가 떨어집니다.

전류VOHV_{OH} (3.3 V 시스템)
1 mA3.25 V
8 mA3.0 V
20 mA2.6 V

★ GPIO가 아날로그를 오염시키는 경로

경로메커니즘대책
전원스위칭 시 전류 펄스디커플링, 전원 분리
접지리턴 전류가 접지 전위를 흔듦LED·부하 접지를 아날로그와 분리
용량 결합(coupling)인접 배선배선(trace) 분리, 가드
에지 방사빠른 상승시간슬루레이트(slew rate)슬루레이트 slew rate출력이 오를 수 있는 최고 속도로, 이걸 넘기면 정현파가 삼각파로 잘려 나옵니다.fmax=SR2πVpf_{max} = \frac{\mathrm{SR}}{2\pi V_p}자세히 보기 → 제한, 직렬 저항

실전 대책

  1. GPIO 속도를 최소로 설정 — STM32의 GPIO_SPEED_FREQ_LOW 등. 대부분의 신호는 느려도 됩니다
  2. 직렬 저항 22~100 Ω — 에지를 완만하게, 반사(reflection) 억제
  3. 부하 전류의 리턴 경로를 아날로그 접지에서 분리
  4. 측정 중에는 GPIO 토글을 멈춤 — 가장 확실

💡 “측정 중 디지털 활동 금지” 는 정밀 측정의 기본 규칙입니다. ADC 변환 중에 UART를 보내거나 LED를 켜면 그 노이즈가 데이터에 들어갑니다. 변환 완료 후에 통신하도록 펌웨어를 구성하세요.


계산 예제

GPIO로 MOSFET 게이트 구동

QgQ_g = 10 nC인 MOSFET을 GPIO(20 mA 최대)로 구동하면 전환 시간은?

t=QgI=10×10−90.02=500 nst = \frac{Q_g}{I} = \frac{10\times10^{-9}}{0.02} = 500\ \text{ns}
기호
I전류currentA
Q_g게이트 전하gate chargeC
t시간times

500 ns. 릴레이나 LED에는 충분하지만, 100 kHz PWM에는 부족합니다(주기의 5%). 게이트 드라이버가 필요합니다.


시뮬레이션으로 확인

GPIO 직렬 저항이 에지를 완만하게 한다 회로도RS100Ω직렬 저항VGCL20pF배선+입력 용량SRCOUTGND
GPIO 직렬 저항이 에지를 완만하게 한다워크벤치에서 열기 →
# examples/10-mcu-interfacing/gpio-slew.yaml
meta:
  name: GPIO 직렬 저항이 에지를 완만하게 한다
  lesson: docs/10-mcu-interfacing/01-gpio.md
components:
  - {ref: VG, type: vpulse, params: {v1: 0, v2: 3.3, td: 10n, tr: 2n, tf: 2n, pw: 100n, per: 200n}}
  - {ref: RS, type: r, value: 100, label: 직렬 저항}
  - {ref: CL, type: c, value: 20p, label: 배선+입력 용량}
nets:
  SRC: [VG.p, RS.1]
  OUT: [RS.2, CL.1]
  GND: [VG.n, CL.2]
analyses:
  - {type: tran, tstep: 100p, tstop: 400n}

RC=100×20p=2RC = 100\times20\text{p} = 2 ns → 상승시간이 약 4.4 ns로 늘어납니다. 노이즈 대역이 1/(πtr)1/(\pi t_r)로 줄어듭니다 (6-07).


⚖️ 부품 트레이드오프

선택✅ 좋아지는 것⚠️ 나빠지는 것
직렬 저항 (22~100 Ω)EMI↓, 반사↓, 과전류 보호지연↑, 강한 부하 구동 불가
높은 GPIO 속도 설정빠른 통신EMI↑, 전력↑
낮은 GPIO 속도 설정EMI↓, 전력↓고속 통신 불가
외부 드라이버/버퍼구동력↑, MCU 보호부품·전력
내부 풀업 사용부품 0부정확, 부팅 전 무효
외부 풀업정확, 항상 유효부품, 전류

🔌 실제 쓰임새

용도주의
LED 표시전류 한계, 접지 리턴 분리
릴레이·모터 제어트랜지스터(transistor) 필수 (6-02)
버튼 입력풀업 + 디바운싱 (02)
ADC 트리거지터(jitter) 최소화, 하드웨어 타이머 사용
아날로그 스위치(analog switch)아날로그 스위치 analog switch신호를 그대로 통과시키거나 끊는 반도체 스위치로, 다채널 측정의 채널 선택이 여기서 이뤄집니다.자세히 보기 → 제어스위칭 노이즈 주의 (9-06)
SPI/I2C속도 설정, 배선 분리

⚠️ 이상과 실제의 차이

이상실제
VOHV_{OH} = VDDV_{DD}전류에 따라 강하
전류 무한핀·포트·칩 3중 한계
즉시 전환슬루레이트, 배선 지연
아날로그에 영향 없음전원·접지·용량으로 결합
부팅 시 정의된 상태리셋 중에는 하이임피던스 — 외부 풀업/풀다운 필요

연습문제

문제 1. GPIO 핀당 8 mA, 포트당 60 mA 한계입니다. 같은 포트에서 LED 몇 개를 5 mA로 켤 수 있습니까?

연습 10-01-1 — 포트 한계가 핀 한계보다 먼저 걸린다 회로도R1270Ω전류를 정하는 저항V13.3VGPIO HighD1LED_REDIOAGND
연습 10-01-1 — 포트 한계가 핀 한계보다 먼저 걸린다워크벤치에서 열기 →
풀이 605=12 개\frac{60}{5} = 12\ \text{개}

단, 칩 전체 한계도 확인해야 합니다. MCU 자체가 30 mA를 쓰고 칩 한계가 100 mA라면 LED에 쓸 수 있는 것은 70 mA → 14개. 포트 한계가 더 엄격하므로 12개가 답입니다.

여유를 두어 8~10개 정도로 설계하는 것이 안전합니다.

문제 2. ADC 변환 중에 UART로 데이터를 전송했더니 측정값에 주기적인 노이즈가 나타납니다. 원인과 해결책은?

exercises/10-01-uart-during-adc.yaml
풀이

원인:

  1. 전원 결합 — UART 송신 시 GPIO 스위칭 전류가 전원 전압을 흔들고, ADC 기준전압(voltage reference)이나 아날로그 전원에 침투
  2. 접지 결합 — 리턴 전류가 아날로그 접지 전위를 흔듦
  3. 용량 결합 — TX 배선이 아날로그 배선 근처를 지남
  4. DMA/버스 활동 — 내부 버스 활동도 전원을 흔듦

해결 (효과 순):

  1. 타이밍 분리 — ADC 변환이 끝난 후에 UART 전송. 인터럽트로 순서 제어 ← 가장 확실
  2. GPIO 슬루레이트 최소 설정
  3. TX 라인에 직렬 저항 (33~100 Ω)
  4. 아날로그 전원·접지 분리 강화
  5. UART 배선을 아날로그에서 물리적으로 분리
  6. 오버샘플링(oversampling)오버샘플링 oversampling필요한 것보다 빠르게 샘플링해 평균 내면 분해능이 올라가고 안티에일리어싱 필터가 쉬워집니다.Δn=12log⁡2(OSR)\Delta n = \tfrac{1}{2}\log_2(\mathrm{OSR})자세히 보기 → + 평균화로 완화 (근본 해결은 아님)

“변환 중에는 아무것도 하지 않는다” 가 정밀 측정 펌웨어의 원칙입니다. 일부 MCU는 ADC 변환 중 CPU를 sleep 시키는 모드를 제공합니다.


다음 → 02 버튼과 디바운싱