OpenEdv-开源电子网

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

STM32窗口看门狗的总结,请各位指正,谢谢!

[复制链接]

8

主题

56

帖子

0

精华

初级会员

Rank: 2

积分
108
金钱
108
注册时间
2012-12-17
在线时间
0 小时
发表于 2013-3-21 19:36:00 | 显示全部楼层 |阅读模式
题外话:本人感觉今年比去年“蛋定”了,做事更沉稳,学习更踏实(从去年开始就把考试成绩看的不重要了),不是为了学习而学习,而且做事更负责任了。再接再厉。
前几天学习STM32的两条狗,先学习了宠物狗(IWDG),和其它MCU差不多,不多说了。学到警犬(WWDG)的时候,问题来了,没有IWDG那么好理解了,看了半天没有搞懂是怎么回事,计数器值、窗口值、在什么时候喂狗、什么时候产生中断等等,一头雾水。

经过两天的推敲,个人理解如下:

1、有个7位递减计数器(WWDG->CR),就这个计数器和窗口计数器(WWDG->CFR)决定什么时候喂狗。

     狗喂早了,复位——“早”体现在 计数器值(tr)>窗口值(wr),也就是计数器值还没有减到窗口值以下;

2、当 0x40 < 计数器值(tr) < 窗口值(wr) 时,这时候最适合喂狗了,也只有在这时候喂狗才合适;

3、当 计数器的值 从0x40变到0x3F的时候,将产生看门狗复位;当然在要产生复位的前一段时间,如果开启了提前唤醒中断,那么就会进入中断,在中断函数里,我们需要及时喂狗,否则会产生复位;

4、据网上资料介绍,在这个中断里面一般不进行喂狗,一般是系统去世前的“遗嘱”,比如存储重要的数据等。这个就需要根据个人需要设计。

下面择取部分程序,可以根据程序说明,计算出喂狗的时间,大家注意推敲,欢迎交流!

/* 保存WWDG计数器的设置值,默认为最大值 */
u8 WWDG_CNT = 0x7F;

/*
 * 初始化窗口看门狗
 * tr    : T[6:0], 计数器值
 * wr    : W[6:0], 窗口值
 * fprer : 分频系数(WDGTB), 仅最低2位有效
 * Fwwdg = PCLK1 / (4096*2^fprer)
 */
void WWDG_Init(u8 tr, u8 wr, u32 fprer)

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE);    // WWDG时钟使能
   
    WWDG_CNT = tr & WWDG_CNT;   // 初始化WWDG_CNT
   
    /* 看门狗节拍=(36MHz(PCLK1)/4096)/8 = 1098Hz */
    /* 也就是说1秒钟计数器减1098下 */
    /* 周期 T=1/1098 s = 0.91ms */
    WWDG_SetPrescaler(fprer);   // 设置IWDG预分频值
   
    /* 窗口值用wr , 就是说计数器满是0x7F, 在减到wr之前喂狗了就算喂早了--会复位 */
    /* wr值一定要大于0x40, 否则窗口值就不存在了, 因为计数器从 0x40减到0x3F会产生看门狗复位 */
    WWDG_SetWindowValue(wr);    // 设置窗口值
   
    /* 看门狗使能, 并初始化定时器为0x7F 计数器减到0x3F时(T6位清零), 则产生一个复位*/
    WWDG_Enable(WWDG_CNT);      // 使能看门狗, 设置 counter
   
    WWDG_ClearFlag();           // 清除提前唤醒中断标志位
   
    WWDG_NVIC_Init();           // 初始化窗口看门狗 NVIC
   
    /* 使能EW interrupt  这个在计数器减到0x40的时候产生一个"死前"中断,
     * 当然也可以在这个中断里赶紧喂狗, 省得狗咬你(复位) */
    WWDG_EnableIT();            // 开启窗口看门狗中断
}

/* WWDG 中断服务函数 */
/*
 * 一般来说,这个"死前"中断里面不应该喂狗的,
 * 而是应该做系统临死前的一些工作, 例如保存重要数据之类的
 */
