回答

收藏

【赚周年币】技术帖Week3-Day2——LPC824 Breakout之16、WWDT学习

#线上活动 #线上活动 3599 人阅读 | 0 人回复 | 2017-01-16

本帖最后由 toofree 于 2017-1-19 03:23 编辑

        【赚周年币】技术帖Week3-Day2——LPC824 Breakout之16、WWDT学习

        我们以工程“LPC824_Example_Code_Bundle_Keil_r1.0\Keil_Projects\Example_WWDT_Window_and_Warning_Interrupt\Example_WWDT_Window_and_Warning_Interrupt.uvoptx”为例进行学习。

        LPC82x Windowed Watchdog Timer (WWDT) 窗口看门狗样例程序比较简单,整个程序就一个main()函数,加一个看门狗中断处理函数。
  1. int main(void) {
  2.   // Turn on peripheral clocks to relevant peripherals.
  3.   LPC_SYSCON->SYSAHBCLKCTRL |= (WWDT)|(GPIO);
  4.   Config_LEDs(GREEN|RED|BLUE);

  5.   // Examine the WDTOF flag. If set, this current reset is due to a watchdog event. Stop here.
  6.   if (LPC_WWDT->MOD & (1<<WDTOF)) {
  7.     // Clear the WDTOF flag by writing '0' to it (go figure)
  8.     LPC_WWDT->MOD &= ~(1<<WDTOF);
  9.     LEDs_Off(RED|BLUE|GREEN);
  10.     LEDs_On(RED);
  11.     while(1);
  12.   }

  13.   // Apply power to the watchdog oscillator.
  14.   LPC_SYSCON->PDRUNCFG &= ~(WDTOSC_PD);

  15.   // Configure the WDCLK frequency in the SYSCON module.
  16.   LPC_SYSCON->WDTOSCCTRL = (1<<FREQSEL)|(31<<DIVSEL);

  17.   // Configure the WWDT
  18.   LPC_WWDT->WARNINT = 0x3FF;
  19.   LPC_WWDT->WINDOW = 0x400;
  20.   LPC_WWDT->TC = 0x800;
  21.   LPC_WWDT->MOD = (0<<WDTOF)|(1<<WDEN)|(1<<WDRESET);

  22.   // Enable the WWDT interrupt in the NVIC.
  23.   NVIC_EnableIRQ(WDT_IRQn);

  24.   // Turn on the green LED.
  25.   LEDs_On(GREEN);

  26.   // Do a feed sequence to enable the WWDT.
  27.   LPC_WWDT->FEED = 0xAA;
  28.   LPC_WWDT->FEED = 0x55;

  29.   // Enter the main while(1) loop. WWDT interrupts will feed the WWDT as long as they occur inside the window.
  30.   while(1) {
  31.   } // end of while(1)
  32. } // end of main
复制代码

        开启看WWDT和GPIO外设时钟,即使能其逻辑模块。配置3个LED灯,实质也是设置这三个对应管脚为输出状态。

        

        检查WDTOF位状态,一旦此位为1,表示上次复位前发生了看门狗事件,程序将停在这里。

        

        看门狗专用时钟上电,即使能看门狗计数时钟。

        

        (1<<FREQSEL),设置看门狗时钟源频率为600KHz;(31<<DIVSEL),设置64分频。即实际有效的看门狗计数时钟频率为9.375KHz 。

        

        WARNINT看门狗警告中断寄存器设为0x3FF,一旦TC计数器值小于WARNINT,则发生中断,可在中断程序中喂狗,(WARNINT可设置最大值为1024)。
        WINDOW窗口寄存器设计为0x400,这个值必须比WARNINT大,在窗口内喂狗才有效,在窗口外(即TC值比WINDOW大的时候)喂狗,将造成看门狗强制复位。
        TC设置0x800,即喂狗时自动重装载值为0x800。
        MOD设置,(0<<WDTOF)清除看门狗定时器溢出标志;(1<<WDEN)使能看门狗,(在下一个喂狗操作后,开始看门狗计时);(1<<WDRESET)使能看门狗定时器溢出致硬件复位功能。

        

        开启看门狗中断(即警告中断),点亮绿色LED。

        

        设置看门狗使能后的第一次喂狗操作,看门狗开始计时。

        看门狗中断函数也比较简单,但是仍有些注意事项。
        

        进中断后,立刻清中断。读取并保存当前所有使能的中断。(为什么要读取呢,因为要在喂狗期间要禁止所有中断,否则一旦有其它中断打断喂狗操作时序,将直接引起看门狗复位)。禁止所有其它中断,喂狗,恢复其它中断使能状态。中断函数返回。
        
        运行程序后,可以看到,板上绿灯一直为亮,红灯一直为灭状态。因为看门狗中断中,一直在成功喂狗着,看门狗定时器始终没有复位。

        我们把中断函数中的喂狗操作屏蔽掉。
        


        并且主函数中稍做改动,不让检测看门狗定时溢出检测成功后一直死循环,而是一断延时后自动退出。
        


        全速跑程序,可以看到红灯一直亮,绿色在闪烁。由于在看门狗开始计时后,一直没有喂狗操作,造成了看门狗溢出复位。
关注下面的标签,发现更多相似文章

评分

参与人数 1 +15 收起 理由
EEboard爱板网 + 15 3周发帖养成记 奖励

查看全部评分

分享到:
回复

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条