C언어,ARM

xmega - WDT reset 와치독 타이머

안녕1999 2020. 6. 27. 22:03
프로그램(펌웨어)가 비정상 종닥으로 멈추거나, 특정 위치에서 무한루프를 돌게되어, 장비가 멈추어 있는 경우가 발생할 수 있다.
이런 경우, 와치독 타이머라는것을 사용하여, 자동으로 재부팅하도록 하는 기능이다.
main 루프안에서 계속 와치독타이머를 리셋시켜주어야한다.
프로그램 어디선가 계속 멈추어 있을 경우, 자동으로 재부팅(cpu 리셋)된다.


void WDT_init(void);
inline void WDT_init(void)
{
	unsigned char s,n;

	// Optimize for speed
	//#pragma optsize-
	// Save interrupts enabled/disabled state
	s=SREG;
	// Disable interrupts
	cli();

	// Watchdog Timer: On
	n=(WDT.CTRL & (~WDT_PER_gm))
		|WDT_PER3_bm//시간조정
		|WDT_ENABLE_bm | WDT_CEN_bm;
	CCP=CCP_IOREG_gc;
	WDT.CTRL=n;
	// Watchdog window mode: Off
	n=(WDT.WINCTRL & (~WDT_WEN_bm)) | WDT_WCEN_bm;
	CCP=CCP_IOREG_gc;
	WDT.WINCTRL=n;

	// Restore interrupts enabled/disabled state
	SREG=s;
	// Restore optimization for size if needed
	//#pragma optsize_default
}
#define WDT_reset()	asm("WDR")



사용예)
main()
{
	...
    WDT_init();
    while(1)
    {
    	...
        cpu_sleep();
        WDT_reset();
	}
}