一、独立看门狗

STM32 的独立看门狗由内部专门的 40Khz 低速时钟驱动,即使主时钟发生故障,它也仍然有效。

看门狗的原理:单片机系统在外界的干扰下会出现程序跑飞的现象导致出现死循环,看门狗电路就是为了避免这种情况的发生。看门狗的作用就是在一定时间内(通过定时计数器实现)没有接收喂狗信号(表示 MCU 已经挂了),便实现处理器的自动复位重启(发送复位信号) 。

在键值寄存器(IWDG_KR)中写入 0xCCCC,开始启用独立看门狗;此时计数器开始从其复位值 0xFFF 递减计数。当计数器计数到末尾 0x000 时,会产生一个复位信号(IWDG_RESET)。无论何时,只要键寄存器 IWDG_KR 中被写入 0xAAAA,  IWDG_RLR 中的值就会被重新加载到计数器中从而避免产生看门狗复位  。

IWDG_PR 和 IWDG_RLR 寄存器具有写保护功能。要修改这两个寄存器的值,必须先向IWDG_KR 寄存器中写入 0x5555。将其他值写入这个寄存器将会打乱操作顺序,寄存器将重新被保护。重装载操作(即写入 0xAAAA)也会启动写保护功能。

只要对以上三个寄存器进行相应的设置,我们就可以启动 STM32 的独立看门狗,启动过程可以按如下步骤实现(独立看门狗相关的库函数和定义分布在文件 stm32f10x_iwdg.h 和stm32f10x_iwdg.c 中) :

1)取消寄存器写保护(向 IWDG_KR 写入 0X5555)

通过这步,我们取消 IWDG_PR 和 IWDG_RLR 的写保护,使后面可以操作这两个寄存器,设置 IWDG_PR 和 IWDG_RLR 的值。这在库函数中的实现函数是:

IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);

2)设置独立看门狗的预分频系数和重装载值

设置看门狗的分频系数的函数是:

void IWDG_SetPrescaler(uint8_t IWDG_Prescaler);  //设置 IWDG 预分频值

设置看门狗的重装载值的函数是:

void IWDG_SetReload(uint16_t Reload); //设置 IWDG 重装载值

设置好看门狗的分频系数 prer 和重装载值就可以知道看门狗的喂狗时间 (也就是看门狗溢出时间) ,该时间的计算方式为:

Tout=((4×2^prer)  ×rlr) /40

其中 Tout 为看门狗溢出时间(单位为 ms) ;prer 为看门狗时钟预分频值(IWDG_PR 值),范围为 0~7;rlr 为看门狗的重装载值(IWDG_RLR 的值) ;

比如我们设定 prer 值为 4, rlr 值为 625,那么就可以得到 Tout=64×625/40=1000ms,这样,看门狗的溢出时间就是 1s,只要你在一秒钟之内,有一次写入 0XAAAA 到 IWDG_KR,就不会导致看门狗复位(当然写入多次也是可以的)。这里需要提醒大家的是,看门狗的时钟不是准确的 40Khz,所以在喂狗的时候,最好不要太晚了,否则,有可能发生看门狗复位。

3)重载计数值喂狗(向 IWDG_KR 写入 0XAAAA)

库函数里面重载计数值的函数是:

IWDG_ReloadCounter();   //按照 IWDG 重装载寄存器的值重装载 IWDG 计数器

通过这句,将使 STM32 重新加载 IWDG_RLR 的值到看门狗计数器里面。 即实现独立看门狗的喂狗操作。

4)  启动看门狗(向 IWDG_KR 写入 0XCCCC)

库函数里面启动独立看门狗的函数是:

IWDG_Enable();   //使能 IWDG

通过这句,来启动 STM32 的看门狗。注意 IWDG 在一旦启用,就不能再被关闭!想要关闭,只能重启,并且重启之后不能打开 IWDG,否则问题依旧,所以在这里提醒大家,如果不用 IWDG 的话,就不要去打开它,免得麻烦。

/*** 初始化独立看门狗* prer:分频数:0~7(只有低 3 位有效!)* 分频因子=4*2^prer.但最大值只能是 256!* rlr:重装载寄存器值:低 11 位有效.* 时间计算(大概):Tout=((4*2^prer)*rlr)/40 (ms).*/
void IWDG_Init(u8 prer,u16 rlr)
{IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); /* 使能对寄存器IWDG_PR和IWDG_RLR的写操作*/IWDG_SetPrescaler(prer);    /*设置IWDG预分频值:设置IWDG预分频值*/IWDG_SetReload(rlr);     /*设置IWDG重装载值*/IWDG_ReloadCounter();    /*按照IWDG重装载寄存器的值重装载IWDG计数器*/IWDG_Enable();        /*使能IWDG*/
}/*** 喂独立看门狗*/
void IWDG_Feed(void)
{IWDG_ReloadCounter();    /*reload*/
}/***main函数*/
void main(void)
{NVIC_Configuration();//优先级配置IWDG_Init(4,625);//初始化独立看门狗,分频数为64,重装载值为625,溢出时间计算为:64*625/40=1000ms=1swhile(1){delay_ms(500);//0.5秒喂一次狗IWDG_Feed();//喂狗}
}

