임베디드 면접 학습 노트 목차

주변장치·타이머 — 임베디드 면접 (실제 기출 기반·심화)

"GPIO push-pull과 open-drain 차이", "타이머로 PWM을 어떻게 만들고 주파수·듀티를 계산하나", "워치독이 뭐고 왜 쓰나", "IWDG vs WWDG", "ADC 분해능·1 LSB", "PLL은 왜" — MCU를 직접 다뤄본 사람인지를 가르는 단골. 레지스터 수준 메커니즘과 계산식을 말해야 한다.

함정 다발(★): ① open-drain이 풀업 없이 High? → 안 됨·floating ② PWM 듀티를 바꾸면 주파수가 바뀐다? → 아님·ARR=주파수·CCR=듀티(독립) ③ 멈추면 워치독 끄면 됨? → 켜면 리셋 외엔 못 끔 ④ ADC 분해능만 높이면 정확? → Vref·노이즈·샘플링이 좌우 ⑤ 내부 RC로 고속 UART? → ±1% 부정확.


1. GPIO — push-pull vs open-drain (★★ 단골)

실제 질문: "push-pull과 open-drain 출력 차이는?"(최빈출) · "open-drain은 왜 외부 풀업이 필요?" · "풀업/풀다운 언제 쓰나?" · "버튼 채터링(디바운싱)?" (velog 펌웨어 면접 다수)

  • push-pull: 상보형 MOSFET 토템폴 — High는 P-ch가 VDD로 밀고(source), Low는 N-ch가 GND로 당긴다(sink). 양방향 능동 구동·빠른 천이·외부 저항 불필요. 일반 출력 기본.
  • open-drain: N-ch 하나만 → 라인을 Low로만 당김·High는 외부 풀업이 만든다(풀업 없으면 off 시 floating Hi-Z). 여럿을 묶으면 wired-AND(하나라도 Low면 Low) → I2C(SDA/SCL)·인터럽트 공유 라인·레벨 시프트(3.3V MCU가 5V 풀업으로 5V 버스 구동).
다이어그램 로딩 중…
  • GPIO 모드 4종: Input · Output(push-pull/open-drain) · Alternate Function(UART·SPI·타이머에 핀 연결) · Analog(ADC/DAC).
  • 내부 풀업/풀다운: GPIOx_PUPDR로 핀별 약한 내부 저항(수십 kΩ·부정확). 주로 입력 floating 방지. I2C는 더 강한 외부 풀업 필요.
  • EXTI(외부 인터럽트): 핀 edge 감지. 풀업+버튼이면 누를 때 0 → falling edge.

꼬리질문: "open-drain 어디 쓰나?" → I2C·인터럽트 wired-AND·레벨 다른 버스. / "디바운싱?" → HW RC 필터+슈미트 / SW edge 후 수 ms 재확인. / "EXTI vs 폴링?" → 이벤트 드물면 인터럽트·고빈도 단순은 폴링.

함정: ❌ "open-drain이 풀업 없이 High" → floating. ❌ "push-pull을 버스로 묶음" → 충돌 시 관통전류(버스 공유는 open-drain만).


2. 타이머·PWM — 계산식 (★★★ 최다 빈출·정확히)

실제 질문: "타이머로 PWM을 어떻게 생성하나?" · "PSC·ARR·CCR로 주파수·듀티를 계산하라"(실제 숫자) · "PWM 주파수를 바꾸려면 어떤 레지스터?" · "input capture는?" (STM32 단골)

핵심 공식 (PSC·ARR·CCR은 0-based → 레지스터에 값−1을 써서 +1이 붙음):

카운터 틱   f_CNT  = f_TIMxCLK / (PSC + 1)
PWM 주파수  f_PWM  = f_TIMxCLK / ((PSC+1) × (ARR+1))
듀티        Duty   = CCR / (ARR + 1)

예제(검증): TIMxCLK=80MHz·PSC=79 → 틱 80MHz/80 = 1MHz. ARR=999 → f_PWM 1MHz/1000 = 1kHz. CCR=500 → 듀티 500/1000 = 50%.

  • 레지스터 역할 분리(★): PSC=입력 클럭 분주(틱 속도)·ARR=카운터 최대값=주기(주파수) 결정(도달 시 update event·0 리로드)·CCR=비교값=듀티(펄스폭) 결정.
  • preload(섀도): 켜면 새 ARR/CCR이 다음 update event에 적용 → 주기 중간 글리치 방지. 끄면 즉시.
  • 카운팅 모드: up·down·center-aligned(0→ARR→0·대칭 → 같은 설정에서 주파수 절반·모터 제어 고조파↓).
  • input capture: 외부 edge 순간의 카운터 값을 CCR에 자동 래치 → 두 rising edge CCR 차이 = 주기 → 주파수 = (f_TIMxCLK/(PSC+1)) / (CCR₂−CCR₁). 외부 신호 주파수·펄스폭 측정.
  • dead-time: 하프브리지 상보 PWM에서 상·하 스위치 동시 ON(관통전류) 방지용 죽은 시간(고급 타이머).

