IWDG工作原理:

1、当键值寄存器(IWDG_KR)中写入数值0xCC后,独立看门狗就会被启动,计数器开始从它的复位值0xFF开始递减计数,当计数减到0x00时就会产生一个复位信号。

2、使用IWDG_PR和IWDG_RLR寄存器配独立看门狗。

  (1)IWDG_PR寄存器是用于选择驱动计数器时钟的预分频系数。

  (2)当KEY_REFRESH的数值(0xAA)写入到IWDG_KR寄存器时,独立看门狗将用IWDG_RLR的数值刷新计数器的内容,从而避免了产生看门狗的复位。

3、IWDG_PR和IWDG_RLR寄存器具有写保护功能,要修改它们前,需首先在IWDG_KR寄存器写入KEY_ACCESS代码(0x55);在IWDG_KR写入0xAA将恢复写保护状态。

 IWDG工作细节:

1、为了避免程序忙跑跑死了没反应,加上一个看门狗watchdog实时监控着程序,一旦程序没有在规定的时间喂狗,则狗叫使得单片机复位。

2、Independent watchdog(IWDG)内部有时钟源(128kHz),所以即使主时钟挂了watchdog还是能继续工作的。

   另外还有个Window watchdog (WWDG),比IWDG复杂得多,我们没有采用。

3、由于内部是128kHz,所以watchdog能允许的最大延迟时间为510ms(当RL[7:0]= 0xFF时),最小延迟时间为2ms(当RL[7:0]= 0x00时);我们选取510ms。

  也就是说一旦打开看门狗,最迟每隔510ms就要进行喂狗操作,否则看门狗将会打开复位。

4、看门狗的实现不难,难点在于怎样验证自己设置的看门狗是否正确,难点在与想办法测试watchdog。

   方法是在while(1)的循环里延时510ms以上(如延时600ms),通过对相关寄存器特征值的显示查看,来判断单片机是否被复位,若被复位则验证成功。

5、值得注意的是,开门狗一旦打开就无法关闭,只有通过不断的喂狗来防止复位。

6、下面给出代码思路并且附带详细注释:

   由于延时函数如果延时太久会无法实现喂狗操作,所以应该在原来的Delay1ms()函数的基础上,再另外定义一个newDelay()函数,目的是每次延时250ms时(即调用Delay1ms(250))喂狗;

  1. /*-- private variable --*/
  2. __IO uint32_t space_reloadTM = ;//define every after 250 ms reload IWDG
  3.  
  4. /*-- private function --*/
  5. void NewDelay(__IO uint32_t nTime);//include reload IWDG
  6.  
  7. static void IWDG_Config_Enable(void);//config and enable IWDG
  8.  
  9. /*-- main function --*/
  10. int main()
  11. {
  12. IWDG_Config_Enable(); //config and enable IWDG
  13.  
  14. //for test
  15. while ()
  16. {
  17. Delay1ms(); //timeout and reset happend
  18.  
  19. /*-- never runs here --*/
  20.  
  21. //Reload IWDG counter
  22. IWDG_ReloadCounter();
  23. }
  24. }
  25.  
  26. void NewDelay(__IO uint32_t nTime)
  27. {
  28. uint32_t time_divisor = nTime/space_reloadTM;
  29. uint32_t time_remainder = nTime%space_reloadTM;
  30. uint8_t i;
  31.  
  32. /* every after 250ms reload IWDG */
  33. for(i=;i<time_divisor;i++)
  34. {
  35. Delay1ms(space_reloadTM);
  36. //Reload IWDG counter
  37. IWDG_ReloadCounter();
  38. }
  39.  
  40. /* delay the remain time */
  41. Delay1ms(time_remainder);
  42. //Reload IWDG counter
  43. IWDG_ReloadCounter();
  44. }
  45. /*
  46. void Delay1ms(__IO uint32_t nTime)
  47. {
  48. TimingDelay = nTime;
  49.  
  50. while (TimingDelay != 0);
  51. }
  52. */
  53.  
  54. /**
  55. * @brief Configures the IWDG to generate a Reset if it is not refreshed at the
  56. * correct time.
  57. * @param None
  58. * @retval None
  59. */
  60. static void IWDG_Config_Enable(void)
  61. {
  62. /* Check if the system has resumed from IWDG reset */
  63. if (RST_GetFlagStatus(RST_FLAG_IWDGF) != RESET)
  64. {
  65. printf("\n\r");
  66. uart2str(uartbuff,RST->SR,,,''); //output RST register
  67. printf("Timeout, RST_SR=%s\n\r",uartbuff);
  68.  
  69. printf("timeout!!!");
  70.  
  71. /* IWDGF flag set */
  72. /* Clear IWDGF Flag */
  73. RST_ClearFlag(RST_FLAG_IWDGF);
  74. }
  75. else
  76. {
  77. //IWDGF flag is not set
  78. }
  79.  
  80. /* --- IWDG Configuration --- */
  81.  
  82. /* Enable IWDG (the LSI oscillator will be enabled by hardware) */
  83. IWDG_Enable(); //0xCC
  84.  
  85. /* IWDG timeout equal to 250 ms (the timeout may varies due to LSI frequency
  86. dispersion) */
  87. /* Enable write access to IWDG_PR and IWDG_RLR registers */
  88. IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); //0x55
  89.  
  90. /* IWDG counter clock: LSI/128 */
  91. IWDG_SetPrescaler(IWDG_Prescaler_128);
  92.  
  93. /* Set counter reload value to obtain 250ms IWDG Timeout.
  94. Counter Reload Value = 250ms/IWDG counter clock period
  95. = 250ms / (LSI/128)
  96. = 0.25s / (LsiFreq/128)
  97. = LsiFreq/(128 * 4)
  98. = LsiFreq/512
  99. */
  100. IWDG_SetReload((uint8_t)(0xFF));//510ms
  101.  
  102. /* Reload IWDG counter */
  103. IWDG_ReloadCounter(); //0xAA
  104. }

watchdog

   为了验证代码的可实现性,故意在主函数中调用Delay1ms(600),所以正确的执行结果应该是:执行Delay1ms(600),watchdog启动复位,输出timeout之类的提示;

   其中证明是否是watchdog启动的复位:查看RST->SR(Reset status register)中Bit1的值,为1表示An IWDG reset occurred,为0表示No IWDG reset occurred。

watchdog(IWDG)的更多相关文章

  1. STM8S——watchdog(IWDG)

    IWDG工作原理: 1.当键值寄存器(IWDG_KR)中写入数值0xCC后,独立看门狗就会被启动,计数器开始从它的复位值0xFF开始递减计数,当计数减到0x00时就会产生一个复位信号. 2.使用IWD ...

  2. stm32之watchdog

    在嵌入式系统中,由于MCU的工作常常受到来自外界电磁场的干扰,造成程序的跑飞,而陷入死循环,程序的正常运行被打断,由单片机控制的系统无法继续工作,会造成整个系统陷入停滞状态,发送不可预料的后果,所以出 ...

  3. am335x watchdog 设备出错

    问题描述: am335x watchdog 设备节点打开失败. 如果是直接将omap_wdt 直接编译成uImage,这样会出现打开文件节点失败的情况. 如果单独编译成模块在后面文件系统内插入则不会. ...

  4. PIC32MZ tutorial -- Watchdog Timer

    Watchdog is a very necessary module for embedded system. Someone said that embedded system operates ...

  5. python watchdog

    监视文件变更 #!/usr/bin/python # -*- coding:UTF-8 -*- import time from watchdog.observers import Observer ...

  6. Watchdog

    一.简介 Watchdog主要用于监视系统的运行,Linux内核不仅为各种不同类型的watchdog硬件电路提供了驱动,还提供了一个基于定时器的纯软件watchdog驱动. 驱动源码位于内核源码树dr ...

  7. watchdog机制

    转自:http://blog.sina.com.cn/s/blog_4dff871201012yzh.html 什么是Watchdog? Watchdog,又称watchdog timer,是计算机可 ...

  8. Qt 控制watchdog app hacking

    /************************************************************************** * Qt 控制watchdog app hack ...

  9. android -- WatchDog看门狗分析

    在由单片机构成的微型计算机系统中,由于单片机的工作常常会受到来自外界电磁场的干扰,造成程序的跑飞,而陷入死循环,程序的正常运行被打断,由单片机控制的系统无法继续工作,会造成整个系统的陷入停滞状态,发生 ...

随机推荐

  1. IOS中常用的UIColor

    UIColor + (UIColor *)blackColor; // 0.0 white 黑色 + (UIColor *)darkGrayColor; // 0.333 white 深灰色 + (U ...

  2. 洛谷【P2393】题解

    P2393 [yyy loves Maths II] 原题链接 话说,这题其实方法对了,也蛮水的. 首先方法是一样的,直接扩大忽略精度问题. 其次,我用了c++的函数控制输出小数位数,方法:cout& ...

  3. LNMP源码编译安装

    思路:根据Linux系统以及公司网站系统的信息,选择合适的安装包进行安装 一.查看系统信息 # uname -a                        # 查看内核/操作系统/CPU信息 # ...

  4. JAVA中LOCK

    原文链接:http://www.cnblogs.com/dolphin0520/p/3923167.html 一.synchronized的缺陷 我们知道如果一个代码块被synchronized修饰了 ...

  5. Spring——Web应用中的IoC容器创建(WebApplicationContext根应用上下文的创建过程)

    基于Spring-4.3.7.RELEASE Spring的配置不仅仅局限在XML文件,同样也可以使用Java代码来配置.在这里我使用XML配置文件的方式来粗略地讲讲WebApplicationCon ...

  6. 高斯消元法(Gauss Elimination)【超详解&模板】

    高斯消元法,是线性代数中的一个算法,可用来求解线性方程组,并可以求出矩阵的秩,以及求出可逆方阵的逆矩阵.高斯消元法的原理是:若用初等行变换将增广矩阵 化为 ,则AX = B与CX = D是同解方程组. ...

  7. C#特性:从自定义一个特性开始,谈谈什么是特性

    作为C#新手中的一员,我刚开始接触特性时,那真是一脸冏逼啊,怎么想怎么查资料都没弄明白它到底是个什么东西,有的入门教程甚至都没讲特性和反射这些概念!相信很多人第一次接触到特性就是关于系列化的知识了. ...

  8. php回调函数的使用

    1.array_map — 将回调函数作用到给定数组的单元上 参数:array array_map ( callable $callback , array $arr1 [, array $... ] ...

  9. SmartCoder每日站立会议02

    1.站立会议内容 经过昨天一天的学习,大家了解到了很多新的知识,在各自任务实现方面也遇到了问题,比如首页的css样式实现.API接口的连接和地图接入的样式,经过今日站立会议,大家在一起讨论了各自出现的 ...

  10. 将数据的初始化放到docker中的整个工作过程(问题记录)

    将数据的初始化放到docker中的整个工作过程 由于是打算作为个人博客,所以对于install这个步骤,我从一开始就打算删掉的,前面一个多星期一直在修bug,到前天才开始做这个事情. 过程中也是碰到了 ...