查看: 2461|回复: 0

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

[复制链接]
  • TA的每日心情
    开心
    3 小时前
  • 签到天数: 3742 天

    连续签到: 68 天

    [LV.Master]伴坛终老

    发表于 2017-1-16 23:51:43 | 显示全部楼层 |阅读模式
    分享到:
    本帖最后由 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
    复制代码
    傲游截图20170117005134.jpg
            开启看WWDT和GPIO外设时钟,即使能其逻辑模块。配置3个LED灯,实质也是设置这三个对应管脚为输出状态。

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

             傲游截图20170117005518.jpg
            看门狗专用时钟上电,即使能看门狗计数时钟。

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

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

             傲游截图20170117011155.jpg
            开启看门狗中断(即警告中断),点亮绿色LED。

             傲游截图20170117011303.jpg
            设置看门狗使能后的第一次喂狗操作,看门狗开始计时。

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

            我们把中断函数中的喂狗操作屏蔽掉。
             傲游截图20170117012403.jpg

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

            全速跑程序,可以看到红灯一直亮,绿色在闪烁。由于在看门狗开始计时后,一直没有喂狗操作,造成了看门狗溢出复位。

    评分

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

    查看全部评分

    回复

    使用道具 举报

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

    本版积分规则

    关闭

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



    手机版|小黑屋|与非网

    GMT+8, 2024-4-17 03:24 , Processed in 0.170640 second(s), 27 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2020, Tencent Cloud.