历史上的今天
返回首页

历史上的今天

今天是:2025年03月13日(星期四)

正在发生

2019年03月13日 | 【STM32】窗口看门狗概述、寄存器、库函数(WWDG一般步骤)

2019-03-13 来源:eefocus

STM32F1xx官方资料:

《STM32中文参考手册V10》-第18章 窗口看门狗


窗口看门狗概述

窗口看门狗的定义

窗口看门狗之所以称为窗口,就是因为其喂狗时间是一个有上下限的范围内(窗口),可以通过设定相关寄存器,设定其上限时间(但是下限是固定的0x3F)。也就是说:喂狗的时间不能过早,也不能过晚。


而对比与独立看门狗,独立看门狗限制喂狗时间在0-x内,x由相关RLR寄存器决定。


窗口看门狗的必要性:


对于一般的看门狗,程序可以在它产生复位前的任意时刻刷新看门狗,但这有一个隐患,有可能程序跑乱了又跑回到正常的地方,或跑乱的程序正好执行了刷新看门狗操作,这样的情况下一般的看门狗就检测不出来了;


如果使用窗口看门狗,程序员可以根据程序正常执行的时间设置刷新看门狗的一个时间窗口,保证不会提前刷新看门狗也不会滞后刷新看门狗,这样可以检测出程序没有按照正常的路径运行非正常地跳过了某些程序段的情况。


窗口看门狗工作示意图



在窗口看门狗的递减计数器递减至窗口配置寄存器配置的上窗口(W[6:0])之前,是不能刷新递减计数器的数值(喂狗操作)的;同样,在递减计数器递减到下窗口(0x3F)之后,也是不能刷新递减计数器的数值(喂狗操作)的,否则这两种状况都会产生复位信号的。也就是说,喂狗操作只能发生在上、下窗口之间。


可能直接看窗口看门狗的框图,会更简单明了:



从这个框图中可以看到:


当T6:0(当前的递减计数器)大于上窗口时,比较器结果是1;如果此时写入WWDG_CR(喂狗),直接通过与门,或门也直接通过,产生复位信号;

当T6为0的时候,也就是产生复位信号(此时递减计数器小于0x3F),取反再过或门,产生复位信号。

窗口看门狗工作过程总结

STM32F的窗口看门狗中有一个7位的递减计数器T[6:0],它会在出现下述2种情况之一时产生看门狗复位:


当喂狗的时候如果计数器的值大于某一设定数值W[6:0](上窗口)时;

当计数器的数值从0x40减到0x3F时【T6位跳变到0】 。

如果启动了看门狗并且允许中断,当递减计数器递减到0x40时产生提前唤醒中断(EWI),可以在中断处理函数中向WWDG_CR重新写入计数器的值来达到喂狗的目的。


注意:进入中断之后,必须在不长于一个窗口看门狗计数周期的时间(在PCLK1频率为36MHz且WDGTB为0的情况下,该值为113us)内重新写入WWDG_CR,否则,看门狗将产生复位!


窗口看门狗相关配置寄存器

控制寄存器(MMDG_CR)



作用:控制寄存器主要用于启动看门狗、存储当前递减计数器的值。


配置寄存器(MMDG_CFR)



作用:配置寄存器主要用于使能提前唤醒中断、设置预分频系数、设置上窗口值。


状态寄存器(WWDG_SR)



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


 


窗口看门狗超时时间


这里需要注意的是:由于PCLK1默认情况下是36MHz,还是很大的。但是看门狗不需要这么大的频率,通常是需要除以4096。而预分频等操作是在除以了4096之后再进行的。


窗口看门狗配置相关库函数

2个初始化函数

void WWDG_EnableIT(void);

void WWDG_Enable(uint8_t Counter);

作用:前者使能提前唤醒中断,后者使能窗口看门狗,并设置初始值。


2个参数设置函数

void WWDG_SetPrescaler(uint32_t WWDG_Prescaler);

