当软件运行出错的时候,看门狗定时器用来复位系统,这可以防止系统进入死循环状态,看门狗定时器内含一个可编程时间溢出的19位计数器。详细性能和结构如下描述。
特性
19位看门狗定时器计数器
8种看门狗定时器溢出时间间隔选择
支持看门狗定时器中断和看门狗定时器复位
结构
设置WTCR.WTE[7]使能看门狗定时器,WDT计数器开始计数,当计数器达到设定的时间溢出值时,看门狗定时器中断标志WTIF立即置位,如果此时看门狗定时器中断使能标志位WTIE是‘1’那么将产生WDT中断,时间溢出事件发生后跟随一个特定的延时,在这个延时结束之前,用户必须通过设置WTCR.WTR为‘1’来复位19位WDT计数器从而避免CPU被看门狗定时器复位,WTR位在WDT计数器复位的时候被硬件自动清零,通过设置WTCR.WTIS[10:8]可以选择8种看门狗时间溢出间隙,这个延时结束之后如果WDT计数器还没有被清零,看门狗定时器将设置看门狗定时器复位标志(WTRF)为‘1’并复位CPU,这个复位将持续64个WDT时钟周期,然后CPU重新从复位向量(0x00000000)处开始执行程序。看门狗复位不会清除WTRF位,用户可以通过查询WTRF位来确认是否是看门狗复位.
新唐的看门狗就记住一个寄存器就行这个就是
WTCR
【10:8】 WTIS 看门狗定时器溢出时间选择
【7】 WTE 看门狗定时器使能
【6】 WTIE 看门狗定时器中断使能0禁止1使能
【3】 WTIF 看门狗中断标志
【2】 WTRF看门狗定时器复位标志 0没复位1复位了
【1】 WTRE看门狗定时器复位功能 0禁止看门狗1使能看门狗
【0】 WTR 看门狗定时器复置 0无用1看门狗定时器值重置
下边是看门狗的时钟选择及复位、中断原理图
下边是程序,我要说的是这个程序很好看,LED1闪十次LED2、LED3、LED4亮一次
#include <stdio.h>
/*---------------------------------------------------------------------------------------------------------*/
/* Include hear file */
/*---------------------------------------------------------------------------------------------------------*/
#include "NUC1xx.h"
/*----------------------------------------------------------------------------
Define variable
----------------------------------------------------------------------------*/
static uint32_t WDTCOUN=0;
/*----------------------------------------------------------------------------
Function subroutine
----------------------------------------------------------------------------*/
void Delay(uint32_t delayCnt)
{
while(delayCnt--)
{
__NOP();
__NOP();
}
}
/*----------------------------------------------------------------------------
Interrupt subroutine
----------------------------------------------------------------------------*/
void WDT_IRQHandler(void) // Timer0 interrupt subroutine
{
UNLOCKREG();
WDT->WTCR.WTIF =1;
WDTCOUN++;
if (WDTCOUN<10) WDT->WTCR.WTR=1; //Wait 10 times
LOCKREG();
GPIOA->DOUT = 0x00; //Toggle GPIOA_0
Delay(10000);
GPIOA->DOUT = 0x04;
}
/*----------------------------------------------------------------------------
MAIN function
----------------------------------------------------------------------------*/
int32_t main (void)
{
GPIOA->PMD.PMD2=1;
Delay(1000);
NVIC_DisableIRQ(WDT_IRQn); //Disable WDT interrupt
outpw(&WDT->WTCR ,0 ); //Disable WDT
UNLOCKREG();
/* Step 1. Enable and Select WDT clock source */
SYSCLK->CLKSEL1.WDT_S =3; //Select 10Khz for WDT clock source
SYSCLK->APBCLK.WDT_EN =1; //Enable WDT clock source
/* Step 2. Select Timeout Interval */
WDT->WTCR.WTIS=4; //Select level 3 (11-bit mode)
/* Step 3. Enable Watchdog Timer Reset function */
WDT->WTCR.WTRE = 1;
/* Step 4. Enable WDT interrupt */
WDT->WTCR.WTIF =1; //Write 1 to clear for safty
WDT->WTCR.WTIE = 1;
NVIC_EnableIRQ(WDT_IRQn); //Enable WDT Interrupt
/* Step 5. Enable WDT module */
WDT->WTCR.WTE = 1; //Enable WDT
LOCKREG();
while(1);
}
NUC testWDT.rar
(1.52 MB)
|