임베디드 스터디 - 부트로더 전원관리
임베디드 스터디 - 부트로더 전원관리
부트로더 전원관리 개요
- 전원관리는 OS 레벨뿐만 아니라 OS가 뜨기 전 부트로더 레벨에서도 이루어짐
- 부트로더 전원관리의 핵심 3요소
- Power-On Reset (POR)
- Wake-up 소스
- Watchdog Timer (WDT)
Power-On Reset (POR)
- 전원 인가 시 전압은 0V에서 목표 전압까지 서서히 상승함
- 전압이 불안정한 구간에서 CPU가 동작하면 레지스터·메모리 셀이 오동작할 수 있음
- POR은 전압이 안정적인 임계값에 도달할 때까지 CPU를 강제로 리셋 상태에 묶어두는 하드웨어 회로
1
2
3
4
5
6
7
8
9
전원 인가
↓
전압 상승 중 (불안정)
↓
POR 회로가 RESET 핀을 LOW로 유지 → CPU 동작 차단
↓
전압이 임계값 초과 (안정)
↓
RESET 핀 HIGH → CPU 부트 시작
Wake-up 소스
- Sleep 상태에서 시스템을 깨우는 외부 트리거
- 부트로더는 Wake-up 소스를 확인해 부팅 경로를 결정함
| 분류 | 예시 |
|---|---|
| GPIO | 전원 버튼, 외부 인터럽트 신호 |
| 타이머 | RTC — 일정 시간 후 자동 Wake-up |
| 통신 | UART/CAN 수신, 이더넷 Wake-on-LAN |
| 아날로그 | ADC 임계값 초과 (온도, 배터리 전압 등) |
- 부트로더에서 리셋 원인 레지스터를 읽어 빠른 복구 경로를 결정함
1
2
3
4
5
6
7
8
9
// U-Boot 스타일 Wake-up 소스 확인 예시
reset_cause = read_reset_cause_register();
if (reset_cause == WAKEUP_RTC)
fast_resume(); // 저장된 상태 복구
else if (reset_cause == WAKEUP_GPIO)
normal_boot(); // 일반 부팅
else if (reset_cause == POWER_ON_RESET)
full_init(); // POR → 전체 초기화
Sleep 상태 설계
- Wake-up 소스를 활용하기 위해선 사용할 주변 장치의 인터페이스는 살려둬야 한다.
1
2
3
4
5
6
7
8
9
10
11
Deep Sleep 상태에서도 유지되는 것들
├── RTC (타이머 Wake-up용)
├── Wake-up 핀 감지 회로 (GPIO Wake-up용)
├── RAM 전원 (Suspend-to-RAM인 경우)
└── PMU(Power Management Unit) 자체
끄는 것들
├── CPU 코어
├── 메인 클럭 (PLL 등)
├── 사용하지 않는 peripheral (UART, SPI, I2C 등)
└── 메인 전압 레일 일부
- STM32 기준으로 각 모드에 따라 Wake-up 트리거가 다르기에, 장치의 상황에 따라 적합한 모드로 Sleep을 운용해야 한다.
| 모드 | CPU | 클럭 | RAM | Wake-up 소스 | 소비전류 |
|---|---|---|---|---|---|
| Sleep | 정지 | 유지 | 유지 | 인터럽트 전부 | ~mA |
| Stop | 정지 | 정지 | 유지 | 일부 GPIO, RTC | ~μA |
| Standby | 정지 | 정지 | ❌ | WKUP 핀, RTC만 | ~μA 이하 |
Watchdog Timer (WDT)
- 소프트웨어가 hang/deadlock/무한루프에 빠졌을 때 시스템을 강제 리셋하는 하드웨어 안전장치
- 정상 동작 중에는 소프트웨어가 주기적으로 feeding(kick/refresh)을 해줘야 함
- feeding이 일정 시간 내에 오지 않으면 카운터가 0에 도달 → 강제 리셋
1 2 3 4 5 6 7 8 9 10
WDT 활성화 ↓ 카운터 감소 시작 ↓ ┌─────────────────────────────────┐ │ 정상 동작 │ │ 소프트웨어가 주기적으로 feeding │ → 카운터 리셋 → 반복 └─────────────────────────────────┘ ↓ (feeding 못 받으면) 카운터 0 도달 → 시스템 강제 리셋
- feeding이 일정 시간 내에 오지 않으면 카운터가 0에 도달 → 강제 리셋
스타트업 코드에서의 WDT 처리
- 스타트업 구간(스택·클럭·DRAM 초기화)은 시간이 걸리고 feeding이 불가능함
- WDT가 활성화된 상태면 정상 부팅 중에도 리셋이 걸릴 수 있음
- 따라서 스타트업 코드에서 WDT를 비활성화하고,
main()진입 후 재활성화하는 패턴을 사용함1 2 3 4 5 6 7 8 9 10
[스타트업 코드] WDT 비활성화 스택 초기화 클럭 설정 DRAM 초기화 ← 시간 걸림, feeding 불가 BSS/데이터 초기화 main() 진입 ↓ [main()] WDT 재활성화 + feeding 루프 시작 - trade-off : WDT가 꺼진 스타트업 구간에서 코드가 멈추면 자동 복구 불가
- POR과 WDT를 함께 사용해 완전한 안전망을 구성함
부트로더 전원관리 전체 흐름
1
2
3
4
5
6
7
8
9
10
11
전원 인가
↓
[POR] 전압 안정화까지 CPU 대기
↓
[스타트업] WDT 비활성화 → 하드웨어 초기화
↓
[main()] WDT 재활성화
↓
[Wake-up 소스 확인] 리셋 원인에 따라 부팅 경로 결정
↓
OS 부팅
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.