void WWDG_IRQHandler(void)
{    
    WWDG_ClearFlag();           // 清除提前唤醒中断标志位
   
    LED1 = !LED1;               // LED1 状态翻转
    printf("进入中断!\r\n");
}

int main(void)
{
    u8 tr, wr;
   
    delay_init();
    NVIC_Configuration();   // 设置NVIC中断分组2:2位抢占优先级, 2位响应优

先级
    LED_Init();
    KEY_Init();
    uart_init(9600);
   
    LED0 = 0;
    delay_ms(300);
   
    WWDG_Init(0x7F, 0x5F, WWDG_Prescaler_8);    // 计数器值为7f, 窗口寄存器值为5f, 分频数为8
   
    while(1)
    {
        LED0 = 1;
       
        wr=WWDG->CFR&0X7F;      // 窗口值
        tr=WWDG->CR&0X7F;       // 计数器值


        /* 注意tr和wr的比较,确定喂狗时间 */
        if(tr<wr)   // 计数器值tr必须小于窗口值wr时才能喂狗,在之前喂狗则太早,会产生看门狗复位
        {
            WWDG_SetCounter(WWDG_CNT);
            printf("正在喂狗!\r\n");
        }
       
       
    }
   
}

实践出真知!
试验现象:DS0(红灯)先亮,再灭,DS1无变化。
试验现象说明:在规定的时间段及时的喂狗了,程序没有进入中断函数。


同时,希望各位通过签名中的链接进入我的新浪博客交流,谢谢。

个人博客:http://blog.sina.com.cn/u/2539869495
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2014-1-2
在线时间
0 小时
发表于 2014-1-2 10:11:59 | 显示全部楼层
回复【16楼】正点原子:
---------------------------------
STM32F的窗口看门狗中有一个7位的递减计数器,它会在出现下述2种情况之一时产生看门狗复位:
1)当计数器的数值从0x40减到0x3F时
2)当刷新看门狗时计数器的数值大于某一设定数值时,此设定数值在WWDG_CFR寄存器定义

对于一般的看门狗,程序可以在它产生复位前的任意时刻刷新看门狗,但这有一个隐患,有可能程序跑乱了又跑回到正常的地方,或跑乱的程序正好执行了刷新看门狗操作,这样的情况下一般的看门狗就检测不出来了;如果使用窗口看门狗,程序员可以根据程序正常执行的时间设置刷新看门狗的一个时间窗口,保证不会提前刷新看门狗也不会滞后刷新看门狗,这样可以检测出程序没有按照正常的路径运行非正常地跳过了某些程序段的情况。







--------------------------------------------------------------------------------





WWDG与IWDG的主要区别是有一个窗口控制,WWDG的中断是给你最后一次喂狗的机会,通常这个中断不是让你执行喂狗操作的;一般进到这个中断时表示你在其它地方安排的喂狗操作不能奏效,而发生这种现象时,肯定是系统有问题了,或者是程序有Bug,或者是碰到了干扰,在这种情况下,这个中断是为了让你的程序在发生真正的看门狗复位前,有一个紧急处理的机会,如保存重要的数据,或做系统刹车等操作。



由此看出,简单地在WWDG中断喂狗,既没有发挥WWDG相对于IWDG的优势,又因为在中断中喂狗而为以后的产品留下了隐患。
回复 支持 1 反对 0

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2013-3-21 21:40:48 | 显示全部楼层
谢谢分享。
回复 支持 反对

使用道具 举报

8

主题

56

帖子

0

精华

初级会员

Rank: 2

积分
108
金钱
108
注册时间
2012-12-17
在线时间
0 小时
 楼主| 发表于 2013-3-21 22:06:07 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
谢谢原子哥的支持。
个人博客:http://blog.sina.com.cn/u/2539869495
回复 支持 反对

使用道具 举报

8

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
69
金钱
69
注册时间
2013-4-11
在线时间
0 小时
发表于 2013-4-19 16:47:58 | 显示全部楼层
很感谢楼主分享
回复 支持 反对

使用道具 举报

11

主题

57

帖子

0

精华

初级会员

Rank: 2

