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))喂狗;

 /*-- private variable --*/
__IO uint32_t space_reloadTM = ;//define every after 250 ms reload IWDG /*-- private function --*/
void NewDelay(__IO uint32_t nTime);//include reload IWDG static void IWDG_Config_Enable(void);//config and enable IWDG /*-- main function --*/
int main()
{
IWDG_Config_Enable(); //config and enable IWDG //for test
while ()
{
Delay1ms(); //timeout and reset happend /*-- never runs here --*/ //Reload IWDG counter
IWDG_ReloadCounter();
}
} void NewDelay(__IO uint32_t nTime)
{
uint32_t time_divisor = nTime/space_reloadTM;
uint32_t time_remainder = nTime%space_reloadTM;
uint8_t i; /* every after 250ms reload IWDG */
for(i=;i<time_divisor;i++)
{
Delay1ms(space_reloadTM);
//Reload IWDG counter
IWDG_ReloadCounter();
} /* delay the remain time */
Delay1ms(time_remainder);
//Reload IWDG counter
IWDG_ReloadCounter();
}
/*
void Delay1ms(__IO uint32_t nTime)
{
TimingDelay = nTime; while (TimingDelay != 0);
}
*/ /**
* @brief Configures the IWDG to generate a Reset if it is not refreshed at the
* correct time.
* @param None
* @retval None
*/
static void IWDG_Config_Enable(void)
{
/* Check if the system has resumed from IWDG reset */
if (RST_GetFlagStatus(RST_FLAG_IWDGF) != RESET)
{
printf("\n\r");
uart2str(uartbuff,RST->SR,,,''); //output RST register
printf("Timeout, RST_SR=%s\n\r",uartbuff); printf("timeout!!!"); /* IWDGF flag set */
/* Clear IWDGF Flag */
RST_ClearFlag(RST_FLAG_IWDGF);
}
else
{
//IWDGF flag is not set
} /* --- IWDG Configuration --- */ /* Enable IWDG (the LSI oscillator will be enabled by hardware) */
IWDG_Enable(); //0xCC /* IWDG timeout equal to 250 ms (the timeout may varies due to LSI frequency
dispersion) */
/* Enable write access to IWDG_PR and IWDG_RLR registers */
IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); //0x55 /* IWDG counter clock: LSI/128 */
IWDG_SetPrescaler(IWDG_Prescaler_128); /* Set counter reload value to obtain 250ms IWDG Timeout.
Counter Reload Value = 250ms/IWDG counter clock period
= 250ms / (LSI/128)
= 0.25s / (LsiFreq/128)
= LsiFreq/(128 * 4)
= LsiFreq/512
*/
IWDG_SetReload((uint8_t)(0xFF));//510ms /* Reload IWDG counter */
IWDG_ReloadCounter(); //0xAA
}

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. druid抛出的异常------javax.management.InstanceAlreadyExistsException引发的一系列探索

    最近项目中有个定时任务的需求,定时检查mysql数据与etcd数据的一致性,具体实现细节就不说了,今天要说的就是实现过程中遇到了druid抛出的异常,以及解决的过程 异常 异常详细信息 五月 05, ...

  2. Docker - 从零开始到操作

    从零开始 介绍Docker的基本概念和命令,并给出简单使用示例和参考信息. Docker - 基础讲义 http://www.cnblogs.com/anliven/p/6281373.html Do ...

  3. vlan内部与外部某终端之间的通信

    实现虚拟局域网外部终端与内部终端之间的通信,即实现pc3与pc1和pc4之间的通信. 把交换机上的默认VLAN1改成VLAN2(红色字体命令). 各vlan内部终端的通信,是通过vlan ID来实现的 ...

  4. Linux主机通过代理服务器进行网络连接

    公司的不允许访问外网,但是访问外网需要配置代理,window配置均好配置,在Linux的命令行底下,一般的程序都是使用http_proxy和ftp_proxy这两个环境变量来获得代理设置的.1.在/e ...

  5. Mac上面Mov转gif

    尝试了很多方法,后来发现这个网站转换的结果最好, http://ezgif.com/video-to-gif/

  6. 第 4 章 MySQL 安全管理

    前言 对于任何一个企业来说,其数据库系统中所保存数据的安全性无疑是非常重要的,尤其是公司的有些商业数据,可能数据就是公司的根本,失去了数据的安全性,可能就是失去了公司的一切.本章将针对 MySQL 的 ...

  7. SpringMVC中使用RedirectAttributes重定向传参,防止暴露参数

    RedirectAttributes是SpringMVC3.1版本之后出来的一个功能,专门用于重定向之后还能带参数跳转的. 当我从jsp页面函数中带参数到controller层方法,方法执行完毕后返回 ...

  8. 利用R语言进行交互数据可视化(转)

    上周在中国R语言大会北京会场上,给大家分享了如何利用R语言交互数据可视化.现场同学对这块内容颇有兴趣,故今天把一些常用的交互可视化的R包搬出来与大家分享. rCharts包 说起R语言的交互包,第一个 ...

  9. 未能加载文件或程序集Newtonsoft.Json, Version=4.5.0.0

    1.打开 程序管理器控制台  输入 PM> install-package newtonsoft.json 2.查看bin文件中是否有 newtonsoft.json.dll文件 3.在Web. ...

  10. iOS安全攻防之使用 Charles 进行网络数据抓包 和 Paros 网络抓包

    Charles 是 Mac 系统下常用的网路抓包工具(Paros 也不错),windows 下常用 fiddler.正版的 Charles 是收费的(PS:支持正版),天朝人民比较喜欢破解版的Char ...