以下程序是基于新唐M051單片機而開發的:
/* 看門狗是向上計數的,PWM是向下計數的
看門狗特征:
1)18位自由運行的計數器以防止CPU在延遲時間結束之前發生看門狗定時器復位
2)溢出時間間隔可選(2^4 ~ 2^18),溢出時間范圍在104ms~26.3168s(如果WDT_CLK為10KHz)
3)復位周期=(1/10KHz)*63,如果WDT_CLK=10KHz */
#include "WDT.h"
#define DEBUGMSG printf
void SystemInit(void)
{
PROTECT_REG
(
PWRCON |= XTL12M_EN; //默認時鐘源為外部晶振
while((CLKSTATUS & XTL12M_STB) == 0); //等待12MHz時鐘穩定
CLKSEL0 = (CLKSEL0 & (~HCLK)) | HCLK_12M; //設置外部晶振為系統時鐘
/* 使能內部10K時鐘 */
PWRCON |= OSC10K_EN;
/* 等待10K時鐘穩定 */
while((CLKSTATUS & OSC10K_STB) == 0);
/* HCLK時鐘選擇為外部晶振 */
CLKSEL0 = (CLKSEL0 & (~HCLK)) | HCLK_12M;
)
}
/****************************************
*函數名稱:WatchDogInit
*輸 入:無
*輸 出:無
*功 能:看門狗初始化
******************************************/
VOID WatchDogInit(VOID)
{
PROTECT_REG
(
/* 使能看門狗時鐘 */
APBCLK |= WDT_CLKEN;
/* 設置看門狗時鐘源為10K */
CLKSEL1 = (CLKSEL1 & (~WDT_CLK)) | WDT_10K;
/* 使能看門狗定時器復位功能 */
WTCR |= WTRE;
/* 設置看門狗超時間隔為1740.8ms */
WTCR &= ~WTIS;
WTCR |= TO_2T14_CK; //(2^14+1024)*(1000000/10000)=17408*100=1740800us=1.7408s
/* 使能看門狗中斷 */
WTCR |= WTIE;
NVIC_ISER |= WDT_INT;
/* 使能看門狗 */
WTCR |= WTE;
/* 復位看門狗計數值 */
WTCR |= CLRWTR;
)
}
/****************************************
*函數名稱:WDT_IRQHandler
*輸 入:無
*輸 出:無
*功 能:看門狗中斷服務函數
******************************************/
VOID WDT_IRQHandler(VOID)
{
DEBUGMSG("WDT Reset \r\n"); //打印復位信息
PROTECT_REG
(
WTCR |= WTWKF;
WTCR |= WTIF;
)
}
/****************************************
*函數名稱:main
*輸 入:無
*輸 出:無
*功 能:函數主體
******************************************/
INT32 main(VOID)
{
SystemInit();
UartInit(12000000,9600); //波特率設置為9600bps
WatchDogInit(); //看門狗初始化
while(1)
{
WTCR |= CLRWTR; //喂狗操作
DEBUGMSG("WDT No Reset \r\n");
Delayms(50);
WTCR |= CLRWTR; //喂狗操作
Delayms(50);
WTCR |= CLRWTR; //喂狗操作
Delayms(50);
WTCR |= CLRWTR; //喂狗操作
Delayms(50);
}
}