积分
121
金钱
121
注册时间
2013-4-5
在线时间
0 小时
发表于 2013-4-19 23:07:29 | 显示全部楼层
谢谢分享,,,,,
回复 支持 反对

使用道具 举报

6

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
76
金钱
76
注册时间
2013-5-13
在线时间
0 小时
发表于 2013-5-26 20:41:44 | 显示全部楼层
楼主讲得挺好滴!!顶!!
回复 支持 反对

使用道具 举报

96

主题

762

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1228
金钱
1228
注册时间
2012-10-19
在线时间
15 小时
发表于 2013-5-27 13:57:04 | 显示全部楼层
在这个中断里面一般不进行喂狗,一般是系统去世前的“遗嘱”。我懂了,怪不得这看门狗有个中断。
回复 支持 反对

使用道具 举报

2

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
142
金钱
142
注册时间
2013-5-24
在线时间
9 小时
发表于 2013-5-31 17:40:22 | 显示全部楼层
回复【7楼】tian123chi:
---------------------------------
我也懂了,开始非常不理解这个中断,在中断里喂狗起不到监测程序的运行嘛,就算程序进入死循环了还是能喂狗,没法复位。谢谢楼主分享,膜拜ing
回复 支持 反对

使用道具 举报

5

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
83
金钱
83
注册时间
2013-6-22
在线时间
3 小时
发表于 2013-6-25 15:27:57 | 显示全部楼层

谁给讲讲两只看门狗啊,这样不同的喂狗机制,各自的作用及好处是什么啊?

千磨万击还坚劲,任尔东西南北风
回复 支持 反对

使用道具 举报

17

主题

466

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
2164
金钱
2164
注册时间
2013-1-11
在线时间
510 小时
发表于 2013-6-25 22:05:20 | 显示全部楼层
讲得挺好的
回复 支持 反对

使用道具 举报

13

主题

314

帖子

0

精华

高级会员

Rank: 4

积分
713
金钱
713
注册时间
2012-7-20
在线时间
102 小时
发表于 2013-6-26 00:02:28 | 显示全部楼层
感谢分享
回复 支持 反对

使用道具 举报

1

主题

2

帖子

0

精华

新手入门

积分
26
金钱
26
注册时间
2013-7-12
在线时间
0 小时
发表于 2013-7-16 10:16:58 | 显示全部楼层
感谢楼主。我也是学习了两天才把这个窗口看门狗搞懂的。
回复 支持 反对

使用道具 举报

1

主题

40

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
449
金钱
449
注册时间
2013-5-22
在线时间
80 小时
发表于 2013-9-26 17:10:47 | 显示全部楼层
回复【楼主位】Stone_up:
---------------------------------
楼主,看了你的总结,受益匪浅,能否加个QQ请教一下呢?或者我留我的QQ号吧,2426203566,非常感谢。
回复 支持 反对

使用道具 举报

8

主题

56

帖子

0

精华

初级会员

Rank: 2

积分
108
金钱
108
注册时间
2012-12-17
在线时间
0 小时
 楼主| 发表于 2013-10-2 17:21:55 | 显示全部楼层
回复【13楼】freedomcain:
---------------------------------
不好意思,QQ很少上,有问题直接提出来,大家讨论吧。
个人博客:http://blog.sina.com.cn/u/2539869495
回复 支持 反对

使用道具 举报

15

主题

61

帖子

0

精华

初级会员

Rank: 2

积分
178
金钱
178
注册时间
2011-9-16
在线时间
8 小时
发表于 2013-10-16 16:42:58 | 显示全部楼层
看了论坛里关于WWDG的帖子,发现使用WWDG的有两种情况。一种像原子书上的应用,开启提前唤醒中断,在中断函数里比较窗口值和计数值去喂狗。一种是楼主在主函数里比较,就去喂狗,中断里什么也不做,只是提示系统要复位。
我现在要利用看门狗来保证系统死机后能复位,利用哪种好呢?
我的理解是这样的:只有第二种可以实现。第一种只是每次计数值到达0x40时触发中断,满足计数值小于窗口值去喂狗,忽然系统死机,计数器的值还在减,但是还会触发中断给喂狗,给不出系统死机的提示。第二种就可以,一旦死机,计数器值仍能减,只有这种条件才会触发中断,平时在主函数里都在不停地喂狗。不知道我理解的对不对~~请楼主指点
还有,我在犹豫到底用独立看门狗还是窗口看门狗实现死机复位功能?!楼主怎么看
你不努力,谁都会看不起你!
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2013-10-16 18:29:36 | 显示全部楼层
回复【15楼】fengcq126:
---------------------------------
系统死机了,就不大可能还能执行你的中断程序。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2014-1-2 14:35:06 | 显示全部楼层
回复【17楼】qinfengbin:
---------------------------------
谢谢指教.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

