您的位置 首页 IOT

STM32 的看门狗

STM32有两个看门,一个是独立看门狗,一个是窗口看门狗.这里先说独立看门狗.独立看门狗的特性是,要利用片内的40kRC振荡器作为时钟据(说…

STM32 有两个看门,一个是独立看门狗,一个是窗口看门狗.这儿先说独立看门狗.

独立看门狗的特性是,要运用片内的40k RC振荡器作为时钟据(说这个RC是适当的禁绝),长处便是,即便CPU主晶振
停了,即便CPU进入了休眠形式,狗也能够收效.当CPU进入休眠形式,而且是深度休眠的时分,这个看门狗能够作为一个CPU 的守时唤醒闹钟,以抵达超低功耗的一起还会守时醒来.看门狗因为最大能够分频到256,看门狗守时器最大能够设置到0xfff,所以最最长的喂狗时刻是26秒…..用于CPU的唤醒适可而止。

用户手册:

STM32F10xxx内置两个看门狗,供给了更高的安全性、时刻的准确性和运用的灵活性。两个看门狗设备(独立看门狗和窗口看门狗)可用来检测和处理由软件过错引起的毛病;当计数器抵达给定的超时值时,触发一个中止(仅适用于窗口型看门狗)或发生体系复位。
独立看门狗(IWDG)由专用的40kHz的低速时钟驱动,即便主时钟发生毛病它也依然有用。窗口看门狗由从APB1时钟分频后得到的时钟驱动,经过可装备的时刻窗口来检测应用程序非正常的过迟或过早的操作。
IWDG最适合应用于那些需求看门狗作为一个在主程序之外,能够彻底独立作业,而且对时刻精度要求较低的场合。WWDG最适合那些要求看门狗在准确计时窗口起作用的应用程序。

16.2
IWDG首要性能
●自在运转的递减计数器
●时钟由独立的RC振荡器供给(可在中止和待机形式下作业)
●看门狗被激活后,则在计数器计数至0x000时发生复位
16.3
IWDG功用描绘
图153为独立看门狗模块的功用框图
在键寄存器(IWDG_KR)中写入0xCCCC,开端启用独立看门狗;此刻计数器开端从其复位值0xFFF递减计数。当计数器计数到结尾0x000时,会发生一个复位信号(IWDG_RESET)。
不管何时,只需键寄存器IWDG_KR中被写入0xAAAA, IWDG_RLR中的值就会被从头加载到计数器中然后避免发生看门狗复位 。

void IWDG_Configuration(void)
{
/* 写入0x5555,用于答应狗狗寄存器写入功用 */
IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);

/* 狗狗时钟分频,40K/256=156HZ(6.4ms)*/
IWDG_SetPrescaler(IWDG_Prescaler_256);

/* 喂狗时刻 5s/6.4MS=781 .留意不能大于0xfff*/
IWDG_SetReload(781);

/* 喂狗*/
IWDG_ReloadCounter();

/* 使能狗狗*/
IWDG_Enable();
}

#include”STM32Lib\\stm32f10x.h”
#include”hal.h”

int main(void)
{
ChipHalInit();//片内硬件初始化
ChipOutHalInit();//片外硬件初始化

if(RCC_GetFlagStatus(RCC_FLAG_IWDGRST)!=RESET)

{

LED2_ON;

RCC_ClearFlag();

}

/*假如前次的复位是看门复位的话LED2点亮*/
LED1_ON;
SysTickDelay(500);
LED1_OFF;
/*闪LED1 5秒后没喂狗将主动复位LED1又闪LED2亮*/
IWDG_Enable();//发动看门狗,主动就会使能内部的40K

for(;;)
{
if(GET_LEFT())
{
IWDG_ReloadCounter();//手动喂狗
}
}

}

WWDG简介
窗口看门狗通常被用来监测由外部搅扰或不行预见的逻辑条件形成的应用程序违背正常的运转序列而发生的软件毛病。除非递减计数器的值在T6位变成0前被改写,看门狗电路在抵达预置的时刻周期时,会发生一个MCU复位。在递减计数器抵达窗口寄存器数值之前,假如7位的递减计数器数值(在操控寄存器中)被改写, 那么也将发生一个MCU复位。这表明递减计数器需求在一个有限的时刻窗口中被改写。
17.2
WWDG首要特性
可编程的自在运转递减计数器
●条件复位
─当递减计数器的值小于0x40,(若看门狗被发动)则发生复位。
─当递减计数器在窗口外被从头装载,(若看门狗被发动)则发生复位。见图155。
●假如发动了看门狗而且答应中止,当递减计数器等于0x40时发生前期唤醒中止(EWI),它能够被用于重装载计数器以避免WWDG复位。

假如看门狗被发动(WWDG_CR寄存器中的WDGA位被置’1’), 而且当7位(T[6:0])递减计数器从0x40翻转到0x3F(T6位清零)时,则发生一个复位。假如软件在计数器值大于窗口寄存器中的数值时从头装载计数器,也将发生一个复位。应用程序在正常运转进程中有必要定时地写入WWDG_CR寄存器以避免MCU发生复位。只要当计数器值小于窗口寄存器的值时,才干进行写操作。储存在WWDG_CR寄存器中的数值有必要在0xFF和0xC0之间:
●发动看门狗 在体系复位后,看门狗总是处于封闭状况,设置WWDG_CR寄存器的WDGA位能够敞开看门狗,随后它不能再被封闭,除非发生复位。
●操控递减计数器 递减计数器处于自在运转状况,即便看门狗被制止,递减计数器仍持续递减计数。当看门狗被启用时,T6位有必要被设置,以避免当即发生一个复位。 T[5:0]位包括了看门狗发生复位之前的计时数目;复位前的延时时刻在一个最小值和一个最大值之间改变,这是因为写入WWDG_CR寄存器时,预分频值是不知道的。 装备寄存器(WWDG_CFR) 中包括窗口的上限值:要避免发生复位,递减计数器有必要在其值小于窗口寄存器的数值而且大于0x3F时被从头装载,图155描绘了窗口寄存器的作业进程。 另一个重装载计数器的办法是运用前期唤醒中止(EWI)。设置WWDG_CFR寄存器中的WEI位敞开该中止。当递减计数器抵达0x40时,则发生此中止,相应的中止服务程序(ISR)能够用来加载计数器以避免WWDG复位。在WWDG_SR寄存器中写’0’能够铲除该中止。

看这么多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);
}
}//按键左右的成果都是复位,不按的话会在“死”前中止【WWDG_IRQHandler】中及时喂狗LED2不断的闪

以一般的状况说,这个“死”前中止中止里边不应该
喂狗的,而是应该做体系临死前的一些作业,例如保存重要数据之类.

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

电子白菜曰”是STM32 芯片内的BUG,至少是我手上那片CPU 的BUG.便是:初始
化窗口狗中止前,有必要要有片内外设被答应,例如答应GPIO
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
只要答应了一个片内外设,再初始化窗口狗中止(NVIC_Configuration()),窗口狗中止才有
效.你能够试试在RCC 装备后就立刻运转NV%&&&&&%_Configuration(),之后再初始化GPIO,那么窗
口狗的中止WWDG_IRQHandler就不会进入了,关于我这个程序,就不会喂狗,成果体系就不断被复位.假如其他
CPU也有这个状况,那么这个能够必定便是STM32 芯片的BUG.”

倒置着两句话的次序就能够了。

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

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/yingyong/iot/252284.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部