看门狗解决这个问题题怎么解决?

看门狗超时错误是怎么回事呢?-专业自动化论坛-中国工控网
看门狗超时错误是怎么回事呢?
给TA发消息
加TA为好友
发表于: 10:22:00
& 运行plc时经常出现看门狗超时错误,上位机是力控,这种错误是程序的问题还是通讯的问题?谢谢
给TA发消息
加TA为好友 发表于: 11:03:04 1楼
看门狗提示错误,应该是上位机软件的问题吧;你的组态软件是否有加密狗之类的硬件;还有就是通信设置那是否有问题,比如:组态软件的通信设置部分;
给TA发消息
加TA为好友 发表于: 11:48:36 2楼
引用 银光人生—华 的回复内容: 看门狗提示错误,应该是上位机软件的问题吧;你的组态软件...
给TA发消息
加TA为好友 发表于: 13:02:51 3楼
& 看门狗提示错误,应该是你的组态软件是否有加密狗之类的硬件;或是软件中 关闭 看门狗功能
给TA发消息
加TA为好友 发表于: 14:58:55 4楼
回复内容:对: 阿水--王者之师
& &看门狗提示错误,应该是你的组态软件是否有加密狗之... 内容的回复!上位机用的是版的 &没有加密狗 & &plc软件中需要关闭看门狗吗?
给TA发消息
加TA为好友 发表于: 08:21:15 5楼
可能的原因:程序过大程序错误如进入死循环、或编程造成扫描时间过长,会造成看门狗超时错误。
给TA发消息
加TA为好友 发表于: 10:39:25 6楼
上个贴图看看什么提示?
给TA发消息
加TA为好友 发表于: 10:50:32 7楼
莫非不是正版软件,或者是万能破译的软件授权??
给TA发消息
加TA为好友 发表于: 21:50:38 8楼
监控下你程序扫描周期多少,可能循环造成扫描周期过长导致看门狗报错
给TA发消息
加TA为好友 发表于: 12:40:57 9楼
回复内容:对: 沧海一粟——王者之师
上个贴图看看什么提示? 内容的回复! &
给TA发消息
加TA为好友 发表于: 13:43:38 10楼
有没有中断这类的程序?
给TA发消息
加TA为好友 发表于: 15:30:25 11楼
回复内容:对: tigermu
有没有中断这类的程序? 内容的回复!有
周点击排行周回复排行
[632] [438] [410] [312] [255] [249] [224] [219] [213] [177]
[137] [42] [31] [28] [25] [18] [18] [13] [13] [12]最新求助
[1] [11] [2] [6] [2] [7] [5] [5] [5] [0]看门狗的使用问题(已解决) - ARM Cortex-M系列产品 - 恩智浦技术社区
后使用快捷导航没有帐号?
查看: 400|回复: 8
看门狗的使用问题(已解决)
该用户从未签到主题帖子积分
注册会员, 积分 76, 距离下一级还需 124 积分
注册会员, 积分 76, 距离下一级还需 124 积分
本帖最后由 yyy123yyy 于
17:06 编辑
看门狗调试过程中芯片不断的复位,请大神指导!
void WDOG_Init(word ms){& && && && & //初始化看门狗
& && && &&&__disable_irq();& && && && && && && && && && && && && && && && && && && && && && && && &&&WDOG-&UNLOCK& &= 0xC520;
& && && & WDOG-&UNLOCK& &= 0xD928;
& && && &__enable_irq();& && && &&&
& && &&&WDOG-&PRESC& & = 0x0000;& &//不分频& && && && && &&&
& && &&&WDOG-&TOVALH& &= (ms - 1) && 16;
& && &&&WDOG-&TOVALL& &= (ms - 1) & 0
& && &&&WDOG-&STCTRLH&&= 0x0001;& && && && && && &&&//enable WDOG
void WDOG_Feed(void){& &&&//喂狗
& && && &&&__disable_irq();& && && && && && && && && && && && && && && && && && && && && && && && &WDOG-&UNLOCK& &= 0xC520;
& && &&&WDOG-&UNLOCK& &= 0xD928;& && && &
& && && & WDOG-&PRESC&&=&&0x0000;
& && && & WDOG-&REFRESH = 0xA602;
& && && &WDOG-&REFRESH = 0xB480;
& && && & __disable_irq();
int main(void) {
& && && &&&WDOG_Init(60000); //设置超时时间60S
& &for(;;){
& && && && && & delayMS(48000);
& && && && && &&&WDOG_Feed();
& && && && &&&}
芯片会一段时间复位,大家看一下是我哪里设置的不对,非常感谢!
该用户从未签到主题帖子积分
楼主你好!
请问你用的什么系列的芯片?
你说的芯片会一段时间之后复位?如果你for中不加延时,或者延时搞小点喂狗,看看是否还会复位。
该用户从未签到主题帖子积分
楼主要看一下配置的看门狗的最长喂狗时间。不要超过这个时间。
该用户从未签到主题帖子积分
注册会员, 积分 76, 距离下一级还需 124 积分
注册会员, 积分 76, 距离下一级还需 124 积分
我用的是飞思卡尔K22FX512,我的延时实际是用定时器实现的,当定时到喂狗,这里写的delayMS只是在这里表示一下延时。
该用户从未签到主题帖子积分
注册会员, 积分 76, 距离下一级还需 124 积分
注册会员, 积分 76, 距离下一级还需 124 积分
楼主要看一下配置的看门狗的最长喂狗时间。不要超过这个时间。
我看门狗定时器使用的是系统LPO定时器,时间应该是1ms,设置超时时间的寄存器是WDOG_TOVALH和WDOG_TOVALL分别是16位,按照常理来说60S的时间应该是够的吧!
该用户从未签到主题帖子积分
注册会员, 积分 76, 距离下一级还需 124 积分
注册会员, 积分 76, 距离下一级还需 124 积分
楼主你好!
请问你用的什么系列的芯片?
你说的芯片会一段时间之后复位?如果你for中不加延时,或者延时搞 ...
我用的是飞思卡尔K22FX512,我的延时实际是用定时器实现的,当定时到喂狗,这里写的delayMS只是在这里表示一下延时。我试过20S喂狗一次也会出现复位的情况,有没有可能是我的时间计算的有问题!
该用户从未签到主题帖子积分
我用的是飞思卡尔K22FX512,我的延时实际是用定时器实现的,当定时到喂狗,这里写的delayMS只是在这里表示 ...
你在main函数之前做了多少事情?
如果上来就是使能看门狗,并且在进入main之前就做了很多的事情,导致没进入看门狗配置就复位也是可能的。
你debug看看,是不是能进入到看门狗初始化之后不复位。
该用户从未签到主题帖子积分
注册会员, 积分 76, 距离下一级还需 124 积分
注册会员, 积分 76, 距离下一级还需 124 积分
你在main函数之前做了多少事情?
如果上来就是使能看门狗,并且在进入main之前就做了很多的事情,导致没 ...
初始化之前确实有很长一段时间在初始化,现在已经解决,非常感谢版主,大赞!!!
该用户从未签到主题帖子积分
初始化之前确实有很长一段时间在初始化,现在已经解决,非常感谢版主,大赞!!! ...
问题解决了就好!
所以,通常要使用看门狗,直接在上电之后的地方开启配置看门狗,防止其他代码执行时间长导致看门狗复位永远进不了看门狗初始化。
Tel: 3-8069
版权所有@苏州灵动帧格网络科技有限公司
Powered by2007年4月 硬件/嵌入开发大版内专家分月排行榜第二2004年4月 硬件/嵌入开发大版内专家分月排行榜第二
2004年3月 硬件/嵌入开发大版内专家分月排行榜第三
本帖子已过去太久远了,不再提供回复功能。关于看门狗的问题
在学习STM32单片机看门狗,发现俩个,独立和窗口看门狗,仔细研究了以后,各有千秋呀。
在看了丰田汽车的事故之后,我从中学到,不要在硬件中断中喂狗。经典错误:硬件中断喂狗,其实当时我不懂。
原子回复一位仁兄的话:
“定时器还能继续运行,说明没有跑飞,至少没死机.&
如果你一定要判断特定的程序,那就不要用定时器喂狗.&
直接在代码里面喂狗.这样,只要你这个代码不运行了,那就自然是复位了.”
另一位仁兄的话:
STM32/STM8都有一个号称窗口看门狗,一个独立看门狗;独立看门狗有如其它MCU的看问狗,如果过晚喂狗则会产生复位,而窗口看门狗则是过早或过晚喂狗都会产生复位,比如可以设定前10ms,不允许喂狗,10ms~20ms间则可以喂狗,20ms后不喂狗也会复位。据说可以对于程序跑飞后再跑回来,或是跑飞后处也有喂狗的情况进行复位,其稳定及可靠性比一般看门狗强,但具体怎么用呢?请大伙讨论讨论
回答者:不是的,我知道的是,对于程序跑飞了再跑回的情况,窗口看门狗是有起作用的,但是对于跑飞后处也有喂狗的情况,不够了解,特别是多任务如何处理这个狗,真是头痛!
个人想法:对于单任务系统,可以通过软件仿真加以条件模拟(比如对if判断条件进行模拟)得出各条路径执行的时间,得出其最小值,然后配置窗口看门狗,使得程序不得随便飞。但多任务如何处理,实在麻烦呀!
来子网络侧的东西:.cn/s/blog_dcisxs.html
了解两种看门狗(我叫它:系统运行故障探测器和独立系统故障探测器,新手往往被这个并不形象的象形名称搞糊涂)之间的区别和基本用法。
都是用来探测系统故障,通过编写代码定时发送故障清零信号(高手们都管这个代码叫做“喂狗”),告诉它系统运行正常。一旦系统故障,程序清零代码(“喂狗”)无法执行,其计数器就会计数不止,直到记到零并发生故障中断(狗饿了开始叫唤),控制CPU重启整个系统(不行啦,开始咬人了,快跑……)。
独立看门狗Iwdg——我的理解是独立于系统之外,因为有独立时钟,所以不受系统影响的系统故障探测器。(这条狗是借来的,见谁偷懒它都咬!)主要用于监视硬件错误。
窗口看门狗wwdg——我的理解是系统内部的故障探测器,时钟与系统相同。如果系统时钟不走了,这个狗也就失去作用了。(这条狗是老板娘养的,老板不干活儿他不管!)主要用于监视软件错误。
&&&初始化函数定义:鉴于两只狗作用差不多,使用过程也差不多初始化函数栓一起了,用的时候根据情况删减。
void WDG_Configuration(void);
&&&初始化函数调用:
WDG_Configuration();
&&&初始化函数
void WDG_Configuration()&
//看门狗初始化
//软件看门狗初始化
&&WWDG_SetPrescaler(WWDG_Prescaler_8);
//时钟8分频4ms
// (PCLK1/4 Hz (~4 ms)
&WWDG_SetWindowValue(65);&
&&&//计数器数值
&&WWDG_Enable(127);&
//启动计数器,设置喂狗时间
// WWDG timeout = ~4 ms * 64 = 262 ms
&WWDG_ClearFlag();&
//清除标志位
&&WWDG_EnableIT();&
&&&//启动中断
//独立看门狗初始化
&&IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);//启动寄存器读写
&&IWDG_SetPrescaler(IWDG_Prescaler_32);//40K时钟32分频
&&IWDG_SetReload(349);&
&&&//计数器数值
&&IWDG_ReloadCounter();&
//重启计数器
&&IWDG_Enable();&
&&&//启动看门狗
&&&RCC初始化:只有软件看门狗需要时钟初始化,独立看门狗有自己的时钟不需要但是需要systic工作相关设置。
RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG,
&&&独立看门狗使用systic的中断来喂狗,所以添加systic的中断打开代码就行了。软件看门狗需要在NVIC打开中断添加如下代码:
&&NVIC_InitStructure.NVIC_IRQChannel
= WWDG_IRQC //通道
&&NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority
= 0; //占先中断等级
&&NVIC_InitStructure.NVIC_IRQChannelSubPriority
&//响应中断优先级
&&NVIC_Init(&NVIC_InitStructure);&
&//打开中断
&&&中断程序,软件看门狗在自己的中断中喂狗,独立看门狗需要使用systic的定时中断来喂狗。以下两个程序都在stm32f10x_it.c文件中。
void WWDG_IRQHandler(void)
&&WWDG_SetCounter(0x7F);&
//更新计数值
WWDG_ClearFlag();&
&//清除标志位
void SysTickHandler(void)
{&&IWDG_ReloadCounter();&
&//重启计数器(喂狗)
&&&注意事项:
&&&有狗平常没事情可以不理,但是千万别忘了喂它,否则死都不知道怎么死的!
&&&初始化程序的调用一定要在systic的初始化之后。
&&&独立看门狗需要systic中断来喂,但是systic做别的用处不能只做这件事,所以我写了如下几句代码,可以不影响systic的其他应用,其他systic周期代码也可参考:
第一步:在stm32f10x_it.c中定义变量
int Tic_IWDG;&
&&&//喂狗循环程序的频率判断变量
第二步:将SysTickHandler中喂狗代码改为下面:
Tic_IWDG++;& &&
//变量递增
if(Tic_IWDG&=100)&
//每100个systic周期喂狗
{&&IWDG_ReloadCounter();//重启计数器(喂狗)
&&Tic_IWDG=0;&
//变量清零
1)独立看门狗没有中断,窗口看门狗有中断
2)独立看门狗有硬件软件之分,窗口看门狗只能软件控制
3)独立看门狗只有下限,窗口看门狗又下限和上限
4)独立看门狗是12位递减的。窗口看门狗是7位递减的
5)独立看门狗是用的内部的大约40KHZ RC振荡器,窗口看门狗是用的系统时钟APB1ENR
以上是我总结的
接下来我们介绍一下独立看门狗和窗口看门狗,这里我们就不讲解程序了,很简单的,配置一下寄存器就可以使用了。
独立看门狗没有中断功能,只要在计数器减到0(下限)之前,重新装载计数器的值,就不会产生复位,独立看门够有硬件和软件之分,硬件是通过烧写器的“设定选项几节等”配置,一旦开启了硬件看门狗,那么就停不下来了,只能在重新配置“设定选项几节等”才能关掉硬件看门狗,软件看门狗只需要设置IWDG-&KR=0XCCCC;就可以启动看门狗了,软件狗可以在系统复位时关掉,如果在在初始化里开启软件看门狗,那就开启了软件看门狗,
独立看门狗是12位递减的寄存器,使用片子内部的RC振荡器,这个振荡器是关不掉的。
窗口看门狗有中断,这个中断的作用是在计数器达到下限0x40的时候,产生中断,让你喂狗,如果你不喂狗,计数器的值变为0x3f的时候,将会产生系统复位,即使是喂狗,也应该在中断里快速喂狗,要不时间长了计数器减一也会变成0x3f产生复位,这个时间根据芯片手册的公式进行计算即可得到,窗口看门狗只有软件开启方式,还有一个上限值,这个值如果大于计数器的初始值,那么就没有任何作用了,这个值小于计数器的初始值得时候,当计数器的值大于上限值时你对计数器进行装载,将会产生复位,只有在计数器减到小于上限值时,你才能重新装载计数器,意思就是说只有计数器的值在上限值和下限值之间你才能装载计数器,否则就会产生系统复位,当上限值小于下限值,也没有意义。
独立看门狗Iwdg——我的理解是独立于系统之外,因为有独立时钟,所以不受系统影响的系统故障探测器。主要用于监视硬件错误。
窗口看门狗wwdg——我的理解是系统内部的故障探测器,时钟与系统相同。如果系统时钟不走了,这个狗也就失去作用了。主要用于监视软件错误。
以下是经过测试发现的:
//发现1:当窗口值大于等于计数器的值,无论怎么更改配置的顺序,都是正确的运行结果
//发现2:当窗口值小于计数器的值,顺序一旦改变就运行错误
经过测试发现,当初始化的顺序不是正常顺序的话,就会把WWDG-&SR置一,为什么我也不知道,谁知道片子里面怎么搞的
你在开启中断就进入中断的,这时你又进行喂狗,就会复位的,因为这时计数器的值&上限窗口的值,所以会复位,所以就会一直出错下去
解决办法是,初始话的时候最后两句是先清除中断标志然后在开启中断,如果你不这么干,那么在初始化的时候很可能把WWDG-&SR
置位,那么你在开启中断,就会毫不犹豫的进入中断,你在中断重装计数器值得时候,就会产生复位
独立看门狗:
&1)取消寄存器写保护(向IWDG_KR
写入0X5555)&
& 通过这步,我们取消IWDG_PR 和IWDG_RLR
的写保护,使后面可以操作这两个寄存器,&
设置IWDG_PR 和IWDG_RLR
的值。这在库函数中的实现函数是:&
IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);&
这个函数非常简单,顾名思义就是开启/取消写保护,也就是使能/失能写权限。&
& 2)设置独立看门狗的预分频系数和重装载值&
& 设置看门狗的分频系数的函数是:&
& void IWDG_SetPrescaler(uint8_t IWDG_Prescaler);
//设置IWDG 预分频值&
& 设置看门狗的重装载值的函数是:&
& void IWDG_SetReload(uint16_t Reload); //设置IWDG
& 设置好看门狗的分频系数prer
和重装载值就可以知道看门狗的喂狗时间(也就是看门狗溢&
出时间),该时间的计算方式为:&
& &Tout=((4 &2^prer) &rlr)
& 其中Tout 为看门狗溢出时间(单位为ms );prer 为看门狗时钟预分频值(IWDG_PR
范围为0~7;rlr 为看门狗的重装载值(IWDG_RLR
& 比如我们设定prer 值为4,rlr 值为625,那么就可以得到Tout=64
&625/40=1000ms,这样,&
看门狗的溢出时间就是1s,只要你在一秒钟之内,有一次写入0XAAAA
&到IWDG_KR,就不&
会导致看门狗复位(当然写入多次也是可以的)。这里需要提醒大家的是,看门狗的时钟不是准&
确的40Khz,所以在喂狗的时候,最好不要太晚了,否则,有可能发生看门狗复位。&
& 3)重载计数值喂狗(向IWDG_KR
写入0XAAAA)&
& 库函数里面重载计数值的函数是:&
& IWDG_ReloadCounter(); //按照IWDG
重装载寄存器的值重装载IWDG 计数器&
& & 通过这句,将使STM32
重新加载IWDG_RLR 的值到看门狗计数器里面。即实现独立看门&
狗的喂狗操作。&
& & 4) 启动看门狗(向IWDG_KR
写入0XCCCC)&
库函数里面启动独立看门狗的函数是:&
& & IWDG_Enable();
//使能IWDG&
& & 通过这句,来启动STM32
的看门狗。注意IWDG 在一旦启用,就不能再被关闭!想要关&
闭,只能重启,并且重启之后不能打开IWDG,否则问题依旧,所以在这里提醒大家,如果不&
用IWDG 的话,就不要去打开它,免得麻烦。&
窗口看门狗:
& 1)使能WWDG 时钟&
&不同于IWDG,IWDG &有自己独立的40Khz
&时钟,不存在使能问题。而WWDG&
使用的是PCLK1 的时钟,需要先使能时钟。方法是:&
RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE);
& &// WWDG
2)设置窗口值和分频数&
设置窗口值的函数是:&
WWDG_SetWindowValue(uint8_t WindowValue);&
这个函数就一个入口参数为窗口值,很容易理解。&
设置分频数的函数是:&
WWDG_SetPrescaler(uint32_t WWDG_Prescaler);&
这个函数同样只有一个入口参数就是分频值。&
& & 3)开启WWDG
中断并分组&
& & 开启WWDG
中断的函数为:&
& & WWDG_EnableIT();
//开启窗口看门狗中断&
接下来是进行中断优先级配置,这里就不重复了,使用NVIC_Init()函数即可。&
4)设置计数器初始值并使能看门狗&
这一步在库函数里面是通过一个函数实现的:&
& & void WWDG_Enable(uint8_t
Counter);&
该函数既设置了计数器初始值,同时使能了窗口看门狗。&
5)编写中断服务函数&
在最后,还是要编写窗口看门狗的中断服务函数,通过该函数来喂狗,喂狗要快,否则当&
窗口看门狗计数器值减到0X3F
&的时候,就会引起软复位了。在中断服务函数里面也要将状态&
寄存器的EWIF 位清空。&
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

我要回帖

更多关于 解决这个问题 英文 的文章

 

随机推荐