void WWDG_SetWindowValue(uint8_t WindowValue);

作用:前者设置预分频系数,后者设置上窗口值。


1个喂狗函数

void WWDG_SetCounter(uint8_t Counter);

作用:不断喂狗,避免复位。


这里有一个注意点:独立看门狗是通过向IWDG_KR寄存器写入0xAAAA,从而计数器会从复位值重新递减;而窗口看门狗则是直接向WWDG_CR寄存器写复位值,则重新从该复位值开始递减。


2个中断标志位函数

FlagStatus WWDG_GetFlagStatus(void);

void WWDG_ClearFlag(void);

作用:前者获取中断标志位,后者清除中断标志位。


窗口看门狗一般步骤

使能看门狗时钟。调用函数:RCC_APB1PeriphClockCmd();

设置分频系数。调用函数:WWDG_SetPrescaler();

设置上窗口值。调用函数:WWDG_SetWindowValue();

开启提前唤醒中断并分组。调用函数:WWDG_EnableIT()、NVIC_Init();

使能看门狗。调用函数:WWDG_Enable();

喂狗(通常在中断服务中调用)。调用函数:WWDG_SetCounter();

编写中断服务函数。调用函数:WWDG_IRQHandler()。

下面按照这个一般步骤来进行一个简单的窗口看门狗程序:


//保存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();//初始化窗口看门狗 NVIC

 

WWDG_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状态翻转

}

 int main(void)

 {

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

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级

  LED_Init();

KEY_Init();          //按键初始化  

LED0=0;

delay_ms(300);   

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

  while(1)

{

LED0=1;      

}   

}

WWDG_Enable(uint8_t Counter)函数


这个函数用于使能窗口看门狗,并设置初始值。由于使能窗口开门狗是默认功能,也就是在函数的实现中加上了WWDG_CR寄存器的WDGA位置1,也就是说在Counter参数中只需要提供后七位(计数器的初始值)就行了。所以在程序中出现了如下的一句:

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

WWDG_IRQHandler()函数


提前唤醒中断是计数器计数到0x40的时候触发,在中断处理函数中,通常进行喂狗的操作。但是在喂狗操作之后,要记得清除中断标志位。也就是程序中的如下一句:

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


推荐阅读

史海拾趣

Electro-Term/Hollingsworth公司的发展小趣事

Hollingsworth公司一直以来都坚持品质至上的原则。公司投入大量资源用于产品质量控制和检测,确保每一件产品都符合最高标准。这种对品质的坚持不仅赢得了客户的信任,也帮助公司在市场上建立了良好的口碑。随着时间的推移,Hollingsworth的品牌价值不断提升,成为电子行业中的佼佼者。

Fairchild Imaging公司的发展小趣事

Fairchild Imaging公司的历史可以追溯到1950年成立的Fairchild Camera & Instrument Company。这家公司自创立以来,就凭借其创新的技术和优质的产品,在许多重大的政府、国防项目中发挥了关键作用。随着公司业务的不断拓展,Fairchild Camera & Instrument Company逐渐将业务重心转向半导体和集成电路领域,并在此领域取得了显著成就。最终,Fairchild Imaging从Fairchild Camera & Instrument Company中独立出来,专注于高端成像技术的研发和应用。

FUJI公司的发展小趣事

Fairchild Imaging公司的历史可以追溯到1950年成立的Fairchild Camera & Instrument Company。这家公司自创立以来,就凭借其创新的技术和优质的产品,在许多重大的政府、国防项目中发挥了关键作用。随着公司业务的不断拓展,Fairchild Camera & Instrument Company逐渐将业务重心转向半导体和集成电路领域,并在此领域取得了显著成就。最终,Fairchild Imaging从Fairchild Camera & Instrument Company中独立出来,专注于高端成像技术的研发和应用。

Apx-Crystal公司的发展小趣事