13

主题

105

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
16874
金钱
16874
注册时间
2012-10-20
在线时间
48 小时
发表于 2014-8-13 13:53:42 | 显示全部楼层
回复【17楼】qinfengbin:
---------------------------------
确实是啊
回复 支持 反对

使用道具 举报

5

主题

49

帖子

0

精华

初级会员

Rank: 2

积分
179
金钱
179
注册时间
2014-8-29
在线时间
11 小时
发表于 2014-10-4 20:08:01 | 显示全部楼层
所以写程序的时候,一般是用两只狗吗?宠物狗进行复位,警犬进行写遗嘱!
【另外好喜欢楼主蓝色字的比如,太好理解了】
有深圳的大牛带我飞吗?
回复 支持 反对

使用道具 举报

5

主题

49

帖子

0

精华

初级会员

Rank: 2

积分
179
金钱
179
注册时间
2014-8-29
在线时间
11 小时
发表于 2014-10-4 20:36:14 | 显示全部楼层
根据第四点,不在中断里面喂狗,那么应该在那个地方喂狗啊???
有深圳的大牛带我飞吗?
回复 支持 反对

使用道具 举报

1

主题

215

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
254
金钱
254
注册时间
2013-9-23
在线时间
4 小时
发表于 2015-2-10 17:12:56 | 显示全部楼层
请问一般使用是用独立看门狗还是窗口看门狗
回复 支持 反对

使用道具 举报

6

主题

51

帖子

0

精华

高级会员

Rank: 4

积分
588
金钱
588
注册时间
2014-10-10
在线时间
125 小时
发表于 2015-3-18 19:36:02 | 显示全部楼层
非常   感谢分享
怀念什么?
回复 支持 反对

使用道具 举报

28

主题

303

帖子

0

精华

高级会员

Rank: 4

积分
541
金钱
541
注册时间
2014-8-14
在线时间
67 小时
发表于 2015-4-5 22:20:08 | 显示全部楼层
感谢分享  mark
这个世界上还有很多很多的人,但你不认识他们,他们也不属于你的世界。这个世界上还有很多好吃的好玩的好看的东西,可真正属于你的世界其实是很小的,只是你去过的地方吃过的东西和见过的落日,还有会在乎你死活的朋友。”——《龙族》
回复 支持 反对

使用道具 举报

2

主题

34

帖子

0

精华

初级会员

Rank: 2

积分
118
金钱
118
注册时间
2014-2-18
在线时间
12 小时
发表于 2015-6-18 17:14:01 | 显示全部楼层
谢谢·好东西。
回复 支持 反对

使用道具 举报

2

主题

50

帖子

0

精华

初级会员

Rank: 2

积分
114
金钱
114
注册时间
2015-5-24
在线时间
9 小时
发表于 2015-7-22 19:54:12 | 显示全部楼层
LZ讲得好,我刚学到这个窗口看门狗也是一脸茫然
回复 支持 反对

使用道具 举报

0

主题

9

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2015-7-20
在线时间
4 小时
发表于 2015-9-3 00:39:06 | 显示全部楼层
回复【21楼】放狼的爷们:
---------------------------------
你好 请问你知道答案了吗
年轻不要吧钱看的太重要。
回复 支持 反对

使用道具 举报

1

主题

