历史上的今天
返回首页

历史上的今天

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

正在发生

2021年07月02日 | STM32窗口看门狗和独立看门狗的区别

2021-07-02 来源:eefocus

一、介绍:

STM32看门狗分为独立看门狗和窗口看门狗两种,其两者使用调条件如下所示,

 

  

 

IWDG和WWDG两者特点如下图所示:

 

    

独立看门狗的手册资料:

窗口看门狗的手册资料:

 

 窗口看门狗的编程操作图

                应当注意:在窗口看门狗中,当递减计数器在窗口外被重新装载,(若看门狗被启动)则产生复位

 【注】图中的WDGTB为3表示2^3=8,表示8分频,最小时间910us也等于每次计数器减一所需要经过的时间:T(LSB),每隔910us减1。最大值也等于,设置重载(喂狗)值127时(最大),一个复位周期的时间就是最大值58.25ms,也就是所能维持进入复位的最大时间。

 

由于窗口看门狗使用的APB1的PCLK1,时钟最高36MHZ,和RCC_APB2Periph_GPIOx不同,APB1最大就是36MHZ,APB2最大就是72MHZ。

所以串口看门狗需要配置APB1时钟使能,如下语句。

可以从图1-3 窗口看门狗编程说明红看到T(WWDG)=T(PCLK1) x 4096 x 2^WDGTB x (T[5:0]+1)  ; (ms)

 

WDGTB[1:0]: 时基 (Timer base),也就是设置WDGTB 的值是1/2/4还是8,这在配置寄存器(WWDG_CFR)寄存器的位8:7 中设置,

其预分频器的时基可以设置如下:

00: CK计时器时钟(PCLK1除以4096)除以1

01: CK计时器时钟(PCLK1除以4096)除以2

10: CK计时器时钟(PCLK1除以4096)除以4

11: CK计时器时钟(PCLK1除以4096)除以8

也可以直接用这个函数

WWDG_SetPrescaler(WWDG_Prescaler_8); //8预分频,则WWDG时钟频率=(PCK1(36M)/4096)/8=1099Hz(910us)


也可以直接用这个函数


其次是设置窗口值,用来与递减计数器进行比较用的窗口值。通过如下函数即可


WWDG_SetWindowValue(80);//设置窗口值为80则WWDG的计数值必须在64~80之间才能喂狗(64是0x40,当再次减1就会T6清零,从而导致复位了,即刷新窗口设置成了80-64,127-80也是不能更新值得否则也会复位)


应当注意:在窗口看门狗中,当递减计数器在窗口外被重新装载,(若看门狗被启动)则产生复位,也即是说在90-64外面使用这个重载函数,会有问题发生


最后我们设置 (T[5:0]+1)的值,这里我们设置最大127,代码如下,以后每次喂狗也可以用这个函数进行重载计数值(喂狗)。


WWDG_Enable(127)


因为这是会导致产生复位,所以重载的窗口一定要设置好。


总结就是我们使用串口看门狗应该先配置寄存器(WWDG_CFR),即配置窗口值是多少到最小的0x40*T(LSB)(假定T(LSB)为每减一计数所需要的时间),这个配置会告诉单片机什么时候来与递减计数器进行值比较,如果计数值值小于0x40就产生复位。


当然,本例中如果你在减减计数值还在0x7E~0x50(127~80)之间就重载计数值(喂狗)同样会导致芯片复位。所以窗口的概念一定要理解好,在窗内才可以重载计数值(喂狗),这样才不会莫名被复位。


二、代码实现


最终的初始化窗口看门狗的配置函数(WWDG)如下:


/*************************************************************

Function : WWDGReste_Init

Description: 窗口看门狗定时器

Input : none

return : none

*************************************************************/

void WWDGReste_Init(void)

{

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE);//WWDG连接在PCLK1(36M)的时钟线上


    WWDG_SetPrescaler(WWDG_Prescaler_8); //8预分频,则WWDG时钟频率=(PCK1(36M)/4096)/8=1099Hz(910us)

    WWDG_SetWindowValue(80);//设置窗口值为80则WWDG的计数值必须在64~80之间才能喂狗(64是0x40,当再次减1就会T6清零,从而导致复位了)

    //设置WWDG计数值为127,超时时间=910us*64=58.25ms,所以

    WWDG_Enable(127);//(0x7F为设置的最小值,0x40为最大的复位值,取值应该在0x40~0x7F之间)刷新窗口为:910us*(127-80)=42.77ms < 刷新窗口 < 910us*64=58.25ms

}


主函数如下:


void mian(void)

{

//初始化

    while(1)

    {

        delay_ms(400)

        WWDG_Enable(127);

      //无需判断直接等待窗口看门狗中断触发

    }

}  



