历史上的今天
返回首页

历史上的今天

今天是:2025年02月12日(星期三)

正在发生

2019年02月12日 | 【stm32f407】窗口看门狗 wwdog

2019-02-12 来源:eefocus

一.窗口看门狗


窗口看门狗(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

   

}




推荐阅读

史海拾趣

ADL [ADL Embedded Solutions Inc]公司的发展小趣事

ADL Embedded Solutions Inc. 是一家专注于嵌入式计算解决方案的公司,以下是该公司发展的五个相关故事:

  1. 公司创立与早期发展: ADL Embedded Solutions Inc. 成立于1994年,总部位于美国科罗拉多州科罗拉多斯普林斯市。公司初期致力于为工业、军事、航空航天等领域提供嵌入式计算解决方案。其产品包括工业级嵌入式计算板卡、系统、模块等。

  2. 技术创新与产品推出: ADL 在嵌入式计算领域不断进行技术创新,并推出了多款具有竞争力的产品。公司的产品具有高性能、低功耗、高可靠性等特点,得到了客户的广泛认可。其产品广泛应用于军事航空、医疗、交通、工业自动化等领域。

  3. 客户合作与项目案例: ADL 与各行业的领先企业建立了长期稳定的合作关系,并参与了众多重要项目。例如,公司为航空航天领域的客户提供了符合严格标准的嵌入式计算解决方案,为医疗设备制造商提供了可靠的嵌入式计算板卡等。

  4. 全球市场拓展与国际化发展: ADL 通过不断拓展国内外市场,实现了全球化发展。公司在美国、欧洲和亚洲等地设有销售办事处和服务中心,为客户提供本地化的技术支持和服务。同时,ADL 的产品远销全球各地,深受国际客户的青睐。

  5. 未来展望与持续发展: ADL 将继续致力于技术创新和产品开发,满足客户不断变化的需求。公司将不断扩大在工业、军事、医疗等领域的市场份额,加强与客户的合作,保持行业领先地位,实现业务的持续增长和发展。

ALLIED [Allied Electronics]公司的发展小趣事

Allied Electronics,总部位于美国德克萨斯州的一家分销公司,专注于为各种行业提供电子元件和电子产品。以下是关于Allied Electronics发展的五个相关故事:

  1. 成立和初期发展: Allied Electronics成立于1928年,最初以销售家庭无线电零件和配件为主要业务。随着无线电和电子行业的发展,公司逐渐扩大了产品范围,开始提供更广泛的电子元件和设备,以满足不断增长的市场需求。

  2. 与RS Components的合并: 2000年,Allied Electronics与英国的RS Components公司合并,成为全球领先的电子元件分销商之一。这一合并加强了两家公司在全球市场的地位,并且拓展了它们的产品线和客户群。

  3. 公司战略调整: 随着数字化技术的快速发展,Allied Electronics逐渐调整了业务战略,加大了对电子元件和器件的供应,并拓展了工业自动化、物联网和电子制造等领域的业务。通过与各种行业的合作伙伴建立紧密的关系,公司不断提升了产品质量和服务水平。

  4. 技术创新和数字化转型: Allied Electronics致力于技术创新和数字化转型,通过建立先进的电子商务平台和在线资源中心,为客户提供更便捷的采购体验。同时,公司还加强了与供应商的合作关系,引入了更多的创新产品,满足不同客户的需求。

  5. 持续发展和全球扩张: 作为全球领先的电子元件分销商之一,Allied Electronics不断加大在全球范围内的市场扩张力度,开设了多个销售办事处和物流中心,以更好地服务于全球客户。同时,公司还积极参与行业展会和活动,加强了与全球电子行业的合作与交流,推动了公司的持续发展和壮大。

Horizon Electronics Enterprises Group公司的发展小趣事

随着工业互联网和智能制造技术的快速发展,Horizon紧跟时代步伐,积极推进数字化转型和智能制造升级。公司引入先进的自动化生产线和智能管理系统,实现生产过程的智能化和精细化管理。通过数字化转型,Horizon不仅提高了生产效率和产品质量,还降低了运营成本和市场风险。同时,公司还积极探索智能制造的新模式和新应用,为电子行业的未来发展贡献智慧和力量。

Altech公司的发展小趣事

随着公司实力的不断增强和产品质量的不断提升,Altech公司开始积极拓展国际市场。公司与多个国际知名企业建立了合作关系,共同开发新产品和技术。这些国际合作不仅为Altech公司带来了更广阔的市场机遇,也提升了公司的国际知名度和影响力。通过与国际市场的深度融合和互利合作,Altech公司在全球电子行业中的地位日益稳固。

