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

watchdog

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

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

时间: 2024-08-20 12:08:49

watchdog(IWDG)的相关文章

基础入门_Python-模块和包.运维开发中watchdog事件监视的最佳实践?

简单介绍: 说明:  此模块是一个跨平台的PY库和SHELL工具,可以监视文件系统事件(增加/删除/修改) 快速安装: pip install --upgrade watchdog 日志记录: event_handler = LoggingEventHandler() -> event_handler 说明: 创建一个日志处理句柄,其实LoggingEventHandler是继承自FileSystemEventHandler类,只是重写了增删查改的回调函数,直接调用logging模块写到对应lo

Android中的软件Watchdog

由于Android的SystemServer内有一票重要Service,所以在进程内有一个软件实现的Watchdog机制,用于监视SystemServer中各Service是否正常工作.如果超过一定时间(默认30秒),就dump现场便于分析,再超时(默认60秒)就重启SystemServer保证系统可用性.同时logcat中会打印类似下面信息: W Watchdog: *** WATCHDOG KILLING SYSTEM PROCESS: Blocked in monitor com.andr

详解kernel中watchdog 驱动程序

watchdog无论在小系统还是大的工程系统中都是必须存在的,在解决线程挂死.系统死循环等都用很重要的应用,算是系统出问题恢复初始状态的救命稻草. 在kernel中wdt的应用不是很常见,原因就是相比于裸系统来讲,它的线程会出现一些异步的情况,运行状态容易出现系统不可控的时刻. 对于kernel中应用wdt而言,一般采用了一种通用方法,就是用一个timer进行喂狗操作. 以下选取一个典型的代码进行说明,就用 Atmel AT32AP700X device,在kernel->drivers->w

[虚拟化/云][全栈demo] 为qemu增加一个PCI的watchdog外设(八)

目的: 1. 通过网页读取watchdog的信息 2. 通过网页设置watchdog 准备工作: 1. 选择一个web框架,选用 cherrypy $ sudo apt-get install python-cherrypy3 2. 熟悉 RESTFUL , 参考redhat  REST API 指导 步骤: 我们选择了一个cherrypy作为web框架. cherrypy的部署简单. 这只是个demo,没有实现MVC,大家自己练习. 此外也没有实现模板,距离一个正式的网站还差的很远. 界面实现

具体解释kernel中watchdog 驱动程序

watchdog不管在小系统还是大的project系统中都是必须存在的.在解决线程挂死.系统死循环等都用非常重要的应用,算是系统出问题恢复初始状态的救命稻草. 在kernel中wdt的应用不是非经常见,原因就是相比于裸系统来讲.它的线程会出现一些异步的情况,执行状态easy出现系统不可控的时刻. 对于kernel中应用wdt而言,一般採用了一种通用方法.就是用一个timer进行喂狗操作. 下面选取一个典型的代码进行说明,就用 Atmel AT32AP700X device,在kernel->dr

Watchdog

一.简介 Watchdog主要用于监视系统的运行,Linux内核不仅为各种不同类型的watchdog硬件电路提供了驱动,还提供了一个基于定时器的纯软件watchdog驱动. 驱动源码位于内核源码树drivers\char\watchdog\目录下.   二.原理 内核 watchdog 模块通过 /dev/watchdog 这个字符设备与用户空间通信.用户空间程序一旦打开 /dev/watchdog 设备,就会导致在内核中启动一个 1分钟的定时器,此后,用户空间程序需要保证在 1分钟之内向这个设

树莓派启用看门狗watchdog

树莓派内核默认没有启用看门狗功能,当内核挂死时将进入"死机"状态或kgdb调试状态,并不会自动重启系统.本文为树莓派开启看门狗功能并通过内核线程周期性喂狗,当出现系统崩溃时会自动重启Linux系统. 环境说明:(1)单板:树莓派b (2)Linux内核:Linux-4.1.15 (3)Bootloader:u-boot-2015.10 源码文件:linux-rpi-4.1.y/drivers/watchdog/bcm2835_wdt.c 1.看门狗驱动源码分析 树莓派的看门狗驱动程序为

Linux 软件看门狗 watchdog —— 开门放狗、定期喂狗、狗咬人了

Linux 自带了一个 watchdog 的实现,用于监视系统的运行,包括一个内核 watchdog module 和一个用户空间的 watchdog 程序. 内核 watchdog 模块通过 /dev/watchdog 这个字符设备与用户空间通信.用户空间程序一旦打开 /dev/watchdog 设备(俗称“开门放狗”),就会导致在内核中启动一个1分钟的定时器(系统默认时间),此后,用户空间程序需要保证在1分钟之内向这个设备写入数据(俗称“定期喂狗”),每次写操作会导致重新设定定时器.如果用户

Adnroid Watchdog实现详解

本文基于Android4.4, 最近查了下watchdog打印错误log的问题.头都大...也查看了下android framework 下watchdog的实现代码,做个记录以备后边温习,以及新入行后辈们能够快速上手 以PowerManagerservice为例做简单流程分析 Watchdog功能: 1.      监视reboot广播 2.      监视加到check list 的service是否死锁 功能介绍: 功能1非常简单,就是注册一个broadcastreceiver,收到关机的