본 글은 MSP430G2553 MCU를 기준으로 작성되었습니다.
세부적인 내용은 제품군마다 조금씩 다를 수 있습니다.
Watchdog Timer+는 일종의 타이머 모듈로서, MCU의 동작을 모니터링하여 오동작 감지 시 시스템을 리셋시켜주는 역할을 한다.
오동작을 감지하자 짖어서 상황을 알리는 귀여운 개를 표현해보았다.
오동작에는 아래와 같은 것들이 있다.
- 잘못된 어드레스 접근
외엔 잘 모르겠음..
전원 불안정이나 오실레이터가 고장난 경우에도 동작한다던가? 정확히는 모르겠다. (확인해보겠다고 전원이나 오실레이터를 고장낼 순 없으니..)
오동작을 감지하면 16비트 타이머를 돌려서 다시 정상적인 상황이 될 때까지 대기하다가 타이머가 만료될 때까지 복구되지 않으면 시스템을 리셋시킨다.
MCU 내부에 모듈로서 존재하며, CPU에 종속되지 않고 독립적으로 동작한다. LFX1CLK을 클럭 소스로 사용한다던가 하튼 뭐를 쓴다고 했고, CPU 클럭 뻗어도 와치독 클럭이 살아있는 한 얘는 계속 독립적으로 실행된다고 본 것 같음.
Watchdog Timer+의 특징은 아래 그림과 같다.
눈에 띄는 것 몇 가지만 설명하였다.
와치독 기능 사용하지 않으면 일반적인 인터벌 타이머처럼 쓸 수도 있다.
WDT+에는 password란 게 있어서 WDT+ 제어용 레지스터에 password 없이 그냥 값을 쓰려고 하면 에러로 간주한다.
리셋을 할 때 MCU에 있는 ^RST/NMI 핀을 제어하여 리셋을 하는 듯하다. ^RST/NMI 핀은 특정 신호(HIGH-LOW-HIGH)가 인가되면 MCU를 리셋하도록 되어 있는데, 이 신호를 생성하여 인가하는 것 같다.
WDTCTL register, Password comparing, Clock fail-safe, 16-bit Counter, Interrupt Flag 등, 와치독이 동작하는 전반적인 내용들이 그림으로 나타나있는 것을 볼 수 있다.
WDT+ 동작에는 아래 3개의 레지스터가 사용된다.
- WDTCTL - WatchDog Timer Control Register
- IE1 - Interrupt Enable Register 1
- IFG - Interrupt Flag Register 1
- 잘못된 어드레스 접근
잘못된 어드레스 접근에 의한 와치독 동작을 확인해보자.
아래 예제는 사용자 영역 바깥의 메모리를 프로그램 카운터로 접근했을 때 와치독이 동작하는 코드이다.
#include <msp430.h>
int main(void)
{
volatile unsigned int i;
WDTCTL = WDTPW | WDTHOLD; // 와치독 비활성화
P1DIR |= 0x01; // P1.0 핀을 output으로 설정
TAR = 0x3FFF; // Opcode for "jmp $"
for (;;)
{
P1OUT ^= 0x01; // P1.0 토글
i = 50000;
do (i--);
while (i != 0);
((void (*)())0x170)(); // 접근하면 안되는 주소로 분기 ("call #0170h")
}
}
와치독을 껐는데 와치독이 동작하는 건가?