stm8复位中的看门狗超时是怎么回事?看门狗不是达到指定值会产生一个复位信号吗?求指教?

STM32看门狗实验_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
评价文档:
喜欢此文档的还喜欢
STM32看门狗实验
基​于​S​T​M2​芯​片​的​看​门​狗​使​用​教​程​,​含​有​详​细​的​固​件​库​分​析​和​源​代​码
阅读已结束,如果下载本文需要使用
想免费下载本文?
把文档贴到Blog、BBS或个人站等:
普通尺寸(450*500pix)
较大尺寸(630*500pix)
你可能喜欢STM32 的看门狗
-文章-中国单片机在线
当前位置: >>
STM32 的看门狗
STM32 的看门狗
09:26:05&&作者:&&来源:&&浏览次数:4&&文字大小:【】【】【】
简介:STM32 有两个看门,一个是独立看门狗,一个是窗口看门狗.这里先说独立看门狗.独立看门狗的特性是,要利用片内的40k RC振荡器作为时钟据(说这个RC是相当的不准),优点就是,即使CPU主晶振停了,即使CPU进入了休眠模式 ...关键字:
STM32 有两个看门,一个是独立看门狗,一个是窗口看门狗.这里先说独立看门狗.独立看门狗的特性是,要利用片内的40k RC振荡器作为时钟据(说这个RC是相当的不准),优点就是,即使CPU主晶振停了,即使CPU进入了休眠模式,狗也可以生效.当CPU进入休眠模式,并且是深度休眠的时候,这个看门狗可以作为一个CPU 的定时唤醒闹钟,以达到超低功耗的同时还会定时醒来.看门狗由于最大可以分频到256,看门狗定时器最大可以设置到0xfff,所以最最长的喂狗时间是26秒.....用于CPU的唤醒恰到好处。用户手册:STM32F10xxx内置两个看门狗,提供了更高的安全性、时间的精确性和使用的灵活性。两个看门狗设备(独立看门狗和窗口看门狗)可用来检测和解决由软件错误引起的故障;当计数器达到给定的超时值时,触发一个中断(仅适用于窗口型看门狗)或产生系统复位。独立看门狗(IWDG)由专用的40kHz的低速时钟驱动,即使主时钟发生故障它也仍然有效。窗口看门狗由从APB1时钟分频后得到的时钟驱动,通过可配置的时间窗口来检测应用程序非正常的过迟或过早的操作。IWDG最适合应用于那些需要看门狗作为一个在主程序之外,能够完全独立工作,并且对时间精度要求较低的场合。WWDG最适合那些要求看门狗在精确计时窗口起作用的应用程序。16.2IWDG主要性能●自由运行的递减计数器●时钟由独立的RC振荡器提供(可在停止和待机模式下工作)●看门狗被激活后,则在计数器计数至0x000时产生复位16.3IWDG功能描述图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.2WWDG主要特性●可编程的自由运行递减计数器●条件复位─当递减计数器的值小于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*******************************************************************************/extern&bool Feed_Dvoid WWDG_IRQHandler(void){&static&u8 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.就是:初始化窗口狗中断前,必须要有片内外设被允许,例如允许GPIORCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);只有允许了一个片内外设,再初始化窗口狗中断(NVIC_Configuration()),窗口狗中断才有效.你可以试试在RCC 配置后就马上运行NVIC_Configuration(),之后再初始化GPIO,那么窗口狗的中断WWDG_IRQHandler就不会进入了,对于我这个程序,就不会喂狗,结果系统就不停被复位.如果其他CPU也有这个情况,那么这个可以肯定就是STM32 芯片的BUG.”颠倒着两句话的顺序就可以了。我的STM32 103VC T6也是,这个在勘误表中可以查到。
责任编辑:
本文引用地址:&
     