或者这样的留参带使能中断形式:


#include "wdg.h"

#include "stm32f10x_wwdg.h"




static u8 WWDG_CNT=0x7f;     /*保存WWDG计数器的设置值,默认为最大127. */


//========================================================================================

/**

 * 初始化窗口看门狗

 * tr :T[6:0],计数器值

 * wr :W[6:0],窗口值

 * fprer:分频系数(WDGTB),仅最低2位有效

 * Fwwdg=PCLK1/(4096*2^fprer).

 // 计数器值为7f,窗口寄存器为5f,分频数为8

    WWDG_Init(0X7F,0X5F,WWDG_Prescaler_8);

 */

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_InitStructure.NVIC_IRQChannelCmd = ENABLE;      //中断使能,

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

}


void mian(void)

{

//初始化

    while(1)

    {

    

    }

}


三、中断说明:


 关于void WWDG_IRQHandler(void)里的中断进入是在减计数到0x40时,处罚中断进入这个中断函数,如果在中断函数中进行减计数的操作,可以避免复位的厄运,但是如果你不做喂狗操作,那减计数值将接着减,数值将为0x3F,此时bit7被置零,此时将会直接导致复位。总之,进入中断函数并非就复位了,只是此时的减计数值到了0x40,而下一次减计数器减一后值为0x3F将导致芯片复位了。


附录:


独立看门狗(IWDG)的代码:


/**

 * 初始化独立看门狗

 * prer:分频数:0~7(只有低 3 位有效!)

 * 分频因子=4*2^prer.但最大值只能是 256!

 * rlr:重装载寄存器值:低 11 位有效.

 * 时间计算(大概):Tout=((4*2^prer)*rlr)/40 (ms).

 *IWDG_Init(4,625);//初始化独立看门狗,分频数为64,重装载值为625,溢出时间计算为:64*625/40=1000ms=1s

 */

void IWDG_Init(u8 prer,u16 rlr)

{

    IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); /* 使能对寄存器IWDG_PR和IWDG_RLR的写操作*/

    IWDG_SetPrescaler(prer);    /*设置IWDG预分频值:设置IWDG预分频值*/

    IWDG_SetReload(rlr);     /*设置IWDG重装载值*/

    IWDG_ReloadCounter();    /*按照IWDG重装载寄存器的值重装载IWDG计数器*/

    IWDG_Enable();        /*使能IWDG*/

}


/**

 * 喂独立看门狗

 */

void IWDG_Feed(void)

{

    IWDG_ReloadCounter();    /*reload*/

}


/**

 *main函数

 */

void main(void)

{

  NVIC_Configuration();//优先级配置

  IWDG_Init(4,625);//初始化独立看门狗,分频数为64,重装载值为625,溢出时间计算为:64*625/40=1000ms=1s

 while(1)

  {

    delay_ms(500);//0.5秒喂一次狗

      IWDG_Feed();//喂狗

  }        

}


推荐阅读

史海拾趣

FASTRAX公司的发展小趣事

在成立初期,FASTRAX就注重技术创新,不断推出新的产品和技术方案。其中,Fastrax iSuite MP SDK软件开发系统是其技术创新的代表,该系统为编程人员提供了丰富的资源,大大简化了GPS接收模块的开发过程。这一创新不仅提升了FASTRAX产品的竞争力,也推动了整个电子行业的发展。

上海如韵(CONSONANCE)公司的发展小趣事

在国内市场取得一定成绩后,如韵开始将目光投向海外市场。为了拓展国际业务,公司在香港设立了研发中心,以便更好地了解国际市场需求和技术趋势。同时,如韵积极参加国际电子展会和交流活动,与多家国际知名企业建立了合作关系。

经过一段时间的努力,如韵的产品逐渐在海外市场上获得了认可。公司的出口额逐年增长,为如韵带来了更多的发展机遇。海外市场的成功拓展,不仅提升了公司的品牌影响力,也为公司带来了更多的国际合作机会。

Doodle Labs公司的发展小趣事

Doodle Labs非常重视企业文化的建设和发展。公司倡导开放、创新、协作、共赢的价值观,为员工提供良好的工作环境和发展机会。同时,Doodle Labs还积极参与公益事业和社会活动,为社会做出贡献。在未来,Doodle Labs将继续秉承这些价值观和精神,致力于成为全球领先的无线通信技术提供商和物联网解决方案提供商。

Fairchild公司的发展小趣事

1957年,Fairchild半导体公司在硅谷成立,其背后有一群被称为“八叛逆”的年轻科学家。这八位科学家曾在肖克利半导体实验室共事,但因不满肖克利的管理方式和缺乏研究成果,他们决定离开并自行创业。这群年轻的科学家包括罗伯特·诺伊斯(N. Noyce)和戈登·摩尔(Gordon Moore)等,他们共同创立了Fairchild半导体公司,为硅谷的半导体产业奠定了坚实的基础。