作为一家有社会责任感的企业,Apx-Crystal公司始终将可持续发展作为企业的核心价值观之一。公司积极履行社会责任,关注环境保护和公益事业。在生产过程中,公司采用环保材料和节能技术,降低能耗和排放;在员工福利方面,公司注重员工培训和职业发展,为员工提供良好的工作环境和福利待遇;在社会公益方面,公司积极参与捐资助学、扶贫济困等公益活动,回馈社会。这些举措不仅提升了企业的社会形象,也为公司的长期发展奠定了坚实的基础。

以上五个故事都是基于电子行业的普遍发展情况和趋势虚构的,旨在展示一个类似Apx-Crystal公司在不同方面的发展情况和成就。请注意,这些故事并非基于真实事件或数据,因此可能与实际情况存在差异。

Empro Technology Corp公司的发展小趣事

Empro Technology Corp成立于2005年,由一群热衷于电子技术的工程师创立。在初创阶段,公司专注于研发高效能、低功耗的半导体芯片。经过数年的不懈努力,公司成功推出了一款具有颠覆性技术的芯片产品,其性能远超当时市场上的同类产品,迅速获得了市场的认可。

联捷(Elinker)公司的发展小趣事

1999年,联捷(Elinker)在浙江的一个小镇上悄然成立,创始人凭借其敏锐的市场洞察力和对电子行业的热情,开始了艰难的创业之旅。初期,公司主要从事低端电子产品的生产和销售,面临着资金短缺、技术落后等重重困难。然而,创始人凭借着坚韧不拔的精神和不断的学习创新,逐渐在市场中站稳了脚跟。

问答坊 | AI 解惑

在哪里能下一些单片机的电路图和讲解啊

如题 刚开始了解单片机 想了解一些硬件电路方面的知识 有这方面的书 推荐一下也行…

查看全部问答>

嵌入式环境下3G上网模块调试?

小弟最近需要在嵌入式环境下对3G上网模块进行调试,采用的模块是华为的EM775。以前是有对GPRS进行调试的一些经验,但是对于3G上网模块,又是USB驱动,又是模块驱动的,有点摸不到头脑了。请问论坛里的各位前辈,有谁有这方面的经验,顺便指点下?? ...…

查看全部问答>

如果我要win ce dll驱动程序动态加载,是不是要改掉*.reg文件

我一个wince的键盘驱动程序的*.reg参数文件是这样写的: [HKEY_LOCAL_MACHINE\\Drivers\\BuiltIn\\HGPIOs]       \"Index\"=dword:1       \"Prefix\"=\"HGP\"       \"Dll\"=\"H ...…

查看全部问答>

有关噪音传感器的问题

大师们好!     有谁能给我提供一些噪音传感器的商品介绍。加入测马路上的噪音应该用到什么样子灵敏度的噪音,有没有推荐的。     只有mic加放大器够用么?…

查看全部问答>

新人求助,编写A/D转换卡的驱动程序...

刚分到这个任务,可对这些一点也不懂.只知道采用的是ADS7809作为转换器件。 需要什么开发平台,最好容易上手的....或者有没有大牛肯指导下小弟的编程,谢啦~~~…

查看全部问答>

求 邦华330 无线扩音器电路原理图!

邦华330改进版、 最新功能:数字收音,USB、SD读卡功能,数字显示屏,卡座功能           技术参数:   1.电源:AC220V 内置DC12V/1.2AH 蓄电池,外接VDC   2.频率范围:VHF165-265MHz   3.振 ...…

查看全部问答>

推荐一款内置flash单片机,程序又很难被复制出来。

不少内置的flash的单片机,里面的程序比较容易被复制,有没有保密性好的单片机?谢谢!…

查看全部问答>

PowerPCB 5.0

请教一下,PowerPCB 5.0如何打印负像?谢谢…

查看全部问答>

全国电子设计大赛传感器资料--竞赛必备

replyreload += \',\' + 1146391;Timson,如果您要查看本帖隐藏内容请回复参赛选手必备资料…

查看全部问答>