中国单片机在线
在线咨询:STM32F4 窗口看门狗WWDG【使用库函数】 - 编程浪子_ - 博客园
窗口看门狗(WWDG)用于发现由外部接口或者不可预期的逻辑操作导致的软件故障。这些故障会导致程序中断正常运行。当一个程序周期结束时,看门狗电路会产生一个MCU复位信号,除非在看门狗电路复位之前程序返回正常运行逻辑。当计数器减少到预设值的时候,也会产生一个复位信号。这就意味着计数器必须限制在一个指定的窗口内。 【窗口看门狗主要特性】 1、可编程向下计数器& 2、复位条件:计数器值小于0x40或者计数器值超出设定的窗口。3、早期唤醒中断(EWI)计数值等于0x40时产生中断,即等于0x40就产生中断小于0x40就复位。 产生复位条件:计数器计数到小于0x40,计数器值小于配置寄存器(CFR)中设定的窗口值时& 产生复位信号 窗口计数器的计数值在0x7F到0x40之间变化.窗口计数器一旦被使能,就不能停止,直到reset。即使没有使能窗口看门狗,其计数器也会直至不停地计数,所以为了避免刚开始计数就被复位,计数器的值必须设置为大于等于0x40即CR中的T6位必须设置为1并且小于预设值,然后启动WWDG 关于窗口看门狗的使用,ST的人已经做了一些介绍。我在刚开始的时候犯错,以为什么时候喂狗都行。其实并不是这样的。 窗口看门狗的特点是:不能在狗饱时喂狗,也不能在狗饿时 狗饿时喂狗,狗要咬人;狗饱的时候喂,狗也要咬人;只能在一个时间段内、当狗半饱的时候喂,狗才能乖乖地干活。一般的看门狗是在任何时间都可以喂狗,不管狗是不是已经饱了。
这段时间就是计数器数字在的T[6..0]到0x40之间时,才可以喂狗。这里的窗口,可以理解为喂狗的窗口。。。
ST 手册上也有明确说明:
If the watchdog is activated (the WDGA bit is set in the WWDG_CR register) and when the 7-bit downcounter (T[6:0] bits) rolls over from 0x40 to 0x3F (T6 becomes cleared), it initiates a reset. If the software reloads the counter while the counter is greater than the value stored in the window register, then a reset is generated WWDG使用APB1时钟,内部具有分频器WDGTB[1..0]和计数器T[6..0].预分频器WDGTB是对(TPCLK1/4096)进行分频得到看门狗时钟。 超时时间计算公式:TWWDG = TPCLK1 ×4096 ×2^WDGTB *(T[5:0]+1)
【实验步骤】 1、WWDG开启时钟 2、设置预分频值和窗口值WWDG_SetPrescaler()/WWDG_SetWindowValue()& 这些值一旦启动就不恩那个更改,直到MCU Reset 3、使能WWDG&&& WWDG_Enable() 4、喂狗或者不喂狗(WWDG_SetCounter()) 第一次,我们不喂狗,可以看到LED在不停地闪烁。说明MCU被reset了 int main(){& NVIC_Config();& LED_Init();& LEDOn(LED1);& delay_ms(500);& LEDOff(LED1);& & RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG,ENABLE);& WWDG_DeInit();& WWDG_SetPrescaler(WWDG_Prescaler_8);& WWDG_SetWindowValue(0x7F); & WWDG_Enable(0x5F);& while(1)& {&&&& //不喂狗,看灯闪& }} 第二次,每隔一定时间喂狗看到灯不闪烁了 int main(){& NVIC_Config();& LED_Init();& LEDOn(LED1);& delay_ms(500);& LEDOff(LED1);& RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG,ENABLE);& WWDG_DeInit();& WWDG_SetPrescaler(WWDG_Prescaler_8);& WWDG_SetWindowValue(0x7F); & WWDG_Enable(0x5F);& & while(1)& { &&& //在喂狗窗口内喂狗&&& if((WWDG-&CR & 0x7F) == 0x55)&&& {&&&&& WWDG_SetCounter(0x7f);&&& }& }} 另外,也可以使用中断来处理看门狗事件。不过好像ST的人不建议这么做。 【参考资料】
另外,玩WWDG千万别被正点原子的程序给陷害了,他给出的窗口看门狗例子是错误的。

我要回帖

更多关于 stm8 软复位 的文章

 

随机推荐