꼬리질문: "PWM 주파수를 바꾸려면?" → PSC 또는 ARR(CCR 아님)·듀티 유지하려면 CCR도 비례 재계산. / "듀티 분해능 높이려면?" → ARR↑(단 주파수↓ trade-off). / "외부 신호 주파수 측정?" → input capture 두 edge 차이.

함정: ❌ "듀티를 바꾸면 주파수가 바뀐다" → CCR만 바꾸면 듀티만. ❌ "주파수를 CCR로 조정" → PSC/ARR이 주파수. ❌ "레지스터에 분주값 그대로" → −1(0-based).


3. 워치독 — IWDG vs WWDG (★★ 단골)

실제 질문: "워치독 타이머가 뭐고 왜 쓰나?" · "어떻게 먹이나(kick), 안 먹이면?" · "IWDG와 WWDG 차이/언제?" (STM32 경험자 단골)

개념: MCU가 행(hang)·무한루프·폭주로 멈췄을 때 자동 복구. 정상이면 주기적으로 카운터를 리프레시(kick), 못 하면 만료 → 시스템 리셋.

IWDG (Independent)WWDG (Window)
클럭독립 LSI(F4 32kHz·F1 40kHz)·메인 죽어도·Stop/Standby 동작APB1(PCLK1·메인 계열)
카운터12bit 다운(+8bit prescaler)7bit 다운(0x40~0x7F)
리프레시아무 때나 가능(상한만)윈도우 아래로 내려온 뒤에만
특징견고·LSI 부정확너무 일찍/늦게 갱신해도 리셋·0x3F 직전 EWI 인터럽트
끄기켜면 리셋 외 불가켜면 리셋 외 불가

언제 무엇(★): 단순 행 복구·저전력(Stop) 보호 → IWDG. 타이밍 정밀 감시(너무 빠름/늦음)·리셋 전 마지막 처리(EWI) → WWDG. 둘 다 켜기도.

꼬리질문: "리프레시 위치는?" → 메인 슈퍼루프 한 곳·모든 핵심 태스크 정상일 때만(타이머 ISR 한 곳에서만 먹이면 메인이 죽어도 못 잡음·★). / "워치독 리셋인지 어떻게?" → RCC reset flag(IWDGRSTF/WWDGRSTF) 확인 후 클리어.

함정: ❌ "멈추면 워치독 끄면 됨" → 켜면 리셋 전엔 못 끔(의도된 안전장치). ❌ "WWDG도 아무 때나 먹임" → 너무 일찍 먹여도 리셋. ❌ "IWDG는 메인 클럭 멈추면 무력" → 반대로 LSI 독립이라 동작.


4. ADC·DAC (★ 단골)

실제 질문: "ADC 분해능이 뭔가? 12bit는?" · "SAR vs sigma-delta?" · "12bit·Vref=3.3V면 1 LSB는?" · "ADC 노이즈 줄이려면?" · "DAC 없이 아날로그 출력?"

  • 분해능/LSB: n-bit → 2ⁿ 단계. 12bit = 4096(코드 0~4095). 1 LSB = Vref / 2ⁿ → 12bit·3.3V → ≈0.806mV. 전압 = code × Vref / 4096.
  • SAR(successive approximation): 이진 탐색·비트 수만큼 단계·중속 중분해능(12~16bit)·STM32 내장. 변환시간 = (샘플링 + 12.5) ADC 클럭.
  • sigma-delta: 1bit 변조 + 오버샘플링 + 노이즈 셰이핑 → 고분해능(16~24bit)·저속(오디오·정밀계측).
  • 샘플링 시간: S&H 캡 충전 시간 — 소스 임피던스 높으면 늘려야 정확. 오버샘플링: N번 평균 → 랜덤 노이즈 √N 감소·유효 분해능↑(STM32 HW 최대 16bit). DMA로 CPU 없이 연속 변환.
  • DAC: R-2R 래더(빠름·저항 정합이 정확도 좌우·STM32 내장)·sigma-delta(오디오)·PWM+저역통과(LPF) 대안(DAC 없을 때 듀티 평균전압·리플 한계).

꼬리질문: "노이즈 줄이려면?" → 오버샘플링·평균·안정 Vref·입력 RC·샘플링 시간 적정·아날로그/디지털 그라운드 분리. / "DAC 없는 MCU?" → PWM+LPF 또는 외장 DAC IC(I2C/SPI).

함정: ❌ "분해능만 높이면 정확" → Vref·노이즈·샘플링이 좌우(노이즈>LSB면 하위 비트 무의미). ❌ "Vref 흔들려도 코드는 그대로니 OK" → V=code×Vref/4096Vref 변동=측정 오차.


5. 클럭 트리 — PLL·HSE/HSI (★ 단골)

실제 질문: "클럭 설정이 왜 중요한가?" · "PLL은 무엇이고 왜?" · "HSE vs HSI 언제?" · "내부 RC로 고속 UART 되나?"

  • 경로: 소스(HSI/HSE) → PLL(체배) → SYSCLK → AHB prescaler → HCLK(코어) → APB prescaler → PCLK1/2(페리페럴).
  • HSI(내부 RC·F4 16MHz·리셋 기본·외부 부품 불필요·±1% 부정확) vs HSE(외부 크리스탈 4~26MHz·±수십 ppm 정확·USB·고속 UART 권장).
  • PLL: 소스를 체배해 고주파 SYSCLK(예 F407 168MHz). PLL은 체배만·정확도는 소스가 결정(HSI를 PLL로 올려도 ±1%는 그대로).
  • 왜 중요: 클럭이 틀리면 타이머 주기·PWM 주파수·UART 보레이트·ADC 레이트가 전부 어긋난다("타이머 절반 속도·USART 깨진 문자"가 전형 증상). 고클럭은 Flash wait-state↑도 고려.

꼬리질문: "UART 보레이트가 깨진다, 원인?" → 십중팔구 클럭 트리 오설정. / "저전력 모드 클럭?" → LSI/LSE로 RTC·IWDG 유지·메인 정지. / "정확도 단위?" → ppm(크리스탈) vs %(RC).

함정: ❌ "내부 RC로 고속 UART 충분" → 누적 오차로 프레임 깨짐 → HSE 권장. ❌ "PLL이 클럭을 정확하게" → 체배만·정확도는 크리스탈. ❌ "타이머 입력=APB 클럭 그대로" → APB prescaler≠1이면 타이머 입력 ×2 규칙(STM32).


한국 임베디드 면접 단골 Q&A (답변 골격)

질문핵심 답
push-pull vs open-drain능동 양방향 vs Low만·외부 풀업·wired-AND
open-drain 용도I2C·인터럽트 공유·레벨 시프트
PWM 생성PSC·ARR(주파수)·CCR(듀티)·output compare
PWM 주파수 변경PSC/ARR(CCR 아님)·0-based −1
input captureedge 시 카운터 래치 → 주기/주파수 측정
워치독 왜행·폭주 자동 리셋 복구
IWDG vs WWDGLSI 독립·아무때 vs PCLK·윈도우(일찍/늦으면 리셋)·EWI
ADC 분해능/LSB2ⁿ·1 LSB=Vref/2ⁿ(12bit 3.3V≈0.806mV)
SAR vs ΣΔ이진탐색 중속 vs 오버샘플 고분해능
ADC 노이즈오버샘플·평균·Vref·샘플링·그라운드
HSE vs HSI크리스탈 정확(ppm) vs 내부RC(±1%)
PLL체배·정확도는 소스가 결정

꼬리질문 대비 (상 난이도)

  • "PWM 주파수만 바꾸고 듀티 유지?" → PSC/ARR 변경 + CCR 비례 재계산.
  • "center-aligned는 왜 주파수 절반?" → 0→ARR→0 왕복(대칭)·모터 고조파↓.
  • "워치독을 타이머 ISR에서만 먹이면?" → 메인이 죽어도 ISR이 계속 먹여 행을 못 잡음 → 핵심 태스크 플래그 AND.
  • "ADC 12bit인데 측정이 흔들린다?" → Vref 노이즈·샘플링 부족·그라운드·임피던스.
  • "클럭 올렸더니 불안정?" → Flash wait-state·전압·소비전력 동반 고려.

한 줄 요약GPIO(push-pull=능동 양방향·open-drain=Low만+풀업·wired-AND). 타이머/PWM: f_PWM=f_TIMxCLK/((PSC+1)(ARR+1))·Duty=CCR/(ARR+1)·ARR=주파수·CCR=듀티(0-based −1)·input capture로 측정. 워치독: IWDG(LSI 독립·아무때·Stop) vs WWDG(PCLK·윈도우·EWI)·켜면 못 끔. ADC: 1 LSB=Vref/2ⁿ·SAR(중속) vs ΣΔ(고분해능)·정확도는 Vref·노이즈·샘플링. 클럭: HSE(크리스탈·ppm) vs HSI(±1%)·PLL은 체배만·클럭 오설정이 통신·타이머를 깨뜨림.

(출처 — 한국 면접 기출·1차자료 교차검증 2026-06: velog @audgus47(push-pull/open-drain)·@d2h10s(워치독)·@bburi406(EXTI)·@66yurimi99(채터링) · 1차자료: ST IWDG 트레이닝·ST AN2834 — ADC 정확도·STM32 타이머/PWM 공식·예제·IWDG/WWDG 상세·STM32 RCC 클럭 교차검증.)

필드버스·산업 통신 — CAN(아비트레이션·종단저항)·LIN·RS-485·Modbus·BLE펌웨어 빌드·부팅 — 빌드 과정·메모리 섹션(.data/.bss)·링커·startup·OTA