查看: 2459|回复: 3

[原创] 【LPC824Lite】看门狗的使用

[复制链接]
  • TA的每日心情
    奋斗
    2023-9-17 19:57
  • 签到天数: 2310 天

    [LV.Master]伴坛终老

    107

    主题

    4270

    帖子

    1

    金牌会员

    Rank: 6Rank: 6

    积分
    10481
    最后登录
    2023-9-17
    发表于 2016-10-21 16:17:04 | 显示全部楼层 |阅读模式
    本帖最后由 shaoziyang 于 2016-10-21 20:59 编辑

    Mbed虽然说很好,包括了主要的功能模块,可是还是有一些有用的模块因为各种原因被遗漏了,比如我们常用的看门狗。

    幸好有网友写了LPC系列的看门狗程序,可以很方便的加入到Mbed中。

    在LPC824中,看门狗有多种模式:
    • 看门狗
    • 定时器
    • 休眠唤醒


    通过不同的函数就可以设置工作模式:

    • 看门狗模式

    先用wdt.init()设置好超时时间后,如果在指定时间内没有清理看门狗wdt.kick();,就会产生复位。下面的程序中,当按下用户按键就会进入死循环,引发看门狗复位。

    1. #include "mbed.h"
    2. #include "wdt.h"

    3. DigitalOut led(P0_18);
    4. DigitalIn sw(P0_1);
    5. Watchdog wdt;

    6. int main() {
    7.    
    8.     for(uint8_t i = 0; i < 20; i++)
    9.     {
    10.         led = !led;
    11.         wait(0.02);
    12.     }
    13.    
    14.     wdt.init(1.0);
    15.    
    16.     while(1) {
    17.         
    18.         if(sw == 0)
    19.         {
    20.             while(1);
    21.         }
    22.         
    23.         wdt.kick();
    24.         led = !led;
    25.         wait(0.5);
    26.     }
    27. }
    复制代码


    • 定时器模式

    如果我们不使用wdt.init(),而是使用wdt.attach()进行初始化,并指定中断函数,同时在中断函数中再次设置wdt.attach(),就可以让看门狗工作在定时器模式。在需要的时候,调用wdt.sleep()/wdt.deepSleep()/wdt.powerDown()就可以进入休眠,到设定时间后由wdt定时器唤醒。这三个sleep函数的区别在于功耗不同。注意使用wdt.sleep()等函数时,外部中断也会唤醒。

    1. #include "mbed.h"
    2. #include "wdt.h"

    3. DigitalOut led1(P0_18);
    4. DigitalOut led2(P0_19);

    5. InterruptIn sw(P0_1);
    6. Watchdog wdt;


    7. void wdt_isr()
    8. {
    9.     wdt.attach(&wdt_isr, 1.0);
    10.     led1 = !led1;
    11. }

    12. int main() {

    13.     wdt.attach(&wdt_isr, 1.0);
    14.    
    15.     while(1) {
    16.         
    17.         wdt.sleep();
    18.         //wdt.deepSleep();
    19.         //wdt.powerDown();
    20.         led2 = !led2;
    21.         
    22.     }
    23. }
    复制代码

    • 休眠模式

    在上面的定时器模式中,如果在进入wdt中断后,不再次设置wdt定时器,就会停留在休眠模式,需要通过外部中断唤醒。

    1. #include "mbed.h"
    2. #include "wdt.h"

    3. DigitalOut led1(P0_18);
    4. DigitalOut led2(P0_28);

    5. InterruptIn sw(P0_1);
    6. Watchdog wdt;

    7. void sw_isr()
    8. {
    9.     led1 = !led1;
    10. }

    11. void wdt_isr()
    12. {
    13. }

    14. int main() {

    15.     sw.fall(&sw_isr);
    16.    
    17.     for(uint8_t i = 0; i < 20; i++)
    18.     {
    19.         led2 = !led2;
    20.         wait(0.02);
    21.     }
    22.    
    23.     wdt.attach(&wdt_isr, 1.0);
    24.    
    25.     while(1) {
    26.         
    27.         wdt.sleep();
    28.         led2 = !led2;
    29.         
    30.     }
    31. }
    复制代码

    注:
    • 使用wdt.deepSleep()和wdt.powerDown()后,就不能连接仿真器进行仿真和下载了,也不能使用mbed磁盘方式下载,只能通过flashmagic通过串口方式下载程序。使用新的程序退出wdt.deepSleep()和wdt.powerDown()后,才能继续使用仿真器。


    完整的参考程序


    回复

    使用道具 举报

  • TA的每日心情
    开心
    2019-3-21 22:51
  • 签到天数: 369 天

    [LV.9]以坛为家II

    7

    主题

    2716

    帖子

    7

    金牌会员

    Rank: 6Rank: 6

    积分
    1824
    最后登录
    2019-3-21
    发表于 2016-10-21 18:12:37 | 显示全部楼层
    感谢楼主分享,很实用!
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2016-11-29 08:49
  • 签到天数: 8 天

    [LV.3]偶尔看看II

    1

    主题

    45

    帖子

    0

    注册会员

    Rank: 2

    积分
    115
    最后登录
    2016-11-29
    发表于 2016-11-21 16:55:55 | 显示全部楼层
    谢谢,分享了
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2017-2-13 07:08
  • 签到天数: 18 天

    [LV.4]偶尔看看III

    1

    主题

    264

    帖子

    0

    高级会员

    Rank: 4

    积分
    596
    最后登录
    2017-8-24
    发表于 2017-2-17 07:13:07 | 显示全部楼层
    早上好!
    来签到,来签到,早上好!
    回复

    使用道具 举报

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

    本版积分规则

    关闭

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

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2024-5-8 03:40 , Processed in 0.124769 second(s), 21 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表