본문 바로가기
프로그래밍/Keil RTX

Watchdog Timer 직접 설정하고 리셋시키기

by 채연2 2025. 7. 17.

WDT(Watchdog Timer)란 ?MCU가 정해진 시간 안에 스스로 살아 있음을 증명하지 못하면, 자동으로 리셋을 발생시켜 시스템을 다시 살리는 안전장치.

이번에는 실제로 WDT를 직접 설정하고, 일부러 WDT를 무시해서 리셋을 발생시킨 후, 리셋이 발생한 원인을 확인해보려고 함.

 


 

Watchdog Timer 직접 설정하고 리셋시키기

 

기본 구조

WDT는 단순히 "타이머"가 아니라, 그 자체가 독립된 시스템 감시 모듈임.

WDT Enable → Timeout 설정 → 일정 주기 내 WDT 리셋(clear) → 안 하면 강제 시스템 리셋

 

즉, 정상적인 루프 흐름 안에서만 WDT를 계속 초기화해주고, 만약 시스템이 멈춰 루프를 돌지 못하면 → WDT가 MCU를 리셋함.


AVR 기준: 코드 예제 (ATmega328p)

 

  • wdt_enable(WDTO_2S): 2초 내에 reset 안 하면 리셋 발생
  • wdt_reset(): 주기적으로 실행 시 WDT 타이머가 초기화됨
  • 위 코드에서는 일부러 주석 처리해서 2초 이상 루프가 정체되면 MCU가 자동 리셋

실제 실행하면 LED가 몇 번 깜빡인 뒤 멈췄다가 다시 시작됨 → 이게 WDT 리셋

 

#include <avr/io.h>
#include <avr/wdt.h>
#include <util/delay.h>

int main(void) {
  // WDT 초기화
  wdt_enable(WDTO_2S); // 2초 timeout 설정

  DDRB |= (1 << PB0);  // LED 출력용 설정

  while (1) {
    PORTB ^= (1 << PB0);  // LED 토글
    _delay_ms(500);

    // wdt_reset();  // 주석 처리: WDT 리셋 안 함 → 시스템 리셋 유도
  }
}

리셋 원인 확인하기 (MCUSR 분석)

 

  • MCUSR: MCU Reset 상태를 담고 있는 레지스터
  • WDRF: Watchdog Reset Flag → 이 비트가 1이면 WDT 리셋
  • 이 코드를 통해 전원이 꺼진 건지, 수동 리셋인지, WDT 리셋인지 구분 가능

 

if (MCUSR & (1 << WDRF)) {
  // WDT로 인해 리셋된 경우
  PORTB |= (1 << PB1); // 별도 LED 켜기 등 처리
}
MCUSR = 0;  // 플래그 초기화

STM32 기준 대응

STM32에서도 WDT는 IWDG (Independent Watchdog)로 구현됨. HAL 라이브러리를 쓰는 경우 다음과 같이 초기화하고 사용할 수 있음.

IWDG_HandleTypeDef hiwdg;

void MX_IWDG_Init(void) {
  hiwdg.Instance = IWDG;
  hiwdg.Init.Prescaler = IWDG_PRESCALER_64;
  hiwdg.Init.Reload = 1000;  // Timeout 계산 필요
  HAL_IWDG_Init(&hiwdg);
}

 

설정 후엔 주기적으로 아래 코드로 리셋시켜야 함. 이 호출을 빼먹으면 일정 시간 후 자동 리셋

HAL_IWDG_Refresh(&hiwdg);

 


 

WDT는 이론보다 실제로 한 번만 직접 리셋을 겪어보면 개념이 확실히 잡히는 장치임.
단순히 "루프 안에 wdt_reset() 넣으면 된다"는 식의 접근보단, 정말 루프가 멈췄을 때 안전하게 시스템을 재부팅하는 기능임을 인지하는 게 중요함. 실무에서는 버튼 입력 무한루프, 통신 블록, 센서 불량 등으로 MCU가 정지하는 순간이 실제로 자주 발생함.
이때 WDT가 없다면 시스템은 멈춘 채로 영원히 죽어 있을 수 있는..  큰 장애가 발생함. WDT는 그 자체로 "복구력"을 갖는 장치임.

 

 

 

 

320x100

'프로그래밍 > Keil RTX' 카테고리의 다른 글

디바운싱(Debouncing)이란? – 버튼 중복 입력 막는 법  (1) 2025.07.16
[C/Keil RTX] I2C 통신  (30) 2023.01.05
[C/Keil RTX] CAN 통신  (22) 2023.01.03
[C/RL-ARM KEIL] event 처리 구현  (60) 2022.12.28
WDT이란? Watchdog이란?  (32) 2022.12.28

댓글