二、窗口看门狗

窗口看门狗(WWDG)通常被用来监测由外部干扰或不可预见的逻辑条件造成的应用程序背离正常的运行序列而产生的软件故障。除非递减计数器的值在 T6 位 (WWDG->CR 的第六位)变成 0 前被刷新,看门狗电路在达到预置的时间周期时,会产生一个 MCU 复位。在递减计数器达到窗口配置寄存器(WWDG->CFR)数值之前,如果 7 位的递减计数器数值(在控制寄存器中)被刷新,   那么也将产生一个 MCU 复位。这表明递减计数器需要在一个有限的时间窗口中被刷新。

小总结:

1、有个7位递减计数器(WWDG->CR),就这个计数器和窗口计数器(WWDG->CFR)决定什么时候喂狗。狗喂早了,复位——“早”体现在 计数器值(tr)>窗口值(wr),也就是计数器值还没有减到窗口值以下;

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

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

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

库函数中用中断的方式来喂狗的方法,窗口看门狗库函数相关源码和定义分布在文件stm32f10x_wwdg.c 文件和头文件 stm32f10x_wwdg.h 中。步骤如下:

1)使能 WWDG 时钟

WWDG使用的是 PCLK1 的时钟,需要先使能时钟。方法是:

RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE);   // WWDG 时钟使能

2)设置窗口值和分频数

设置窗口值的函数是:

void WWDG_SetWindowValue(uint8_t WindowValue);

这个函数就一个入口参数为窗口值,很容易理解。

设置分频数的函数是:

void WWDG_SetPrescaler(uint32_t WWDG_Prescaler);

这个函数同样只有一个入口参数就是分频值。

3)开启 WWDG 中断并分组

开启 WWDG 中断的函数为:

WWDG_EnableIT(); //开启窗口看门狗中断

接下来是进行中断优先级配置,使用 NVIC_Init()函数即可。

4)设置计数器初始值并使能看门狗

这一步在库函数里面是通过一个函数实现的:

void WWDG_Enable(uint8_t Counter);

该函数既设置了计数器初始值,同时使能了窗口看门狗。

5)编写中断服务函数

在最后,还是要编写窗口看门狗的中断服务函数,通过该函数来喂狗,喂狗要快,否则当窗口看门狗计数器值减到 0X3F 的时候,就会引起软复位了。在中断服务函数里面也要将状态寄存器的 EWIF 位清空。

完成了以上 5 个步骤之后,我们就可以使用 STM32 的窗口看门狗了。

static u8 WWDG_CNT=0x7f;     /*保存WWDG计数器的设置值,默认为最大. *//*** 初始化窗口看门狗* 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_SetPrescaler(fprer); /*设置IWDG预分频值*/WWDG_SetWindowValue(wr);    /*设置窗口值*/WWDG_CNT=tr&WWDG_CNT; /* 初始化WWDG_CNT. */WWDG_Enable(WWDG_CNT);    /*使能看门狗 ,    设置 counter . */WWDG_ClearFlag();    /*清除提前唤醒中断标志位*/WWDG_NVIC_Init();/* 初始化窗口看门狗 NVIC */WWDG_EnableIT(); /* 开启窗口看门狗中断 */
}/*** 窗口看门狗中断服务程序*/
void WWDG_NVIC_Init(void)
{NVIC_InitTypeDef NVIC_InitStructure;NVIC_InitStructure.NVIC_IRQChannel = WWDG_IRQn;    /*WWDG中断*//* 抢占2,子优先级3 */NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;NVIC_Init(&NVIC_InitStructure);/*    NVIC初始化*/
}/*** 重设置WWDG计数器的值*/
void WWDG_Set_Counter(u8 cnt)
{WWDG_Enable(cnt); /*使能看门狗 ,    设置 counter .    */
}/*** 看门狗中断服务程序*/
void WWDG_IRQHandler(void)
{WWDG_Set_Counter(WWDG_CNT);WWDG_ClearFlag();    /*清除提前唤醒中断标志位*/LED1 = ~LED1;         /*LED状态翻转 */
}

小总结,一般工程都会使用两个看门狗,一个是独立看门狗,主要用于在代码跑飞之后复位使用,一个是窗口看门狗,主要用于在复位前对于一些重要数据进行保存。

参考来源:http://blog.chinaunix.net/uid-24219701-id-4088766.html

      http://blog.chinaunix.net/uid-24219701-id-4089265.html

