WWDG

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

图 12.1.1 中,T[6:0]就是 WWDG_CR 的低七位,W[6:0]即是 WWDG->CFR 的低七位。T[6:0]就是窗口看门狗的计数器,而 W[6:0]则是窗口看门狗的上窗口,下窗口值是固定的(0X40)。当窗口看门狗的计数器在上窗口值之外被刷新,或者低于下窗口值都会产生复位。上窗口值(W[6:0])是由用户自己设定的,根据实际要求来设计窗口值,但是一定要确保窗口值大于 0X40,否则窗口就不存在了。
窗口看门狗的超时公式如下:

Twwdg=(4096×2^WDGTB×(T[5:0]+1))/Tpclk1;

其中:
Twwdg:WWDG 超时时间(单位为 ms) Tpclk1:APB1 的时钟频率(单位为 Khz)
WDGTB:WWDG 的预分频系数
T[5:0]:窗口看门狗的计数器低 6 位

控制寄存器(WWDG_CR)


可以看出,这里我们的 WWDG_CR 只有低八位有效,T[6:0]用来存储看门狗的计数器值,随时更新的,每个窗口看门狗计数周期(4096×2^ WDGTB)减 1。当该计数器的值从 0X40 变 为 0X3F 的时候,将产生看门狗复位。WDGA 位则是看门狗的激活位,该位由软件置 1,以启动看门狗,并且一定要注意的是该位一旦设置,就只能在硬件复位后才能清零了。

配置寄存器(WWDG_CFR)


该位中的 EWI 是提前唤醒中断,也就是在快要产生复位的前一段时间(T[6:0]=0X40)来
提醒我们,需要进行喂狗了,否则将复位!因此,我们一般用该位来设置中断,当窗口看门狗的计数器值减到 0X40 的时候,如果该位设置,并开启了中断,则会产生中断,我们可以在中断里面向 WWDG_CR 重新写入计数器的值,来达到喂狗的目的。注意这里在进入中断后,必 须在不大于 1 个窗口看门狗计数周期的时间(在 PCLK1 频率为 36M 且 WDGTB 为 0 的条件下,该时间为 113us)内重新写 WWDG_CR,否则,看门狗将产生复位!

状态寄存器(WWDG_SR)

该寄存器用来记录当前是否有提前唤醒的标志。该寄存器仅有位 0 有效,其他都是保留位。当计数器值达到 40h 时,此位由硬件置 1。它必须通过软件写 0 来清除。对此位写 1 无效。即使中断未被使能,在计数器的值达到 0X40的时候,此位也会被置 1

介绍要如何启用 STM32 的窗口看门狗。这里我们介绍库函数中用中断的方式来喂狗的方法:
1)使能 WWDG 时钟
WWDG 不同于 IWDG,IWDG 有自己独立的 40Khz 时钟,不存在使能问题。而 WWDG使用的是 PCLK1 的时钟,需要先使能时钟。方法是:

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

2)设置窗口值和分频数
设置窗口值的函数是:

void WWDG_SetWindowValue(uint8_t WindowValue);

这个函数的入口参数 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 位清空。


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

STM32学习笔记——窗口看门狗WWDG介绍及配置相关推荐

  1. STM32学习笔记:独立看门狗和窗口看门狗

    STM32的独立看门狗是由内部专门的40Khz低速时钟驱动,即使主时钟发生故障,但它仍然有效. 看门狗原理:单片机系统在外界干扰情况下会出现程序跑飞的现象会导致出现死循环,看门狗电路在一定时间内如果没 ...

  2. STM32学习笔记—独立看门狗

    1.独立看门狗的介绍 2.独立看门狗的使用 3.代码段 1.独立看门狗的介绍 独立看门狗利用系统内部的低速时钟提供机械周期,这个低速时钟与系统的工作时钟不是一个时钟,所以看门狗的运行和系统的运行是互不 ...

  3. STM32学习笔记——通用定时器的PWM介绍及配置

    脉冲宽度调制(PWM),是英文"Pulse Width Modulation"的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术.简单一点,就是 ...

  4. STM32—窗口看门狗(WWDG)

    STM32-窗口看门狗(WWDG) 窗口看门狗(WWDG) STM32-窗口看门狗(WWDG) 窗口看门狗(WWDG) WWDG 简介 WWDG 功能框图剖析 窗口看门狗时钟 计数器时钟 计数器 窗口 ...

  5. STM32 HAL库窗口看门狗

    STM32 HAL库窗口看门狗 1.窗口看门狗基本原理 2.独立看门狗与串口看门狗区别 3.应用场合 4.窗口看门狗的时钟 5.窗口看门狗寄存器: ①.看门狗控制寄存器(WWDG_CR) 2.配置寄存 ...

  6. 【STM32】窗口看门狗 WWDG 实验代码详解

    文章目录 main.c wwdg.c wwdg.h main.c #include "led.h" #include "delay.h" #include &q ...

  7. S32K144学习笔记:23 看门狗

    23.1 片上看门狗规格 23.1.1 看门狗时钟 看门狗模块有以下几个可选的时钟源     •内部低功耗振荡器(LPO_CLK)     •内部低速IRC时钟(SIRC)     •系统振荡器时钟( ...

  8. 窗口看门狗 WWDG

    一,窗口看门狗 二,喂狗注意事项 三,程序设计 1.检查复位状态,有助于观察当前工作的可靠性 /* Check if the system has resumed from WWDG reset ,检 ...

  9. STC51单片机学习笔记1——看门狗程序测试

    测试STC单片机看门狗功能,代码如下: #include <reg52.h> sfr WDT_CONTR =0xE1; //声明WDT_CONTR void delay(void){uns ...

最新文章

  1. 6.QT信号槽的时序分析
  2. 算法----------找到 K 个最接近的元素
  3. [BZOJ1007](HNOI2008)水平可见直线(半平面交习题)
  4. python 循环指定次数_亮仔的Python之路Day7——Python循环语句
  5. 小姐姐写真网站源码自带点数据
  6. webpack 的webpack.config文件配置css-loader,style-loader注意的问题
  7. php怎么初始化融云sdk,初始化融云 SDK
  8. p1007无线打印服务器,把你的打印机共享出来:Hardlink 固网 打印服务器HP-1007
  9. C 语言判断某年是否为闰年该月有多少天
  10. 这四个才是真正的低代码平台
  11. 群聊消息“已读”/“未读” 功能解决方案!
  12. Linux环境下——C语言聊天室项目
  13. 【FNN分类】基于粒子群结合引力搜索算法优化前向反馈神经网络实现数据分类附matlab代码
  14. Java基础系列(三十):局部内部类
  15. ajax提交文件对象----form组件+form表单+FormData对象
  16. Android横向滚动卡片,Android仿探探卡片式滑动效果实现
  17. Oracle 实例恢复--转自沙弥的世界
  18. hust 1546 hdu 3911 Black And White
  19. Linux系统安装时报错,Linux安装软件时报错解决方法
  20. 沃尔玛将与乐天Kobo合开首家电子书商店,挑战亚马逊

热门文章

  1. MoveNet-谷歌轻量级人体姿态估计算法
  2. Android动画技术分析
  3. 三、Socket测试示例
  4. ubuntu 16.04 通过手机蓝牙上网
  5. 本周游戏一点想法:模拟真实格斗
  6. nohup和作用详解
  7. 中国社会科学院大学(研究生院) 教育部认可中英教学 免联考双证在职读研
  8. python如何爬取文献_这个工具,可全网爬取科研圈中外文献!
  9. 扬帆牧哲:怎样开网店创业?
  10. 计算机的三级储存管理系统不包括,第三章 存储系统