【stm32f407】窗口看门狗 wwdog

2019-11-07来源: eefocus关键字:stm32f407  窗口看门狗  wwdog

一.窗口看门狗


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

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))/Fpclk1;


其中:


Twwdg:WWDG超时时间(单位为ms)


Fpclk1:APB1的时钟频率(单位为Khz)


WDGTB:WWDG的预分频系数


T[5:0]:窗口看门狗的计数器低6位


根据上面的公式,假设Fpclk1=42Mhz,那么可以得到最小-最大超时时间表如图所示:

接下来,我们介绍窗口看门狗的3个寄存器。首先介绍控制寄存器(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频率为42M且WDGTB为0的条件下,该时间为97.52us)内重新写WWDG_CR,否则,看门狗将产生复位!


最后我们要介绍的是状态寄存器(WWDG_SR),该寄存器用来记录当前是否有提前唤醒的标志。该寄存器仅有位0有效,其他都是保留位。当计数器值达到40h时,此位由硬件置1。它必须通过软件写0来清除。对此位写1无效。即使中断未被使能,在计数器的值达到0X40的时候,此位也会被置1,窗口看门狗库函数相关源码和定义分布在文件stm32f4xx_wwdg.c文件和头文件stm32f4xx_wwdg.h中


二.窗口看门狗应用


1)使能WWDG时钟


WWDG不同于IWDG,IWDG 有自己独立的32Khz时钟,不存在使能问题。而WWDG使用的是PCLK1的时钟,需要先使能时钟。方法是:


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


2)设置窗口值和分频数


设置窗口值的函数是:


voidWWDG_SetWindowValue(uint8_t WindowValue);


这个函数就一个入口参数为窗口值,很容易理解。设置分频数的函数是:


voidWWDG_SetPrescaler(uint32_t WWDG_Prescaler);


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


3)开启WWDG中断并分组


开启WWDG中断的函数为:


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


接下来是进行中断优先级配置,这里就不重复了,使用NVIC_Init()函数即可。


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


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


voidWWDG_Enable(uint8_t Counter);


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


这里还需要说明一下,库函数还提供了一个独立的设置计数器值的函数为:


voidWWDG_SetCounter(uint8_t Counter);


5)编写中断服务函数


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


三.窗口看门狗源码


Wwdog.h


#ifndef_WWDOG_H_H_H

#define_WWDOG_H_H_H

#include"stm32f4xx_wwdg.h"

 

voidWWDG_Init(u8 tr,u8 wr,u32 fprer);

voidWWDG_IRQHandler(void);

#endif

Wwdog.c


#include"wwdog.h"

#include"led.h"

 

//保存WWDG计数器的设置值,默认为最大. 

u8WWDG_CNT=0X7F;

voidWWDG_Init(u8 tr,u8 wr,u32 fprer)

{

  NVIC_InitTypeDef NVIC_InitStructure;

 RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG,ENABLE); //使能窗口看门狗时钟

       

  WWDG_CNT=tr&WWDG_CNT;   //初始化WWDG_CNT. 

  WWDG_SetPrescaler(fprer); //设置分频值

  WWDG_SetWindowValue(wr); //设置窗口值

//WWDG_SetCounter(WWDG_CNT);//设置计数值

  WWDG_Enable(WWDG_CNT);  //开启看门狗

       

 NVIC_InitStructure.NVIC_IRQChannel=WWDG_IRQn;  //窗口看门狗中断

 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x02;  //抢占优先级为2

 NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x03;                                  //子优先级为3

 NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;  //使能窗口看门狗

  NVIC_Init(&NVIC_InitStructure);

       

  WWDG_ClearFlag();//清除提前唤醒中断标志位

  WWDG_EnableIT();//开启提前唤醒中断

}

//窗口看门狗中断服务程序 

voidWWDG_IRQHandler(void)

{

  static int count = 0;

  WWDG_SetCounter(WWDG_CNT); //重设窗口看门狗值

  WWDG_ClearFlag();//清除提前唤醒中断标志位

  if(count++ % 2 == 0)

  {

    LED_Operate(LED_RED,LED_ON);

  }

  else

  {

    LED_Operate(LED_RED,LED_OFF);

  }

}

Main.c


#include"led.h"

#include"key.h"

#include"delay.h"

#include"uart.h"

#include"exit.h"

#include"iwdog.h"

