一个LED的N种玩法(五)--WatchDog Timer
Author: chenzhufly
Email: chenzhufly@126.com
2010-05-02
一.WatchDog Timer 概述
看门狗的目的是当进入错误状态一定时间后复位微控制器。当看门狗使能时,如果用户没有在一定时间内喂狗(看门狗定时器重新装载),看门狗会产生一个系统复位。
看门狗定时器包括一个4分频的预分频器和一个32位计数器。时钟通过预分频器输入到定时器。定时器递减计时。计数器递减的最小值为0xFF。如果设置一个小于0xFF的值,系统会将0xFF装入计数器。因此看门狗定时器的最小间隔为(TWDCLK × 256×4),最大间隔为(TWDCLK×232×4),两者都是(TWDCLK×4)的倍数。
看门狗定时器的使用方法:
1. 在WDTC寄存器中设置看门狗定时器的重新装载值;
2. 在WDMOD寄存器中设置看门狗定时器的工作模式;
3. 通过向WDFEED寄存器先写入0xAA后写0x55启动看门狗;
4. 在看门狗计数器溢出前应再次喂狗,以免发生复位或中断
当看门狗处于复位模式且计数器溢出时,CPU将复位,并从向量表中加载堆栈指针和编程计数器(与外部复位情况相同),检查看门狗超时标志(WDTOF)来查看看门狗是否已引起了复位,WDTOF标志必须通过软件清零。
看门狗定时器具有以下特性:
1. 如果没有周期性喂狗,将产生片内复位;
2. 具有调试模式;
3. 可通过软件使能,但需要硬件复位或禁能看门狗复位/中断;
4. 在看门狗使能的情况下,错误或不完整的喂狗时序会令看门狗产生复位或中断;
5. 具有看门狗复位标志位;
6. 带内置预分频器的可编程32位定时器;
7. 可选择TWDCLK×4倍数的时间周期:从(TWDCLK × 28 × 4)到(TWDCLK × 232 × 4);
8. 看门狗时钟(WDCLK)源可以选择内部RC振荡器(IRC)、主时钟或看门狗振荡器,这为看门狗在不同功率下提供了较宽的时序选择范围。为了提高可靠性,它还可以使看门狗定时器在与外部晶振及其相关元件无关的内部时钟源下运行。
WatchDog Timer结构如下图所示:
当看门狗定时器溢出时,看门狗可以向内核发出中断信号和复位信号。
WatchDog Timer相关寄存器如下:
二.参考例程
这个例程的原形来自于自带的WDT和blinky,本身的WDT例程不是很直观,并不能很好的观察WatchDog Timer的工作过程。代码结构修改如下:感兴趣的可以自行修改
把blinky例程里面的time32.c,time32.h,gpio.c,gpio.h拷贝了进来,用来指示看门狗定时器的工作过程。
int main (void)
{
WDT_CLK_Setup(WDTCLK_SRC_MAIN_CLK);//设置看门狗定时器的时钟
init_timer32(0, TIME_INTERVAL);//初始化32bit定时器
WDTInit();//初始化看门狗
enable_timer32(0);//使能32bit定时器
GPIOInit();
GPIOSetDir(0, 7, 1);
while( 1 )
{
}
}
关键是下面的这个看门狗中断服务程序,我们来仔细看看它到底做了些什么事情
void WDT_IRQHandler(void)
{
NVIC_DisableIRQ(WDT_IRQn); // 关闭看门狗中断,仿真再次进入
GPIOSetValue(0, 7, 0 ); //闪灯程序
delay32Ms(0,500);
GPIOSetValue(0, 7, 1 );
delay32Ms(0,500);
LPC_WDT->MOD &= ~WDTOF; //清楚看门狗超时标志位
NVIC_EnableIRQ(WDT_IRQn); //打开看门狗中断,允许下一次中断进入
}
每产生一次看门狗中断,LED闪一次,呵呵,目的已经达到,继续。。。。。。
写到这里我也在犯愁,后面还能写些什么呢?我需要思考一下,大家一起帮忙出出主意把,非常感谢~~~~~~~~~~
一个LED的N种玩法_五_----WatchDog Timer.pdf
(156.97 KB, 下载次数: 118)
watchdog.rar
(210.63 KB, 下载次数: 119)
更多精彩 稍后继续
[
本帖最后由 chenzhufly 于 2010-5-3 09:27 编辑 ]