STM32之独立看门狗与窗口看门狗总结相关推荐

  1. stm32 定时器_如何计算STM32定时器、独立看门狗和窗口看门狗

    点击上方蓝色字体,关注我们 本博文简要阐述STM32L011微控制器定时器的参数配置(其他型号大同小异,本文侧重讲解配置,至于各类定时器的特点后续再述),STM32定时器种类繁多有通用定时器.基本定时 ...

  2. stm32看门狗_STM32单片机:独立看门狗、窗口看门狗的配置

    SATM32单片机的看门狗有独立看门狗和窗口看门狗之分,这两者的工作原理却完全不同,今天来看一下他们的具体区别和配置方法.▍STM32独立看门狗由专门的低速时钟(LSI)驱动,即便是主时钟发生故障它仍 ...

  3. 如何计算STM32定时器、独立看门狗和窗口看门狗

    目录 1.基本.通用类型定时器 2.独立看门狗定时器 3.窗口看门狗定时器 之前分享了STM32 GPIO的原理.特性.选型和配置.如何计算RTC时钟异步预分频和同步预分频,这次简要阐述STM32L0 ...

  4. STM32中的独立看门狗和窗口看门狗

    STM32中的独立看门狗和窗口看门狗 在早期的MCU中是没有看门狗这种东西的,所以产品就很容易出现死机,跑飞的情况.为了避免这种情况的出现,后期的MCU都集成了看门狗的功能.但是,目前看门狗发展到今天 ...

  5. stm32 独立看门狗和窗口看门狗区别

    原文地址https://www.cnblogs.com/pertor/p/9483445.html 一.使用调条件 二.特点对比 三.手册介绍 [注]图中的WDGTB为3表示2^3=8,表示8分频,最 ...

  6. STM32—看门狗详解入门(独立看门狗、窗口看门狗)

    目录 一.什么是看门狗? 二.独立看门狗IWDG 1.特点.本质及原理 2.配置 3.main.c代码 三.窗口看门狗WWDG 1.特点.本质及原理 2.配置 3.main.c代码 四.独立看门狗与窗 ...

  7. 看门狗的喂法(独立看门狗和窗口看门狗的区别)!

    在嵌入式系统中,由于MCU(微控制单元:Microcontroller Unit)的工作常常会受到来自外界电磁场的干扰,造成程序的跑飞,而陷入死循环,程序的正常运行被打断,由单片机控制的系统无法继续工 ...

  8. MCU独立看门狗 vs 窗口看门狗

    关注+星标公众号,不错过精彩内容 素材来源 | STM32 微信公众号 | 嵌入式专栏 早期的MCU没有看门狗,就容易引起有些产品死机了不能重启工作.为了避免这个问题,后期的MCU在内部集成了看门狗的 ...

  9. 独立看门狗和窗口看门狗

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

最新文章

  1. python爬虫网络请求超时_6、web爬虫讲解2—urllib库爬虫—基础使用—超时设置—自动模拟http请求...
  2. Mouse Without Borders 一套鼠标键盘控制多台电脑
  3. RTD-D项目总结(MATLAB)
  4. python自动化_python自动化测试-Behave框架的用法介绍 - python测试学习
  5. C#LeetCode刷题之#202-快乐数(Happy Number)
  6. 一些SAP Partners能够通过二次开发实现打通C/4HANA和S/4HANA的方法介绍
  7. C# continue,break,return 跳转语句的用法
  8. centos7 运行 jar_CentOS7下部署开源网络流量回溯分析系统Moloch
  9. 十分钟教你使用NoteExpress
  10. 微信公众号如何上传html5,微信平台公众号怎么上传视频? 视频支持哪些格式
  11. 项目管理知识体系指南 PMBOK(第6版)十大知识领域思维导图(总览图)
  12. 问题 A: Jugs
  13. cesium 加载模型实现动画效果
  14. 【OpenBMC 系列】2.OpenBMC镜像编译流程
  15. 美国犹他大学计算机专业怎么样,犹他大学最热门专业,了解一下?
  16. 专业Java报表工具Stimulsoft Reports.Java常见问题解答
  17. 包含头文件使用 书名号与双引号的区别(直接打符号竟然发表不了,太难了)
  18. hexo博客搭建及其美化
  19. Failed to push the item(s)解决方法
  20. Python【数学工具集项目】专栏——介绍(作者:CSDN用户(TDTX、philo42))【2021-07-09】

热门文章

  1. Luogu_2774 方格取数问题
  2. Android攻城狮Gallery和ImageSwitcher制作图片浏览器
  3. 【linux】学习笔记
  4. C++ 是一门难学易用的语言!
  5. [转]Oracle update用例
  6. 查找xml文件中某接点的值
  7. PHP代码审计中你不知道的牛叉技术点
  8. [Android] 触屏setOnTouchListener实现图片缩放、移动、绘制和添加水印
  9. 【数据结构与算法】之深入解析“柱状图中最大的矩形”的求解思路与算法示例
  10. iOS逆向之深入解析MachO文件