OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 7940|回复: 23

原子窗口看门狗例程--理解求助

[复制链接]

12

主题

66

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
314
金钱
314
注册时间
2014-12-26
在线时间
28 小时
发表于 2015-10-6 17:17:59 | 显示全部楼层 |阅读模式
5金钱
[mw_shl_code=c,true]int main(void) { NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2 delay_init(168); //初始化延时函数 LED_Init(); //初始化LED端口 KEY_Init(); //初始化按键 LED0=0; //点亮LED0 delay_ms(300); WWDG_Init(0x7F,0X5F,WWDG_Prescaler_8); //计数器值为7f,窗口寄存器为5f,分频数为8 // while(1) // { // LED0=1; //熄灭LED灯 // } }[/mw_shl_code]
本人使用原子的探索者开发板
上面这个原子窗口看门狗例程中的main函数的内容,我发现led一直在闪烁。即使屏蔽掉while的死循环也是led在闪烁。
所以,我想问的是,难道说每次看门狗中断了都将程序复位了吗?还是?这个地方我想不太明白,求解答。

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

70

主题

6758

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
12995
金钱
12995
注册时间
2012-11-26
在线时间
3790 小时
发表于 2015-10-6 21:16:58 | 显示全部楼层
帮顶。。。。。。。。。。呵呵
学无止境
回复

使用道具 举报

12

主题

66

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
314
金钱
314
注册时间
2014-12-26
在线时间
28 小时
 楼主| 发表于 2015-10-6 22:53:32 | 显示全部楼层
回复【2楼】jermy_z:
---------------------------------
谢谢,辛苦了
回复

使用道具 举报

4

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2015-10-7
在线时间
3 小时
发表于 2015-10-7 14:14:46 | 显示全部楼层
你应该是前面的wwdg初始化的函数有错误吧,我也在看这里 相互学习,
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165377
金钱
165377
注册时间
2010-12-1
在线时间
2111 小时
发表于 2015-10-7 17:55:52 | 显示全部楼层
DS0还是DS1闪烁?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

12

主题

66

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
314
金钱
314
注册时间
2014-12-26
在线时间
28 小时
 楼主| 发表于 2015-10-7 18:33:19 | 显示全部楼层
回复【5楼】正点原子:
---------------------------------
如下是窗口看门狗的中断服务函数:
[mw_shl_code=c,true]//窗口看门狗中断服务程序 void WWDG_IRQHandler(void) { WWDG_SetCounter(WWDG_CNT); //重设窗口看门狗值 WWDG_ClearFlag();//清除提前唤醒中断标志位 LED1=!LED1; }[/mw_shl_code]

DS1闪烁。我想不太通是什么原因。

回复

使用道具 举报

2

主题

19

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2015-4-3
在线时间
0 小时
发表于 2015-10-7 22:56:43 | 显示全部楼层
1.你一直没有喂狗,导致看门狗复位;2看门狗中断之后你取反了LED,所以肯定闪烁。
看不开,那就闭上眼;
回复

使用道具 举报

12

主题

66

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
314
金钱
314
注册时间
2014-12-26
在线时间
28 小时
 楼主| 发表于 2015-10-8 12:35:19 | 显示全部楼层
回复【7楼】攻城狮:
---------------------------------
问题是中断服务函数中    WWDG_SetCounter(WWDG_CNT); 就喂狗了啊。
回复

使用道具 举报

13

主题

92

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1056
金钱
1056
注册时间
2015-5-12
在线时间
208 小时
发表于 2015-10-8 12:45:14 | 显示全部楼层
回复【8楼】huaiqiao:
---------------------------------
都已经溢出产生中断了,在喂狗有啥意义
回复

使用道具 举报

12

主题

66

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
314
金钱
314
注册时间
2014-12-26
在线时间
28 小时
 楼主| 发表于 2015-10-8 19:01:33 | 显示全部楼层
回复【9楼】numbqq:
---------------------------------
那么请问怎么喂狗,在哪里开始喂
回复

使用道具 举报

2

主题

19

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2015-4-3
在线时间
0 小时
发表于 2015-10-8 20:03:51 | 显示全部楼层
回复【8楼】huaiqiao:
---------------------------------
你都已经溢出出才喂狗有什么用,裸机跑一般在主程序喂狗。有些不能喂狗太频繁,有时间限制的,具体要看情况吧
看不开,那就闭上眼;
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165377
金钱
165377
注册时间
2010-12-1
在线时间
2111 小时
发表于 2015-10-8 22:23:11 | 显示全部楼层
我们例程,正常的实验效果,你验证出来了么?
能知道为什么么?

然后你屏蔽后,是什么效果?能表述明白一点不?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

12

主题

66

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
314
金钱
314
注册时间
2014-12-26
在线时间
28 小时
 楼主| 发表于 2015-10-9 00:25:59 | 显示全部楼层
回复【12楼】正点原子:
---------------------------------
恩恩,怪我没有描述清楚。是这样的,原子哥。
这个程序在下载到开发板上现象是
                                             1、 DS0(LED0红灯)熄灭,这个我可以理解;
                                             2、 DS1(LED1绿灯)闪烁,
于是,我将main函数中的while的死循环屏蔽掉,现象是:
                                             1、DS0(LED0红灯)点亮,这个不难理解;
                                             2、DS1(LED1绿灯)也在闪烁,
因为在main函数中,    WWDG_Init(0x7F,0X5F,WWDG_Prescaler_8)这个只有一次。而中断服务函数却一直在执行,所以我就有了楼主位的疑问:难道说每次看门狗中断了都将程序复位了吗?  这个地方想不太明白
回复

使用道具 举报

12

主题

66

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
314
金钱
314
注册时间
2014-12-26
在线时间
28 小时
 楼主| 发表于 2015-10-9 00:27:05 | 显示全部楼层
回复【11楼】攻城狮:
---------------------------------
您的意思是不能在中断服务函数中喂狗,在main函数中喂。可以这样理解吗?
回复

使用道具 举报

2

主题

19

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2015-4-3
在线时间
0 小时
发表于 2015-10-9 11:49:45 | 显示全部楼层
不是,中断函数可以喂狗,但是你是在看门狗溢出中断喂狗,既然看门狗都溢出复位了,你喂狗就没有意义啦
看不开,那就闭上眼;
回复

使用道具 举报

12

主题

66

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
314
金钱
314
注册时间
2014-12-26
在线时间
28 小时
 楼主| 发表于 2015-10-9 19:17:13 | 显示全部楼层
回复【15楼】攻城狮:
---------------------------------
“中断函数可以喂狗”,我有喂狗啊。
“既然看门狗都溢出复位了,你喂狗就没有意义啦”,怎么看是溢出了?
回复

使用道具 举报

2

主题

19

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2015-4-3
在线时间
0 小时
发表于 2015-10-9 21:17:01 | 显示全部楼层
不好意思,原来你是说窗口看门狗。那你要看看你设置的窗口值,我记得有上窗口和下窗口之分,下窗口时固定的,上窗口要自己设置并且要大于下窗口,喂狗的时间要早上窗口和下窗口之间。
看不开,那就闭上眼;
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165377
金钱
165377
注册时间
2010-12-1
在线时间
2111 小时
发表于 2015-10-9 22:17:37 | 显示全部楼层
回复【13楼】huaiqiao:
---------------------------------
无死循环的main函数,讨论无意义。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

12

主题

66

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
314
金钱
314
注册时间
2014-12-26
在线时间
28 小时
 楼主| 发表于 2015-10-9 23:12:13 | 显示全部楼层
回复【18楼】正点原子:
---------------------------------
哦,我把LED1 = !LED1 改成 LED1 =0.为什么DS1灯不亮呢? 
void WWDG_IRQHandler(void)
{
WWDG_SetCounter(WWDG_CNT); //重设窗口看门狗值
WWDG_ClearFlag();//清除提前唤醒中断标志位
LED1=0;
}
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165377
金钱
165377
注册时间
2010-12-1
在线时间
2111 小时
发表于 2015-10-10 13:25:01 | 显示全部楼层
回复【19楼】huaiqiao:
---------------------------------
这个应该会亮才对。
我找时间验证下吧。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

12

主题

66

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
314
金钱
314
注册时间
2014-12-26
在线时间
28 小时
 楼主| 发表于 2015-10-10 14:38:58 | 显示全部楼层
回复【20楼】正点原子:
---------------------------------
确实是不亮,所以我想是不是就如楼上所说的是不是喂狗的地方不对呀
回复

使用道具 举报

1

主题

4

帖子

0

精华

新手入门

积分
15
金钱
15
注册时间
2016-7-20
在线时间
1 小时
发表于 2016-7-20 15:08:22 | 显示全部楼层
本帖最后由 割风少年 于 2016-7-20 15:41 编辑

后面有while的死循环,没有意义吧。
回复

使用道具 举报

1

主题

4

帖子

0

精华

新手入门

积分
15
金钱
15
注册时间
2016-7-20
在线时间
1 小时
发表于 2016-7-20 15:38:58 | 显示全部楼层
本帖最后由 割风少年 于 2016-7-20 15:42 编辑

-------------
回复

使用道具 举报

5

主题

277

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1522
金钱
1522
注册时间
2014-5-16
在线时间
217 小时
发表于 2016-7-20 17:21:21 | 显示全部楼层
huaiqiao 发表于 2015-10-9 00:25
回复【12楼】正点原子:
---------------------------------
恩恩,怪我没有描述清楚。是这样的,原子哥。
...

按你的说法,就是不管在main函数中要不要那个while(1)的循环,LED1都会闪是吧?
正常情况下,LED1是会闪的,因为计数器减到0x40时会触发看门狗早期中断,就是你程序中的WWDG_IRQHandler,你有1个TICK的时间来响应中断并复位看门狗计数器
你把main中的while(1)去掉后,main函数会返回,之后有两种情况:
一是如果你重写了_sys_exit()函数,会调用你的_sys_exit函数,一般这个函数都是实现为while(1);的,这种情况下,早期看门狗中断依然可以响应,所以LED1会闪.
另一种情况就是没有重写_sys_exit,那么会调用C语言库的_sys_exit()函数,C库的实现上加了BKPT指令,当此指令被执行时,要么CPU停止,要么进HardFault_Handler,要么进DebugMon_Handler,总之,这种情况下,早期看门狗中断无法得到响应,将会产生复位.LED1也就不会闪了.
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-27 21:05

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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