锋鸣电子(Fengming)公司的发展小趣事

福斯特(FIRST)公司在光伏封装材料领域取得了显著成就。自2003年公司前身杭州福斯特热熔胶膜有限公司成立以来,团队成功研发出EVA太阳能电池胶膜,正式进军光伏行业。此后,公司不断投入研发,扩大产能,光伏胶膜(EVA/POE胶膜)的设计产能已达10.51亿平米。至2020年,公司光伏胶膜销量达8.65亿平米,占据全球市场份额约55%-60%,大幅领先其他竞争对手。这一成就不仅巩固了福斯特在光伏胶膜市场的领导地位,还推动了整个行业的发展。

Continental Industries公司的发展小趣事

经过多年的发展,Continental Industries已经成为电子行业中的佼佼者。公司不断追求创新和发展,积极拓展新的业务领域和市场空间。未来,随着电子行业的不断发展和变革,Continental Industries将继续保持敏锐的市场洞察力和强大的技术实力,努力成为行业的领导者。

这五个故事展示了Continental Industries在电子行业中的发展历程和取得的成就。虽然无法涵盖公司的全部发展细节,但通过这些故事,我们可以感受到公司在技术创新、市场拓展、合作共赢、应对挑战以及持续发展等方面的努力和成果。

问答坊 | AI 解惑

ZigBee将成为新的蓝牙

  大多数IT专业人士和消费者都非常熟悉蓝牙数据通信标准,但知道ZigBee无线标准的人却少之又少。目前,ZigBee技术刚刚开始在工业应用中部署,仍处于大规模采用的前期阶段。不过,随着面向消费级应用的不断发展,将会有越来越多的人知道这个标准。 ...…

查看全部问答>

大功率LED封装工艺系列之焊线篇

1目的 在压力、热量和超声波能量的共同作用下,使金丝在芯片电极和外引线键合区之间形成 良好的欧姆接触,完成内外引线的连接。 2. 技术要求 2.1 金丝与芯片电极、引线框架键合区间的连接牢固 T B@&zV{#} 2.2 金丝拉力:25μm金丝F最小>5C ...…

查看全部问答>

iSuppli称:苹果iPhone 4配件成本188美元

本帖最后由 jameswangsynnex 于 2015-3-3 19:58 编辑 据国外媒体报道,市场调研公司iSuppli在本周一对外发布报告称,在对苹果iPhone 4手机进行拆解后发现,这款手机的配件成本为187.51美元,不到188美元。在美国市场上,iPhone 4的最低售价为199美 ...…

查看全部问答>

PAL 和 NTSC 的视频每帧图像是多少像素×多少像素?

PAL 和 NTSC 的视频每帧图像是多少像素×多少像素?…

查看全部问答>

关于mini2440 的几个简单问题 疑惑?

我有个mini2440开发板,用他们的内核下载,桌面上会有一个 串口调试助手 图标! 如果我自己做个内核用他们的BSP 1、桌面上也会有这个图标吗?也会有这个应用程序吗? 2、如果想去掉桌面上这个图标,需要修改什么?Platfrom.dat 吗?…

查看全部问答>

请问各位:想编写ARM或者POWERPC下,linux系统的多串口驱动程序应该从何入手啊,多谢请指点一下

想编写个powerpc下linux系统的多串口驱动程序,可是我从来没接触过,请做过的朋友帮我指点下思路,做这个一般需要哪些步骤啊,非常感谢!…

查看全部问答>

STM32批量价格,哪里最便宜

                                 想用一款带FSMC功能的做产品,现在算开发成本…

查看全部问答>

说说实习两天的进展,同时求救求指导

     今天实习第三天了。      前两天,我们对着STM32,一个全新的东西,我和同事阿彬都束手无策。      我们两人从最开始摸索怎么使用IDE开始。      由于他 ...…

查看全部问答>

程序复位问题的新原因(最终发现不是复位问题)

用了一天的时间,搞定了一个低级错误 程序不能正常运行,解决过程如下: 开机没有显示,似乎程序没有运行,试过了坛子里所有关于不能正确复位的方法,问题没有解决。 最后发现是在写入flash的时候由于笔误,将地址写在了程序段。 不知道对大家 ...…

查看全部问答>

堆栈指针的最低两位永远是 0

堆栈指针的最低两位永远是 0,这意味着堆栈总是 4 字节对齐的。这句话我不理解。  同学说我钻牛角尖了~~~ 我压根不理解,钻的方向都没有。哪位能告诉我正解~~…

查看全部问答>