以下程序是基于新唐M051單片機(jī)而開發(fā)的:
/* 看門狗是向上計(jì)數(shù)的,PWM是向下計(jì)數(shù)的
看門狗特征:
1)18位自由運(yùn)行的計(jì)數(shù)器以防止CPU在延遲時(shí)間結(jié)束之前發(fā)生看門狗定時(shí)器復(fù)位
2)溢出時(shí)間間隔可選(2^4 ~ 2^18),溢出時(shí)間范圍在104ms~26.3168s(如果WDT_CLK為10KHz)
3)復(fù)位周期=(1/10KHz)*63,如果WDT_CLK=10KHz */
#include "WDT.h"
#define DEBUGMSG printf
void SystemInit(void)
{
PROTECT_REG
(
PWRCON |= XTL12M_EN; //默認(rèn)時(shí)鐘源為外部晶振
while((CLKSTATUS & XTL12M_STB) == 0); //等待12MHz時(shí)鐘穩(wěn)定
CLKSEL0 = (CLKSEL0 & (~HCLK)) | HCLK_12M; //設(shè)置外部晶振為系統(tǒng)時(shí)鐘
/* 使能內(nèi)部10K時(shí)鐘 */
PWRCON |= OSC10K_EN;
/* 等待10K時(shí)鐘穩(wěn)定 */
while((CLKSTATUS & OSC10K_STB) == 0);
/* HCLK時(shí)鐘選擇為外部晶振 */
CLKSEL0 = (CLKSEL0 & (~HCLK)) | HCLK_12M;
)
}
/****************************************
*函數(shù)名稱:WatchDogInit
*輸 入:無
*輸 出:無
*功 能:看門狗初始化
******************************************/
VOID WatchDogInit(VOID)
{
PROTECT_REG
(
/* 使能看門狗時(shí)鐘 */
APBCLK |= WDT_CLKEN;
/* 設(shè)置看門狗時(shí)鐘源為10K */
CLKSEL1 = (CLKSEL1 & (~WDT_CLK)) | WDT_10K;
/* 使能看門狗定時(shí)器復(fù)位功能 */
WTCR |= WTRE;
/* 設(shè)置看門狗超時(shí)間隔為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;
/* 復(fù)位看門狗計(jì)數(shù)值 */
WTCR |= CLRWTR;
)
}
/****************************************
*函數(shù)名稱:WDT_IRQHandler
*輸 入:無
*輸 出:無
*功 能:看門狗中斷服務(wù)函數(shù)
******************************************/
VOID WDT_IRQHandler(VOID)
{
DEBUGMSG("WDT Reset \r\n"); //打印復(fù)位信息
PROTECT_REG
(
WTCR |= WTWKF;
WTCR |= WTIF;
)
}
/****************************************
*函數(shù)名稱:main
*輸 入:無
*輸 出:無
*功 能:函數(shù)主體
******************************************/
INT32 main(VOID)
{
SystemInit();
UartInit(12000000,9600); //波特率設(shè)置為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);
}
}