请注意,以上故事仅为虚构示例,并非真实事件。真实的Altech公司发展故事可能会根据公司的实际经历和决策有所不同。

Fujitsu America公司的发展小趣事

Fujitsu America作为Fujitsu Limited在北美地区的子公司,其发展历程与Fujitsu全球公司紧密相连。Fujitsu最初成立于1935年,最初是一家电信设备制造商,以生产电话交换机起家。随着技术的不断进步,Fujitsu逐渐扩展到信息与通信技术(ICT)领域,成为全球领先的ICT企业。Fujitsu America在这一过程中发挥了重要作用,不仅继承了Fujitsu在技术创新上的优良传统,还根据北美市场的需求特点,提供了定制化的ICT解决方案和服务,推动了公司在北美市场的快速发展。

Barry Industries Inc公司的发展小趣事

随着电子行业的快速发展,Barry Industries Inc意识到只有不断创新才能在市场中立足。公司加大了对研发的投入,引进了一批高素质的研发人才,并建立了完善的研发体系。经过多年的努力,Barry成功突破了微波半导体封装技术的多项关键技术,推出了多款性能卓越、具有创新性的产品。这些产品不仅广泛应用于军事、航天、通信等领域,还为公司赢得了市场的广泛认可。

问答坊 | AI 解惑

2009年全国竞赛网上发题的正式通知

本帖最后由 paulhyde 于 2014-9-15 09:17 编辑 关于2009年全国大学生电子设计竞赛采取网上发题的正式通知 各赛区组委会、各参赛学校: 为加强竞赛的公正性,全国竞赛组委会决定2009年全国大学生电子设计竞赛采取网上发题方式。2009年9月2日早8:0 ...…

查看全部问答>

CPLD与51单片机总线接口程序

timescale 1ns/1ns module IO_KZ(Data,P27,WR,RD,ALE,CLR,OUTKEY,OUT30,CS,CS1,LEDCS,OC); inout [7:0]Data; input WR; input P27; input RD; input ALE; input CLR; input OC; input [4:0]OUTKEY; output [59:0]OUT30; output [1:0]CS; ...…

查看全部问答>

新手请教PB5模拟器问题

刚刚开始了wince的生涯,打算现在PB5上跑个模拟器玩玩,本以为配置很简单,但又一次被玩得晕头转向,问题现象如下: 1、编译成功0 error,但就是不生成nk.bin文件 2、生成nk.bin文件后,运行模拟器,弹出模拟器窗口,但一直是黑屏 有没有大侠曾 ...…

查看全部问答>

怎么设置wince桌面的快捷方式?

我想把桌面上所有的快捷方式都去掉,然后换上自己的logo。。。。。 不过发现一方面不知道普通的快捷方式怎么删除,删除后重新开机又有了。。。。 还有就是回收站和我的设备也不知道怎么去掉。。。。…

查看全部问答>

如何用Linux AIO接口实现驱动程序对应用程序的异步通知?

    最近在看AIO方面的资料,参考的是《Linux设备驱动开发详解》这本书,其实主要就是IBM developworkers 上的一篇文章《使用异步 I/O 大大提高应用程序的性能》和《Linux Device Driver》相关部分。     自己想动手实践一下 ...…

查看全部问答>

关于驱动程序移植问题

小弟最近在学习周立功有关2440板子的GPIO驱动程序,可是这个程序时基于5.0的,我用的是6.0,下到板子上应用程序总是提示无法找到相关的DLL文件, (1)请问是不是要将原驱动程序移植到6.0?怎样移植? (2)如果要将这个程序改为6410的GPIO驱动程 ...…

查看全部问答>

MAX745充电芯片问题讨论

上上上个礼拜,我为MAX745的性能和稳定性而担忧,根据数据手册上的典型电路图修改了下,焊接调试怎么也调不出来,具体问题可见我另一篇帖子 https://bbs.eeworld.com.cn/viewthread.php?tid=225010&highlight= 当时的几个测量量是正确的,而几 ...…

查看全部问答>

请各位大侠推荐个LVDS转VGA的芯片,支持1920*1080输入,最好能同时输出CVBS。。。

现在公司急需要用到这中芯片,请帮忙推荐个。。。 谢谢~~~ …

查看全部问答>

【号召帖】根据器件清单竞猜、讨论2011年大赛试题

大家一起来讨论讨论2011年全国大赛会有一些什么类型的试题出现吧!…

查看全部问答>

认识ADC兼进一步看懂STM的库

STM学习笔记(13)-认识ADC兼进一步看懂STM的库 2010-09-07 11:10 发表      系统分类:嵌入式系统      自定义分类:默认 标签:STM学习笔记 ADC STM的库 前面的东西 ...…

查看全部问答>