포스트

임베디드 스터디 - 부트로더 전원관리

임베디드 스터디 - 부트로더 전원관리

부트로더 전원관리 개요

  • 전원관리는 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클럭RAMWake-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 도달 → 시스템 강제 리셋
      

스타트업 코드에서의 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 라이센스를 따릅니다.