在线时间776 小时
UID126526
注册时间2008-5-19
NXP金币0
TA的每日心情 | 奋斗 2023-9-17 19:57 |
---|
签到天数: 2310 天 [LV.Master]伴坛终老
金牌会员
- 积分
- 10481
- 最后登录
- 2023-9-17
|
本帖最后由 shaoziyang 于 2016-10-21 20:59 编辑
Mbed虽然说很好,包括了主要的功能模块,可是还是有一些有用的模块因为各种原因被遗漏了,比如我们常用的看门狗。
幸好有网友写了LPC系列的看门狗程序,可以很方便的加入到Mbed中。
在LPC824中,看门狗有多种模式:
通过不同的函数就可以设置工作模式:
先用wdt.init()设置好超时时间后,如果在指定时间内没有清理看门狗wdt.kick();,就会产生复位。下面的程序中,当按下用户按键就会进入死循环,引发看门狗复位。
- #include "mbed.h"
- #include "wdt.h"
- DigitalOut led(P0_18);
- DigitalIn sw(P0_1);
- Watchdog wdt;
- int main() {
-
- for(uint8_t i = 0; i < 20; i++)
- {
- led = !led;
- wait(0.02);
- }
-
- wdt.init(1.0);
-
- while(1) {
-
- if(sw == 0)
- {
- while(1);
- }
-
- wdt.kick();
- led = !led;
- wait(0.5);
- }
- }
复制代码
如果我们不使用wdt.init(),而是使用wdt.attach()进行初始化,并指定中断函数,同时在中断函数中再次设置wdt.attach(),就可以让看门狗工作在定时器模式。在需要的时候,调用wdt.sleep()/wdt.deepSleep()/wdt.powerDown()就可以进入休眠,到设定时间后由wdt定时器唤醒。这三个sleep函数的区别在于功耗不同。注意使用wdt.sleep()等函数时,外部中断也会唤醒。
- #include "mbed.h"
- #include "wdt.h"
- DigitalOut led1(P0_18);
- DigitalOut led2(P0_19);
- InterruptIn sw(P0_1);
- Watchdog wdt;
- void wdt_isr()
- {
- wdt.attach(&wdt_isr, 1.0);
- led1 = !led1;
- }
- int main() {
- wdt.attach(&wdt_isr, 1.0);
-
- while(1) {
-
- wdt.sleep();
- //wdt.deepSleep();
- //wdt.powerDown();
- led2 = !led2;
-
- }
- }
复制代码
在上面的定时器模式中,如果在进入wdt中断后,不再次设置wdt定时器,就会停留在休眠模式,需要通过外部中断唤醒。
- #include "mbed.h"
- #include "wdt.h"
- DigitalOut led1(P0_18);
- DigitalOut led2(P0_28);
- InterruptIn sw(P0_1);
- Watchdog wdt;
- void sw_isr()
- {
- led1 = !led1;
- }
- void wdt_isr()
- {
- }
- int main() {
- sw.fall(&sw_isr);
-
- for(uint8_t i = 0; i < 20; i++)
- {
- led2 = !led2;
- wait(0.02);
- }
-
- wdt.attach(&wdt_isr, 1.0);
-
- while(1) {
-
- wdt.sleep();
- led2 = !led2;
-
- }
- }
复制代码
注:
- 使用wdt.deepSleep()和wdt.powerDown()后,就不能连接仿真器进行仿真和下载了,也不能使用mbed磁盘方式下载,只能通过flashmagic通过串口方式下载程序。使用新的程序退出wdt.deepSleep()和wdt.powerDown()后,才能继续使用仿真器。
完整的参考程序
|
|