voidUser_Delay(__IO uint32_t nCount)

{

  while(nCount--)

  {

  }

}

staticint count = 0;

intmain(void)

{

 

#if 1

 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2

  delay_init(168);  //初始化延时函数

  LED_Init();                        //初始化LED端口

  KEY_Init();                //初始化按键

  LED_Operate(LED_BLUE,LED_ON);                 //点亮LED0

  delay_ms(300);

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

       

  while(1)

  {

    LED_Operate(LED_BLUE,LED_OFF);

  }

#endif

   

}

关键字:stm32f407  窗口看门狗  wwdog 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic479272.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:STM8S103之独立看门狗和窗口看门狗
下一篇:STM8关于IWDG看门狗和HSI高速时钟和复位的坑

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

stm32f103 c6t6 CAN总线的配置
KEIl5 环境下 中文显示复制过来有问题又懒得打字
发表于 2019-11-13
stm32f103 c6t6 CAN总线的配置
STM8L051F3_01_GPIO应用
本章介绍STM8L051F3的GPIO相关知识。内容分为以下几部分:GPIO简介点亮LED1、GPIO简介GPIO:通用输入/输出口,用于芯片与外部进行数据传输;STM8L051F3的一个I/O端口最多可以有8个Pins(引脚),每个引脚可以独立地配置为数字输入或数字输出。此外,一些I/O端口可能有一些复用功能如模拟输入、外部中断、片上外设的输入输出等,一个引脚不能同时使用多种复用功能。每个I/O端口都分配有一个输出数据寄存器、输入数据寄存器、数据方向寄存器、两个配置寄存器,一个I/O端口工作在输入或输出状态取决于数据方向寄存器。STM8L051F3的GPIO主要性能如下:端口的位(引脚)能独立配置可选择的输入模式:浮空输入
发表于 2019-11-13
STM32F0x2 IWDG(独立看门狗)
单片机系统在外界的干扰下会出现程序跑飞的现象导致出现死循环,看门狗电路就是为了避免这种情况的发生。看门狗的作用就是在一定时间内(通过定时计数器实现)没有接收喂狗信号(表示 MCU 已经挂了),便实现处理器的自动复位重启(发送复位信号)。 以下为stm32f042单片机独立看门狗相关代码:/***********************************************************函数描述:初始化独立看门狗,timeout为1s*函数:void IWDG_Init(unsigned char usb_sw) *参数:无*作者:*日期
发表于 2019-11-12
STM32F1小白系列之四、独立看门狗(IWDG)
:T(ms) == [(4 * 2^pre_Scaler) * reload] / 40;    IWDG_ReloadCounter();//第一次喂狗    IWDG_Enable();//使能看门狗}//喂狗APIvoid feed_iwdg(void){    IWDG_ReloadCounter();//喂狗,使STM32重新加载【IWDG_RLR中的值】到【看门狗计数器里面】。}2、直接配置寄存器/*    函数功能:初始化独立看门狗    函数名:init_iwdg    返回值:void 
发表于 2019-11-12
stm32f0 hal adc配置
Clock Prescaler:和系统时钟同步并且二分频Sampling Time :采样时间,采样时间是你通过寄存器告诉STM32采样模拟量的时间,设置越长越精确
发表于 2019-11-11
stm32f0 hal adc配置
STM32F0xx_看门狗(独立+窗口)配置详细过程
Ⅰ、概述对于看门狗,我觉得做单片机或者嵌入式开发的人员来说并不陌生,今天总结STM32F0看门狗的功能,F0的看门狗有两种:独立和窗口看门狗。今天提供两种看门狗的软件工程实例,供大家下载。两种看门狗各有各的特点,应用在不同的场合,下面将分别简单总结一下独立和窗口看门狗的功能。Ⅱ、下载文章提供的“软件工程”都是在硬件板子上进行多次测试、并保证没问题才上传至360云盘,请放心下载测试,如有问题请检查一下你的板子是否有问题。ST标准外设库和参考手册、数据手册等都可以在ST官网下载,你也可以到我的360云盘下载。关于F0系列芯片的参考手册有多个版本(针对F0不同芯片),但有一个通用版本,就是“STM32F0x128参考手册V8(英文
发表于 2019-11-08
STM32F0xx_看门狗(独立+窗口)配置详细过程
小广播
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2019 EEWORLD.com.cn, Inc. All rights reserved