【stm32f407】窗口看门狗 wwdog

发布者:吉州古玩斋最新更新时间:2019-02-12 来源: 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 引用地址:【stm32f407】窗口看门狗 wwdog

上一篇:【stm32f407】ADC实验
下一篇:【stm32f407】独立看门狗 iwdog

推荐阅读最新更新时间:2024-03-16 16:23

stm32F407之USART6的DMA工作方式
昨天调试了USART6的DMA工作模式,今天补发上这篇笔记。 力求简洁,stm32的DMA就不介绍了,不了解的可以搜索一下。这里重点介绍一下DMA的外设地址如何确定,这个是网上很少涉及但是很重要的一块,如果不清楚如何确定外设寄存器地址就无法进行DMA功能,这里以stm32F407的USART6为例介绍,参考手册为 RM0090 Reference manual 。 在进行DMA参数配置时有这样一项 DMA_InitStructure.DMA_PeripheralBaseAddr = ?;这句是要确定Memory与Peripheral数据传输时的外设数据地址,因为这里我们用到的是USART6从Memory的数组中取出数据并发送给上位
[单片机]
<font color='red'>stm32F407</font>之USART6的DMA工作方式
STM32F407用wk2124芯片编写SPI转四路串口驱动
引言 因为项目用到了wk2124芯片来进行串口扩展,网上找了好多资料没有现成的,根据商家提供的demo,它是基于103写的,所以根据自己板子的实际情况进行了改写,并且学习一下里面的主要函数及我对函数的理解 原理图 用到5个引脚,片选CS、时钟SCK、MOSI、MISO和中断IRQ,因为RST设置的是板子连电后电容充电,所以会自动复位,不用这个引脚。 一. SPI通信配置 1.GPIO初始化设置 GPIO_InitTypeDef GPIO_InitStructure; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);//使能GPIOB时钟 RCC_APB
[单片机]
<font color='red'>STM32F407</font>用wk2124芯片编写SPI转四路串口驱动
STM32F407 Flash操作笔记
简述 STM32F4XX的闪存擦除方式分为两种:扇区擦除(最小单元16K)和整片擦除。在实际应用中,为满足重要信息的存储,需将信息存入FLASH中,针对以上两种擦除方式,扇区擦除更符合实际的需要。 参考手册: 写FLASH操作 经过以上五个步,就可以擦除某个扇区。但是实际运用过程中,一个扇区只存储一个信息或标志,会造成资源严重浪费。现采用缓存的方式,先读取当下扇区的数据,将读取的数据和要写入的数据组合,待擦除后再次写入。 代码片 写FLASH操作 /* * WriteAddr: 起始地址 (u32)address 是 4 的整数倍, (u32)data * pBuffer: 数据指针
[单片机]
<font color='red'>STM32F407</font> Flash操作笔记
stm32f407discovery 的keil 4.60ST-linkII不能用解决方法
1 、用资源中的STLink文件替换 C:\Keil\ARM\STLink, 记得备份原来的文件, 2、C:\Keil\TOOLS.INI改成如下的 ORGANIZATION= cs2c NAME= jianzhong , cui EMAIL= cjzswust@gmail.com ARMSEL=1 BOOK0=UV4\RELEASE_NOTES.HTM( uVision Release Notes ) PATH= C:\Keil\ARM VERSION=4.60 PATH1= C:\Program Files\arm-none-eabi-gcc-4_6\ TOOLPR
[单片机]
stm32f407discovery 的keil 4.60ST-linkII不能用解决方法
STM32窗口看门狗程序
简介:窗口看门狗(WWDG)通常被用来监测由外部干扰或不可预见的逻辑条件造成的应用程序背离正常的运行序列而产生的软件故障。除非递减计数器的值在T6位(WWDG- CR的第六位)变成0前被刷新,看门狗电路在达到预置的时间周期时,会产生一个MCU复位。 在递减计数器达到窗口配置寄存器(WWDG- CFR)数值之前,如果7位的递减计数器数值(在控制寄存器中)被刷新, 那么也将产生一个MCU复位。这表明递减计数器需要在一个有限的时间窗口中被刷新。 图 3.6.1.1中,T 就是WWDG_CR的低七位,W 即是WWDG- CFR的低七位。T 就是窗口看门狗的计数器,而W 则是窗口看门狗的上窗口,下窗口值是固定的(0X40)。当窗口看
[单片机]
STM32<font color='red'>窗口</font><font color='red'>看门狗</font>程序
接触STM32F407芯片的总结
今天开始弄了一下STM32F4的板子,板子的核心芯片是STM32F407,是Contex M4的内核,和之前接触的STM32F1的相比,功能真的强大了很多,而且设计上也更加容易使用,先介绍一下今天的成果。 今天看了数据手册的RCC部分和GPIO部分,在灵格斯的帮助下,还是能够看懂的,因为它和STM32F1差不多,应该是高级芯片的寄存器结构都很类似,所以看起来不是那么的难懂,很多东西都是相通的。 GPIO部分,他的寄存器包括4个参数设置寄存器用来设置IO口的工作方式,两个数据寄存器(一个输入一个输出),一个置位复位寄存器,一个LOCK寄存器,两个功能选择寄存器。寄存器的结构是十分的清晰的,Configure寄存器
[单片机]
STM32F4学习笔记9——独立看门狗窗口看门狗
STM32F4xx内置俩个看门狗,提供了更高的安全性、时间的精确性和使用的灵活性。两个看门狗设备可用来检测和解决由软件错误引起的故障;当计数器大道给定的超时值触发一个中断(触发中断仅适用于窗口看门狗)或产生系统复位。 地理看门狗IWDG有用们的低速时钟LSI驱动,及时主时钟发生故障他也任然有效。窗口看门狗由APB1是中国分频后得到的时钟驱动,通过可配置的时间窗口来检测应用程序非正常的过迟或过早的操作。 IWDG最时候用于哪些需要一个看门狗在主程序之外能够独立工作并且对时间精度要求较低的场合,WWDG适合用于哪些要求看门狗在精确计算计时窗口起作用的应用程序。 IWDG主要特性与功能 ·自由运行的递减计数器 ·时钟由独立R
[单片机]
STM32F4学习笔记9——独立<font color='red'>看门狗</font>与<font color='red'>窗口</font><font color='red'>看门狗</font>
STM32F0xx_看门狗(独立+窗口)配置详细过程
Ⅰ、概述 对于看门狗,我觉得做单片机或者嵌入式开发的人员来说并不陌生,今天总结STM32F0看门狗的功能,F0的看门狗有两种:独立和窗口看门狗。 今天提供两种看门狗的软件工程实例,供大家下载。 两种看门狗各有各的特点,应用在不同的场合,下面将分别简单总结一下独立和窗口看门狗的功能。 Ⅱ、下载 文章提供的“软件工程”都是在硬件板子上进行多次测试、并保证没问题才上传至360云盘,请放心下载测试,如有问题请检查一下你的板子是否有问题。 ST标准外设库和参考手册、数据手册等都可以在 ST官网 下载,你也可以到我的360云盘下载。关于F0系列芯片的参考手册有多个版本(针对F0不同芯片),但有一个通用版本,就是“STM32F0
[单片机]
STM32F0xx_<font color='red'>看门狗</font>(独立+<font color='red'>窗口</font>)配置详细过程
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved