简介:

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

看门狗是一个定时器电路,一般有一个输入,叫喂狗。一个输出到mcu正常工作时候,每隔一段时间输出一个信号到喂狗端,给WDT清零,如果规定超过时间不喂狗,一般程序跑飞,WDT定是超出,就会给一个复位信号到mcu,使mcu复位,防止mcu死机。看门狗的作用就是防止程序发生死循环,或者程序跑飞,对单片机进行状态进行实时监测的考虑。

库函数中用中断的方式来喂狗的方法,窗口看门狗库函数相关源码和定义分布在文件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状态翻转 */
}

 调用:WWDG_Init(0X7F,0X5F,WWDG_Prescaler_8);/* 计数器值为 7f,窗口寄存器为 5f,分频数为 8 */ 

STM32(10)——窗口看门狗的更多相关文章

  1. STM32之窗口看门狗

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

  2. STM32之独立看门狗与窗口看门狗总结

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

  3. STM32之独立看门狗(IWDG)与窗口看门狗(WWDG)总结

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

  4. STM32窗口看门狗和独立看门狗的区别,看门狗介绍及代码演示

    一.介绍: STM32看门狗分为独立看门狗和窗口看门狗两种,其两者使用调条件如下所示, IWDG和WWDG两者特点如下图所示: 独立看门狗的手册资料: 窗口看门狗的手册资料:             ...

  5. stm32 窗口看门狗学习(二)

    窗口看门狗有一个提前唤醒中断,如果开启这个中断,那么当计数器的值达到0x40的时候就会产生这个中断. 上次的代码加一点就可以做这个实验了. void WWDG_Init(u8 tr,u8 wr,u32 ...

  6. stm32 窗口看门狗学习(一)

    什么是窗口看门狗? 1)独立看门狗                限制喂狗时间在0-x内,x由相关寄存器决定.喂狗的时间不能过晚. 2)窗口看门狗               之所以称为窗口就是因为其 ...

  7. 嵌入式02 STM32 实验09 独立/窗口看门狗

    一.独立看门狗和窗口看门狗 看门狗:单片机系统在外界的干扰下会出现程序跑飞的现象导致死循环,或者崩溃,看门狗电路就是为了避免这种情况的发生,看门狗的作用就是在一定的事件内(通过计数器实现)若没有收到喂 ...

  8. stm32 窗口看门狗 WWDG

    窗口看门狗WWDG其实和独立看门狗类似,它是一个7位递减计数器不断的往下递减计数,当减到一个固定值0x40时还不喂狗的话,产生一个MCU复位,这个值叫窗口的下限,是固定的值,不能改变 窗口看门狗(WW ...

  9. STM32窗口看门狗WWDG库函数的一点思考

    WWDG当前计数器的值以及激活位和WWDG_CR这个寄存器相关.如下图所示: 而STM32f10x的库函数提供了两种设置WWDG_CR[0:6]位的方式. WWDG_SetCounter方法 #def ...

随机推荐

  1. Useful WCF Behaviors - IErrorHandler

    Behaviors in WCF are so stinking useful, and once you get past the basics of WCF they're arguably a ...

  2. Linux内核收包过程

    net/core/dev.c int __init net_dev_init(void) { queue->backlog.poll = process_backlog; open_softir ...

  3. July 02nd 2017 Week 27th Sunday

    No safe wading in an unknown water. 未知水深浅,涉水有危险. Is this the theory that has been the guideline for ...

  4. vbox安装 ubuntu server 后 安装增强包

    用vbox安装虚拟机系统如果不装增强包, 有很多东西就有点不好用-用vbox安装ubuntu server时,点击菜单中的安装增强功能.因为ubuntu server版本没有ui,所以不能很方便滴找到 ...

  5. codeforces 848B Rooter's Song

    题目链接 正解:排序+模拟. 我们注意到两个点碰撞的必要条件,$pi+tj=pj+ti$,移项以后发现就是$pi-ti=pj-tj$,那么我们可以把$p-t$相同的点分为同一组. 然后我们还可以发现一 ...

  6. EmailMessage类

    EmailMessage类 EmailMessage类 实例化有以下参数,注:以下所有参数都是可选的并且可以在send()方法之前任意时间设置. subject: email的主题 body: 主体内 ...

  7. UVa 1635 - Irrelevant Elements(二项式系数 + 唯一分解定理)

    链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  8. PHP使用in_array函数检查数组中是否存在某个值

    PHP使用 in_array() 函数检查数组中是否存在某个值,如果存在则返回 TRUE ,否则返回 FALSE. bool in_array( mixed needle, array array [ ...

  9. 我的第一个C++程序

    准备抽空学习C++了,不知道自己以后能不能坚持下去,去百度查了一下入门,大多数朋友都是选择用VC++或者VS,而我这里用的是C-Free 5 ,安装包也只有十几兆. 用起来也方便.对于初学者而言够用了 ...

  10. Objective-C——消息、Category和Protocol

    转自:http://www.cnblogs.com/chijianqiang/archive/2012/06/22/objc-category-protocol.html 面向对象永远是个可以吐槽的话 ...