STM32 Window watchdog 멈추기

흔히 고민되는 것이 Window watchdog 과 Indepedent watchdog 중에 어느것을 써야할지에 대한 고민입니다. 두가지 모두 Application 동작중에 오류로 인해 Core가 hang 걸렸을 때 System에 Reset을 걸어주는데 유용하게 사용됩니다. 

 

제가 생각하는 Window watchdog 은 아래와 같은 조건에서 사용되는 것이 좋습니다. 이것 이외에는 Window watchdog,  Indepedent watchdog 무엇을 사용해도 괜찮습니다.

 

Window watchdog 사용예

  • Application이 정밀한 스케줄로 동작되며 지정된 시간에 watchdog을 refresh(kick dog)을 못 시킬 경우
    Reset을 하는 용도
  • Low-power mode에서는 Watchdog을 멈춰야 할 경우

반면에 Indepedent watchdog은 다소 긴 주기를 가질 수 있으며 한번 시작하면 Low-power mode에서도 절대 멈출 수가 없습니다. 

 

이번 포스트의 주제는 Window watchdog을 어떻게 멈추는게 하는가 입니다. 일반적인 running 상태에서는 Window watchdog를 절대 멈추게 할 수 없으며 설정한 Window에 refresh를 하지 않으며 Reset이 걸리게 됩니다. 

 

Window watchdog는  7-bit down-counter을 가지고 있으며 APB clock에 의해서 동작하게 됩니다. 따라서 APB Clock을 Gating한다면 Window watchdog을 멈출 수 있게됩니다. 아래 그림은 STM32H562AG의 Digram입니다. 

 

Window watchdog은 APB1에 여러가지 다른 Peripheral들과 같이 연결되어 있습니다.

 

APB1 Clock을 Gating하는 방법은 RCC_CFGR2(STM32H5)의  APB1DIS 비트를 1로 설정하는 방법인데 이 방법은 APB1의 Peripheral의 Clock이 모두 Off된 상태에서만 가능합니다. 그러므로 사용불가.

 

두번째는 Peripheral의 Clock을 Gating하는 방법으로 RCC_APB1LENR의 WWDGEN을 0으로 설정하는 방법인데 이 비트는 한번 1로 설정하며 0으로 설정하는 것이 불가능합니다. 마찬가지로 사용불가.

 

따라서 사용가능한 방법은 RCC APB1 sleep clock register(RCC_APB1LLPENR)에서 WWDGLPEN비트를 0으로 세팅하는 방법 밖에 없습니다. 

 

결론은 Window watch dog은 Running 상태에서는 멈출 수가 없고 멈추게 하려면 WWDGLPEN을 0으로 설정 후 Application이 저전력모드로 진입해야 한다라고 알아 두시면 될거 같습니다. 아래는 간단한 예시 코드입니다.

 

__HAL_RCC_WWDG_CLK_SLEEP_DISABLE();
HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);

 

즐거운 하루되세요.