專注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機(jī)教程網(wǎng) >> MCU設(shè)計(jì)實(shí)例 >> 瀏覽文章

新唐M051 WDT看門狗使用程序

作者:huqin   來源:本站原創(chuàng)   點(diǎn)擊數(shù):  更新時(shí)間:2014年09月01日   【字體:

以下程序是基于新唐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);
  }
}
 
關(guān)閉窗口