一、介绍:

STM32看门狗分为独立看门狗和窗口看门狗两种,其两者使用调条件如下所示,

IWDG和WWDG两者特点如下图所示:

独立看门狗的手册资料:

窗口看门狗的手册资料:

                应当注意:在窗口看门狗中,当递减计数器在窗口外被重新装载,(若看门狗被启动)则产生复位

【注】图中的WDGTB为3表示2^3=8,表示8分频,最小时间910us也等于每次计数器减一所需要经过的时间:T(LSB),每隔910us减1。最大值也等于,设置重载(喂狗)值127时(最大),一个复位周期的时间就是最大值58.25ms,也就是所能维持进入复位的最大时间。

由于窗口看门狗使用的APB1的PCLK1,时钟最高36MHZ,和RCC_APB2Periph_GPIOx不同,APB1最大就是36MHZ,APB2最大就是72MHZ。

所以串口看门狗需要配置APB1时钟使能,如下语句。

可以从图1-3 窗口看门狗编程说明红看到T(WWDG)=T(PCLK1) x 4096 x 2^WDGTB x (T[5:0]+1)  ; (ms)

WDGTB[1:0]: 时基 (Timer base),也就是设置WDGTB 的值是1/2/4还是8,这在配置寄存器(WWDG_CFR)寄存器的位8:7 中设置,

其预分频器的时基可以设置如下:

00: CK计时器时钟(PCLK1除以4096)除以1

01: CK计时器时钟(PCLK1除以4096)除以2

10: CK计时器时钟(PCLK1除以4096)除以4

11: CK计时器时钟(PCLK1除以4096)除以8

也可以直接用这个函数

  1. 1 WWDG_SetPrescaler(WWDG_Prescaler_8); //8预分频,则WWDG时钟频率=(PCK1(36M)/4096)/8=1099Hz(910us)

也可以直接用这个函数

其次是设置窗口值,用来与递减计数器进行比较用的窗口值。通过如下函数即可

  1. 1 WWDG_SetWindowValue(80);//设置窗口值为80则WWDG的计数值必须在64~80之间才能喂狗(64是0x40,当再次减1就会T6清零,从而导致复位了,即刷新窗口设置成了80-64,127-80也是不能更新值得否则也会复位)

应当注意:在窗口看门狗中,当递减计数器在窗口外被重新装载,(若看门狗被启动)则产生复位,也即是说在90-64外面使用这个重载函数,会有问题发生

最后我们设置 (T[5:0]+1)的值,这里我们设置最大127,代码如下,以后每次喂狗也可以用这个函数进行重载计数值(喂狗)。

  1. 1 WWDG_Enable(127)

因为这是会导致产生复位,所以重载的窗口一定要设置好。

总结就是我们使用串口看门狗应该先配置寄存器(WWDG_CFR),即配置窗口值是多少到最小的0x40*T(LSB)(假定T(LSB)为每减一计数所需要的时间),这个配置会告诉单片机什么时候来与递减计数器进行值比较,如果计数值值小于0x40就产生复位。

当然,本例中如果你在减减计数值还在0x7E~0x50(127~80)之间就重载计数值(喂狗)同样会导致芯片复位。所以窗口的概念一定要理解好,在窗内才可以重载计数值(喂狗),这样才不会莫名被复位。

 二、代码实现

最终的初始化窗口看门狗的配置函数(WWDG)如下:

  1. /*************************************************************
  2. Function : WWDGReste_Init
  3. Description: 窗口看门狗定时器
  4. Input : none
  5. return : none
  6. *************************************************************/
  7. void WWDGReste_Init(void)
  8. {
  9. RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE);//WWDG连接在PCLK1(36M)的时钟线上
  10.  
  11. WWDG_SetPrescaler(WWDG_Prescaler_8); //8预分频,则WWDG时钟频率=(PCK1(36M)/4096)/8=1099Hz(910us)
  12. WWDG_SetWindowValue(80);//设置窗口值为80则WWDG的计数值必须在64~80之间才能喂狗(64是0x40,当再次减1就会T6清零,从而导致复位了)
  13. //设置WWDG计数值为127,超时时间=910us*64=58.25ms,所以
  14. WWDG_Enable(127);//(0x7F为设置的最小值,0x40为最大的复位值,取值应该在0x40~0x7F之间)刷新窗口为:910us*(127-80)=42.77ms < 刷新窗口 < 910us*64=58.25ms
  15. }

主函数如下:

  1. void mian(void)
  2. {
  3. //初始化
  4. while(1)
  5. {
  6. delay_ms(400)
  7. WWDG_Enable(127);
  8.   //无需判断直接等待窗口看门狗中断触发
  9. }
  10. }

或者这样的留参带使能中断形式:

  1. #include "wdg.h"
  2. #include "stm32f10x_wwdg.h"
  3.  
  4. static u8 WWDG_CNT=0x7f; /*保存WWDG计数器的设置值,默认为最大127. */
  5.  
  6. //========================================================================================
  7. /**
  8. * 初始化窗口看门狗
  9. * tr :T[6:0],计数器值
  10. * wr :W[6:0],窗口值
  11. * fprer:分频系数(WDGTB),仅最低2位有效
  12. * Fwwdg=PCLK1/(4096*2^fprer).
  13. // 计数器值为7f,窗口寄存器为5f,分频数为8
  14. WWDG_Init(0X7F,0X5F,WWDG_Prescaler_8);
  15. */
  16. void WWDG_Init(u8 tr,u8 wr,u32 fprer)
  17. {
  18. RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE); /*WWDG时钟使能*/
  19. WWDG_SetPrescaler(fprer); /*设置IWDG预分频值*/
  20. WWDG_SetWindowValue(wr); /*设置窗口值*/
  21. WWDG_CNT=tr&WWDG_CNT; /* 初始化WWDG_CNT. */
  22. WWDG_Enable(WWDG_CNT); /*使能看门狗 , 设置 counter . */
  23. WWDG_ClearFlag(); /*清除提前唤醒中断标志位*/
  24. WWDG_NVIC_Init();/* 初始化窗口看门狗 NVIC */
  25. WWDG_EnableIT(); /* 开启窗口看门狗中断 */
  26. }
  27.  
  28. /**
  29. * 窗口看门狗中断服务程序
  30. */
  31. void WWDG_NVIC_Init(void)
  32. {
  33. NVIC_InitTypeDef NVIC_InitStructure;
  34. NVIC_InitStructure.NVIC_IRQChannel = WWDG_IRQn; /*WWDG中断*/
  35. /* 抢占2,子优先级3 */
  36. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
  37. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;      //中断使能,
  38. NVIC_Init(&NVIC_InitStructure);/* NVIC初始化*/
  39. }
  40.  
  41. /**
  42. * 重设置WWDG计数器的值,喂狗
  43. */
  44. void WWDG_Set_Counter(u8 cnt)
  45. {
  46. WWDG_Enable(cnt); /*使能看门狗 , 设置 counter . */
  47. }
  48.  
  49. /**
  50. * 看门狗中断服务程序
  51. */
  52. void WWDG_IRQHandler(void)
  53. {
  54. WWDG_Set_Counter(WWDG_CNT);
  55. WWDG_ClearFlag(); /*清除提前唤醒中断标志位*/
  56. LED1 = ~LED1; /*LED状态翻转 */
  57. }
  58.  
  59. void mian(void)
  60. {
  61. //初始化
  62. while(1)
  63. {
  64.  
  65. }
  66. }

三、中断说明:

关于void WWDG_IRQHandler(void)里的中断进入是在减计数到0x40时,处罚中断进入这个中断函数,如果在中断函数中进行减计数的操作,可以避免复位的厄运,但是如果你不做喂狗操作,那减计数值将接着减,数值将为0x3F,此时bit7被置零,此时将会直接导致复位。总之,进入中断函数并非就复位了,只是此时的减计数值到了0x40,而下一次减计数器减一后值为0x3F将导致芯片复位了。

附录:

独立看门狗(IWDG)的代码

  1. /**
  2. * 初始化独立看门狗
  3. * prer:分频数:0~7(只有低 3 位有效!)
  4. * 分频因子=4*2^prer.但最大值只能是 256!
  5. * rlr:重装载寄存器值:低 11 位有效.
  6. * 时间计算(大概):Tout=((4*2^prer)*rlr)/40 (ms).
  7. *IWDG_Init(4,625);//初始化独立看门狗,分频数为64,重装载值为625,溢出时间计算为:64*625/40=1000ms=1s
  8. */
  9. void IWDG_Init(u8 prer,u16 rlr)
  10. {
  11. IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); /* 使能对寄存器IWDG_PR和IWDG_RLR的写操作*/
  12. IWDG_SetPrescaler(prer); /*设置IWDG预分频值:设置IWDG预分频值*/
  13. IWDG_SetReload(rlr); /*设置IWDG重装载值*/
  14. IWDG_ReloadCounter(); /*按照IWDG重装载寄存器的值重装载IWDG计数器*/
  15. IWDG_Enable(); /*使能IWDG*/
  16. }
  17.  
  18. /**
  19. * 喂独立看门狗
  20. */
  21. void IWDG_Feed(void)
  22. {
  23. IWDG_ReloadCounter(); /*reload*/
  24. }
  25.  
  26. /**
  27. *main函数
  28. */
  29. void main(void)
  30. {
  31. NVIC_Configuration();//优先级配置
  32. IWDG_Init(4,625);//初始化独立看门狗,分频数为64,重装载值为625,溢出时间计算为:64*625/40=1000ms=1s
  33.  while(1)
  34.   {
  35.     delay_ms(500);//0.5秒喂一次狗
  36.   IWDG_Feed();//喂狗
  37.   }
  38. }

