微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > STM32 的看门狗

STM32 的看门狗

时间:12-03 来源:互联网 点击:

看这么多7788的肯定晕直接看代码:

这个就是窗口看门狗的例程了,窗口看门狗的特性:

喂狗太快—复位,喂狗太慢—复位.迟了喂狗,还可以有中断.WWDG_IRQHandler

#include"STM32Lib\\stm32f10x.h"

void WWDG_Configuration(void)
{
/* 窗口看门狗时钟允许 */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE);

/* 看门狗节拍 = (36M/4096)/8 = 1098 Hz就是说一秒钟计数器减1098下*/
WWDG_SetPrescaler(WWDG_Prescaler_8);

/* 窗口值用0x42就是说计数器满是0x7f在减到0x42之前喂狗了就算喂早了-复位*/
WWDG_SetWindowValue(0x42);

/*看门狗使能并初始化定时器为0x7f最大就是0x7f计数器减到到0x3F(T6位清零)时,则产生一个复位*/
WWDG_Enable(0x7F);

/* Clear EWI flag 清中断标记*/
WWDG_ClearFlag();

/*使能 EW interrupt这个会在计数器减到0x40的时候产生一个"死前"中断 当然你也可以在这个中断里赶紧

喂狗-省的狗咬你(复位)*/
WWDG_EnableIT();
}

/*******************************************************************************
* Function Name : WWDG_IRQHandler”死"前中断
* Description : This function handles WWDG interrupt request.
* Input : None
* Output : None
* Return : None
*******************************************************************************/
externbool Feed_Dog;
void WWDG_IRQHandler(void)
{
staticu8 led2=0;

/* 喂狗 */
if(Feed_Dog==TRUE)
{
WWDG_SetCounter(0x7F);
Feed_Dog=FALSE;
}

/* 清中断标志*/
WWDG_ClearFlag();

//每进入此中断,LED2翻转一次
if(led2)
{
LED2_OFF;
led2=0;
}
else
{
LED2_ON;
led2=1;
}
}

/**********由于喂狗太早也会复位所以 就在“死”前中断 喂狗了

for(;;)
{

if(GET_LEFT())//按左键,则系统长时间等待,也就是不喂狗!
{
SysTickDelay(1000);
}
Feed_Dog=TRUE;
if(GET_RIGHT())//按右键则频繁喂狗
{
WWDG_SetCounter(0x7F);
}
}//按键左右的后果都是复位,不按的话会在“死”前中断中及时喂狗LED2不停的闪

以一般的情况说,这个“死”前中断中断里面不应该
喂狗的,而是应该做系统临死前的一些工作,例如保存重要数据之类.

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

电子白菜曰"是STM32 芯片内的BUG,至少是我手上那片CPU 的BUG.就是:初始
化窗口狗中断前,必须要有片内外设被允许,例如允许GPIO
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
只有允许了一个片内外设,再初始化窗口狗中断(NVIC_Configuration()),窗口狗中断才有
效.你可以试试在RCC 配置后就马上运行NVIC_Configuration(),之后再初始化GPIO,那么窗
口狗的中断WWDG_IRQHandler就不会进入了,对于我这个程序,就不会喂狗,结果系统就不停被复位.如果其他
CPU也有这个情况,那么这个可以肯定就是STM32 芯片的BUG.”

颠倒着两句话的顺序就可以了。

我的STM32 103VC T6也是,这个在勘误表中可以查到。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top