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입니다. 포트 한계에 걸릴 수 있습니다. 여러 개를 구동할 때는 반드시 합계를 확인하세요.
출력 전압 강하
전류를 뽑으면 가 떨어집니다.
| 전류 | (3.3 V 시스템) |
|---|---|
| 1 mA | 3.25 V |
| 8 mA | 3.0 V |
| 20 mA | 2.6 V |
★ GPIO가 아날로그를 오염시키는 경로
| 경로 | 메커니즘 | 대책 |
|---|---|---|
| 전원 | 스위칭 시 전류 펄스 | 디커플링, 전원 분리 |
| 접지 | 리턴 전류가 접지 전위를 흔듦 | LED·부하 접지를 아날로그와 분리 |
| 용량 결합(coupling) | 인접 배선 | 배선(trace) 분리, 가드 |
| 에지 방사 | 빠른 상승시간 | 슬루레이트(slew rate)슬루레이트 slew rate출력이 오를 수 있는 최고 속도로, 이걸 넘기면 정현파가 삼각파로 잘려 나옵니다.자세히 보기 → 제한, 직렬 저항 |
실전 대책
- GPIO 속도를 최소로 설정 — STM32의
GPIO_SPEED_FREQ_LOW등. 대부분의 신호는 느려도 됩니다 - 직렬 저항 22~100 Ω — 에지를 완만하게, 반사(reflection) 억제
- 부하 전류의 리턴 경로를 아날로그 접지에서 분리
- 측정 중에는 GPIO 토글을 멈춤 — 가장 확실
💡 “측정 중 디지털 활동 금지” 는 정밀 측정의 기본 규칙입니다. ADC 변환 중에 UART를 보내거나 LED를 켜면 그 노이즈가 데이터에 들어갑니다. 변환 완료 후에 통신하도록 펌웨어를 구성하세요.
계산 예제
GPIO로 MOSFET 게이트 구동
= 10 nC인 MOSFET을 GPIO(20 mA 최대)로 구동하면 전환 시간은?
I전류currentAQ_g게이트 전하gate chargeCt시간times500 ns. 릴레이나 LED에는 충분하지만, 100 kHz PWM에는 부족합니다(주기의 5%). 게이트 드라이버가 필요합니다.
시뮬레이션으로 확인
# 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}ns → 상승시간이 약 4.4 ns로 늘어납니다. 노이즈 대역이 로 줄어듭니다 (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 | 속도 설정, 배선 분리 |
⚠️ 이상과 실제의 차이
| 이상 | 실제 |
|---|---|
| = | 전류에 따라 강하 |
| 전류 무한 | 핀·포트·칩 3중 한계 |
| 즉시 전환 | 슬루레이트, 배선 지연 |
| 아날로그에 영향 없음 | 전원·접지·용량으로 결합 |
| 부팅 시 정의된 상태 | 리셋 중에는 하이임피던스 — 외부 풀업/풀다운 필요 |
연습문제
문제 1. GPIO 핀당 8 mA, 포트당 60 mA 한계입니다. 같은 포트에서 LED 몇 개를 5 mA로 켤 수 있습니까?
풀이
단, 칩 전체 한계도 확인해야 합니다. MCU 자체가 30 mA를 쓰고 칩 한계가 100 mA라면 LED에 쓸 수 있는 것은 70 mA → 14개. 포트 한계가 더 엄격하므로 12개가 답입니다.
여유를 두어 8~10개 정도로 설계하는 것이 안전합니다.
문제 2. ADC 변환 중에 UART로 데이터를 전송했더니 측정값에 주기적인 노이즈가 나타납니다. 원인과 해결책은?
exercises/10-01-uart-during-adc.yaml풀이
원인:
- 전원 결합 — UART 송신 시 GPIO 스위칭 전류가 전원 전압을 흔들고, ADC 기준전압(voltage reference)이나 아날로그 전원에 침투
- 접지 결합 — 리턴 전류가 아날로그 접지 전위를 흔듦
- 용량 결합 — TX 배선이 아날로그 배선 근처를 지남
- DMA/버스 활동 — 내부 버스 활동도 전원을 흔듦
해결 (효과 순):
- 타이밍 분리 — ADC 변환이 끝난 후에 UART 전송. 인터럽트로 순서 제어 ← 가장 확실
- GPIO 슬루레이트 최소 설정
- TX 라인에 직렬 저항 (33~100 Ω)
- 아날로그 전원·접지 분리 강화
- UART 배선을 아날로그에서 물리적으로 분리
- 오버샘플링(oversampling)오버샘플링 oversampling필요한 것보다 빠르게 샘플링해 평균 내면 분해능이 올라가고 안티에일리어싱 필터가 쉬워집니다.자세히 보기 → + 평균화로 완화 (근본 해결은 아님)
“변환 중에는 아무것도 하지 않는다” 가 정밀 측정 펌웨어의 원칙입니다. 일부 MCU는 ADC 변환 중 CPU를 sleep 시키는 모드를 제공합니다.
다음 → 02 버튼과 디바운싱