19

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
228
金钱
228
注册时间
2015-9-17
在线时间
37 小时
发表于 2015-10-9 10:57:17 | 显示全部楼层
楼主和16楼好赞啊!舔舔舔。。。。。。
对于楼主的程序中有点不明白,有看到我的问题的大神顺便教教我啊。。。
void WWDG_Init(u8 tr, u8 wr, u32 fprer)

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE);    // WWDG时钟使能
   
    WWDG_CNT = tr & WWDG_CNT;   // 初始化WWDG_CNT
   
    /* 看门狗节拍=(36MHz(PCLK1)/4096)/8 = 1098Hz */
    /* 也就是说1秒钟计数器减1098下 */
    /* 周期 T=1/1098 s = 0.91ms */
    WWDG_SetPrescaler(fprer);   // 设置IWDG预分频值

------------------------------------------------
问题看门狗节拍=(36MHz(PCLK1)/4096)/8 = 1098Hz     对于这个解释不明白:36Mhz/4096是为了什么?是进制转换把单位变成hz?
那要是进制转换的话不是1Mhz=1000 000hz吗?不是应给除以1000 000吗?。。。。好乱啊。。。。
很高兴同大家交流学习STM32的专业知识!
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
21
金钱
21
注册时间
2015-12-3
在线时间
0 小时
发表于 2015-12-3 11:13:52 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
窗口看门狗中,在主函数如果把while(1)死循环注释掉,看门狗是不是复位了?
回复 支持 反对

使用道具 举报

3

主题

130

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
373
金钱
373
注册时间
2015-3-7
在线时间
43 小时
发表于 2015-12-3 17:00:36 | 显示全部楼层
回复【29楼】最爱巧克莉:
---------------------------------
窗口看门狗的复位跟死循环没关系。
复位的条件有两个
1.T[6]的递减计数值 大于 W[6]的时候喂狗会复位
2.T[6]的递减计数值 小于 0x3F的时候
以上这两个会产生复位。
详细的看下中文数据手册,321页,图159.这个比文字直观点。
为人莫作千年计,三十河东四十西,莫欺少年穷。
回复 支持 反对

使用道具 举报

20

主题

143

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2015-8-28
在线时间
108 小时
发表于 2016-3-24 16:33:50 | 显示全部楼层
感谢楼主无私分享
回复 支持 反对

使用道具 举报

0

主题

4

帖子

0

精华

初级会员

Rank: 2

积分
55
金钱
55
注册时间
2016-2-27
在线时间
6 小时
发表于 2016-4-5 13:33:54 | 显示全部楼层
学习到了赞赞

回复 支持 反对

使用道具 举报

9

主题

93

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
253
金钱
253
注册时间
2016-5-4
在线时间
58 小时
发表于 2016-5-6 00:14:26 | 显示全部楼层
哈哈,最后一句话说得挺不错,一般在提前唤醒中断不喂狗,而是保存重要数据,我觉得这个挺不错的
回复 支持 反对

使用道具 举报

2

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
76
金钱
76
注册时间
2016-7-25
在线时间
8 小时
发表于 2016-7-26 16:53:37 | 显示全部楼层
楼主讲的真好,迷茫一天瞬间懂了窗口看门狗的使用方法和功能了,谢谢分享!
回复 支持 反对

使用道具 举报

11

主题

56

帖子

0

精华

初级会员

Rank: 2

积分
109
金钱
109
注册时间
2016-4-30
在线时间
44 小时
发表于 2016-10-26 14:32:16 | 显示全部楼层
MARK下
回复 支持 反对

使用道具 举报

0

主题

4

帖子

0

精华

初级会员

Rank: 2

积分
62
金钱
62
注册时间
2016-3-30
在线时间
21 小时
发表于 2016-11-1 10:54:49 | 显示全部楼层
谢谢分享,mark一下
回复 支持 反对

使用道具 举报

2

主题

8

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2020-2-13
在线时间
27 小时
发表于 2020-2-20 20:24:49 | 显示全部楼层
你好楼主,请问下。经验算,例中的窗口看门狗喂狗时间为:63*8*4096/36M  ,约为58ms,简化为50ms。也就是每隔50ms,LED灯状态翻转1次,每隔100ms,闪烁一次。那么问题来了,为什么原子哥的开发手册上写每秒闪烁5次是正常的?不应该是每秒10次正常吗?
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-20 20:57

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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