首页 资讯 应用 高压 设计 行业 低压 电路图 关于

单片机

旗下栏目: PLC 嵌入式 单片机 DCS

STM32窗口看门狗WWDG复位

单片机 | 发布时间:2017-07-30 | 人气: | #评论# |本文关键字:STM32,看门狗,WWDG
摘要:STM32除了有一个独立看门狗外,还有一个窗口看门狗。窗口看门狗当然也能复位MCU,但是与独立看门狗复位不同。首先,窗口看门狗所需要的时钟源来自PCLK2,它时钟是经过PCLK2的4096分频

STM32除了有一个独立看门狗外,还有一个窗口看门狗。窗口看门狗当然也能复位MCU,但是与独立看门狗复位不同。首先,窗口看门狗所需要的时钟源来自PCLK2,它时钟是经过PCLK2的4096分频后得到的,能够提供准确的计数。其次,复位的条件有要求:(1)当减计数器的值小于0x40,则产生复位;(2)当减计数值在窗口外被重新装载,则复位。接着,窗口看门狗的计数值与窗口值都只有7位,所以变化范围在0~127之间。还有,装载值一定要大于0x3F,否则就失去了看门狗的功能。

窗口看门狗,它的“窗口”可以有下图体现出来:

STM32窗口看门狗WWDG复位 - ziye334 - ziye334的博客

 图中W[6:0]表示窗口值,当看门狗的减计数器不断递减,只有计数值到达窗口值与0x3F之间的时候“喂狗”,才不会发生复位,其他情况都会发生复位。这样只有在一定范围内“喂狗”才不会复位,就好像窗口一样限定了范围,所以才叫做窗口看门狗。窗口看门狗通常用来监控外部干扰或不可预测的逻辑条件造成的应用程序背离正常的运行产生的软件故障。

下面就讲讲怎么使用窗口看门狗复位,还是基于我自己的规范工程。

1、工程的修改

1)添加stm32f10x_wwdg.c文件添加到STM32F10x_StdPeriph_Driver工程组中。

2)打开stm32f10x_conf.c文件,将其中原先屏蔽着的:#include "stm32f10x_iwdg.h" 这句话的屏蔽去掉。

3)新建WWDGReset.c与WWDGReset.h两个文件,分别保存在BSP文件下的src与inc中,并将WWDGReset.c文件添加到BSP工作组中。


2、WWDGRReset.c和WWDGReset.h两个文件代码的编写

窗口看门狗使用的是PCLK时钟源,是精确的时钟,它不用像独立看门狗一样需要先校准下时钟,所以他的代码就相比起来简单了,整个WWDGReset.c只需要编写一个函数就可以了,代码如下:

/*************************************************************
 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之间才能喂狗
//设置WWDG计数值为127,超时时间=910us*64=58.25ms,所以
WWDG_Enable(127);//刷新窗口为:910us*(127-80)=42.77ms < 刷新窗口 < 910us*64=58.25ms
}

因为窗口看门狗是关在PCK1上的,所以要线初始化下WWDG的时钟。然后设置预分频,这里将它8分频,这样的话,WWDG的时钟频率为36M/4096/8=1099hz。接下去设置窗口值为80,。最后在打开看门狗并设置看门狗的计数初值为127。这样的话,窗口看门狗配置完了,可以计算得到刷新窗口的时间范围为:

(127-80)/1099=42.7ms < 刷新窗口 < 0x40/1099=58.25ms

下面讲讲WWDGReset.h文件,代码如下:

#ifndef __WWDGRESET_H__
#define __WWDGRESET_H__
#include "stm32f10x.h"

#define FeedWWDG() WWDG_Enable(127)

void WWDGReste_Init(void);

#endif

在这个文件中,宏定义了一个FeedWWDG,将它定义成“喂狗”函数WWDG_Enable(127),打开并赋初值。

3、main函数的编写

mian函数非常简单,代码如下:

/*************************************************************
 Function   : main
 Description: main入口
 Input      : none        
 return     : none    
*************************************************************/
int main(void)
{  
BSP_Init();
WWDGReste_Init();
PRINTF("\nmain() is running!\r\n");
while(1)
{
LED1_Toggle();//LED闪烁
Delay_ms(44); //延时时间在42.77~58.25之间喂狗才不会产生看门狗复位
FeedWWDG();  //喂狗
}
}

在mian函数中,线初始化下窗口看门狗,然后在while(1)中每次延时44ms,然后“喂狗”。

4、测试

之前计算过,在刷新窗口42.77ms~58.25ms之间“喂狗”的话,就不会发生复位。在上面的main函数中,延时44ms,在刷新窗口内,所以不会发生复位,所以在串口调试软件只会受到一次打印消息,如下图所示:

STM32窗口看门狗WWDG复位 - ziye334 - ziye334的博客

 

如果将上面的延时改成Delay_ms(60),超出了刷新窗口,所以会不断复位,不对打印出消息,如下图所示:

STM32窗口看门狗WWDG复位 - ziye334 - ziye334的博客


责任编辑:电气自动化网
首页 | 资讯 | 应用 | 高压 | 设计 | 行业 | 低压 | 电路图 | 关于

Copyright 2017-2018 电气自动化网 版权所有 辽ICP备17010593号-1

电脑版 | 移动版

Ctrl+D 将本页面保存为书签,全面了解最新资讯,方便快捷。