STM32窗口看门狗和独立看门狗的区别,看门狗介绍及代码演示的更多相关文章

  1. STM32之看门狗(独立与窗口)

    广大的互联网网友们,大家早上中午晚上好,我是某某某..对于狗..看过<忠犬八公>的我.无不深深的被狗的义气与灵气所震撼..我也觉得在所有mcu中用看门狗来形容让系统复位的功能是很恰当的.也 ...

  2. stm32 窗口看门狗学习(一)

    什么是窗口看门狗? 1)独立看门狗                限制喂狗时间在0-x内,x由相关寄存器决定.喂狗的时间不能过晚. 2)窗口看门狗               之所以称为窗口就是因为其 ...

  3. stm32 窗口看门狗学习(二)

    窗口看门狗有一个提前唤醒中断,如果开启这个中断,那么当计数器的值达到0x40的时候就会产生这个中断. 上次的代码加一点就可以做这个实验了. void WWDG_Init(u8 tr,u8 wr,u32 ...

  4. [看门狗]基于Linux的嵌入式系统全程喂狗策略

    转自:http://blog.csdn.net/erickhuang1989/article/details/8721548 在嵌入式系统中,为了使系统在异常情况下能自动恢复,一般都会引入看门狗电路. ...

  5. 转载:STM32之中断与事件---中断与事件的区别

    这张图是一条外部中断线或外部事件线的示意图,图中信号线上划有一条斜线,旁边标志19字样的注释,表示这样的线路共有19套.图中的蓝色虚线箭头,标出了外部中断信号的传输路径,首先外部信号从编号1的芯片管脚 ...

  6. STM32之中断与事件---中断与事件的区别

    STM32之中断与事件---中断与事件的区别  http://blog.csdn.net/flydream0/article/details/8208463 这张图是一条外部中断线或外部事件线的示意图 ...

  7. STM32F0xx_看门狗(独立+窗口)配置详细过程

    Ⅰ.概述 对于看门狗,我觉得做单片机或者嵌入式开发的人员来说并不陌生,今天总结STM32F0看门狗的功能,F0的看门狗有两种:独立和窗口看门狗. 今天提供两种看门狗的软件工程实例,供大家下载. 两种看 ...

  8. stm32 窗口看门狗 WWDG

    窗口看门狗WWDG其实和独立看门狗类似,它是一个7位递减计数器不断的往下递减计数,当减到一个固定值0x40时还不喂狗的话,产生一个MCU复位,这个值叫窗口的下限,是固定的值,不能改变 窗口看门狗(WW ...

  9. STM32窗口看门狗WWDG库函数的一点思考

    WWDG当前计数器的值以及激活位和WWDG_CR这个寄存器相关.如下图所示: 而STM32f10x的库函数提供了两种设置WWDG_CR[0:6]位的方式. WWDG_SetCounter方法 #def ...

随机推荐

  1. 【bzoj1196】[HNOI2006]公路修建问题

    二分答案 验证有一种贪心的思想,就是如果这条路的c1比二分的值还小,那就要果断选择一级公路. 搜过一遍后,如果可供选择的一级公路小于k,就可以直接返回否了. 接下来继续选择,如果可以选到n-1条路,就 ...

  2. 一些SQL高级函数

    一些SQL高级函数 Posted on 2010-08-08 21:34 moss_tan_jun 阅读(311) 评论(0) 编辑 收藏 长度与分析用 datalength(Char_expr) 返 ...

  3. C#窗体间传值的简便方法/工具

    一.问题:窗体间传值必须需要窗体之间有联系,具体有如下方式 窗体间传值涉及到窗体A必须拥有窗体B,这样才可以实现A-B之间传值 窗体A与窗体B在窗体/实例C中,A-B可互相通讯 其他方式,不细讨论,复 ...

  4. Magnetic Storms

    http://acm.timus.ru/problem.aspx?space=1&num=1126 简单的线段树求区间最值 #include <stdio.h> #include ...

  5. codevs1225八数码难题(搜索·)

    1225 八数码难题  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond 题解       题目描述 Description Yours和zero在研究A*启 ...

  6. Gym - 100920E 2010-2011 OpenCup IX Onsite, II Yandex Summer School E.Paint 状压DP

    题面 题意:给你n(20)个点,m(40条边),让你给每条边染一种颜色,白色0元,红色2元,蓝色1元,现在要保证每一条白边相邻的有一条红边,问至少花多少 题解:刚开始想的时候,好像觉得只用染红色和白色 ...

  7. idea 内测设置

    找到安装目录/bin/idea64.exe.vmoptions文件 下面是默认配置 -Xms128m -Xmx750m -XX:ReservedCodeCacheSize=240m -XX:+UseC ...

  8. wxwidgets安装环境配置

    一:安装VS2012 wxWidgets-2.9.5( 2.95版本为最稳定版本) 二:打开wxWidgets-2.9.5的安装目录,找到build-msw-wx_vc10.sln打开(等待) 三:打 ...

  9. 313 Super Ugly Number 超级丑数

    编写一段程序来寻找第 n 个超级丑数.超级丑数是指其所有质因数都在长度为k的质数列表primes中的正整数.例如,[1, 2, 4, 7, 8, 13, 14, 16, 19, 26, 28, 32] ...

  10. MVC系列学习(五)-传递数据 与 接收数据

    1.控制器向视图传递数据 a.使用ViewData b.使用ViewBag c.使用Model 方式二: d.使用TempData 2.为什么在控制器中设置了一些属性,在视图中可以接受 3.Actio ...