历史上的今天
今天是:2025年05月18日(星期日)
2018年05月18日 | AVR中的定时器喂狗的作用
2018-05-18 来源:eefocus
在由单片机构成的微型计算机系统中,由于单片机的工作常常会受到来自外界电磁场的干扰,造成程序的跑飞,而陷入死循环,程序的正常运行被打断,由单片机控制的系统无法继续工作,会造成整个系统的陷入停滞状态,发生不可预料的后果,所以出于对单片机运行状态进行实时监测的考虑,便产生了一种专门用于监测单片机程序运行状态的芯片,俗称"看门狗"(watchdog)。
其次,看门狗的工作原理是什么?
在系统运行以后也就启动了看门狗的计数器,看门狗就开始自动计数,如果到了一定的时间还不去清看门狗,那么看门狗计数器就会溢出从而引起看门狗中断,造成系统复位。所以在使用有看门狗的芯片时要注意清看门狗(俗称喂狗)。
AVR中的定时器和其他所有的单片机定时器大同小异,看门狗的作用也是如此,在大多数项目中,开发人员一般都是为了省事而将看门狗直接静默,但是这样一旦出现外部影响或者一些非人力因素导致的跑飞、程序死机,会导致单片机不能再自动的重启。
在一般的使用中,我们在init.c中对看门狗进行初始化//一般不建议直接静默,而应该设置一个看门狗定时器的阈值
void wdtinit(void)
{
#asm("wdr")
WDTCR=0x1F;
WDTCR=0x0F;
}
然后在主函数进行一个喂狗操作。
void main()
{
...
while(1)
{
wdtflag=1; //喂狗
...
}
}
的确,这样一般的情况下都可以避免单片机的非正常死机。但是在高低温实验(见博主前文)或者其他的时候,不可避免的会导致单片机的异常重启,尤其是在程序运行时间大致等于看门狗定时器的情况下。
除了在中断进行喂狗,一个比较好的办法就是在定时器中进行喂狗操作,这样可以避免中断函数进入后子函数太长而导致程序运行时间大于看门狗定时器的时间的情况
interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{
...
wdtflag=1;
...
}
下一篇:AVR 启动时间 设置方法
史海拾趣
|
我现在的WIFE登录后,重新开机发现不能记住上次我成功登录的网络,密码也不会记,用户使用起来很麻烦。 我也看到别人的机器上能够保存,我找了一下,好象是在PUBLIC下面的NETUI里面实现的,不知道哪位仁兄做过,赐教一下 或是微软有更新过这里, ...… 查看全部问答> |
|
如题,var myTextField=document.getElementById(\"myText\"); 这个没法实现。要是能实现该如何做? 看了yudong54的回帖(http://topic.eeworld.net/u/20091116/14/1b2cc357-3aea-4329-b527-ab7828142f8f.html?26416)说要打08年的补丁和09年一月 ...… 查看全部问答> |
|
大家好. 我碰到了一个vxworks中打印机方面的问题.我的目标机是pc486, TornadoV2.02, 24针老式打印机EPSON LQ-1600K,用telnet 进行连接调试.BUILD中包含了并口组件.现在我想要让打印机打出一些测试文字,然后我写了一小段代码 ******************** ...… 查看全部问答> |
|
承接电子设计(单片机)项目 (一)、PCB LAYOUT(2层 or 4层) 老牛承接专业抄板、画板,质优价廉,可每天查看画板进度,有问题及时沟通。 可加我QQ看画过的样板,因为老牛是个人接活,所以价钱肯定比抄板公司低,希望各位同行有活之余多多照顾。 ...… 查看全部问答> |
|
reg=get_datas_bit(7654321,6); 该函数在main下掉用,返回的reg=6; 但从子函数中经过1个if,2个switch后掉用后返回的reg=0; 函数如下: u8 get_datas_bit(u32 datain,u8 sp) { u8 i,value; &nb ...… 查看全部问答> |
|
最近在使用TI的stellaris的芯片,项目主要用来做系统的控制模块,M3的外设基本都用到了,后面一点点总结各个模块简单的用法,并附上之前搜集和学习的资料,方便大家学习特别适合新手的入门学习,共同进步吧,感觉自己也还属于菜鸟级的呢,同时也感 ...… 查看全部问答> |
|
【每周讨论】这样一个活动是否有必要继续下去? 谢谢各位朋友的热情支持。【每周讨论】已经持续到现在。昨晚我就在纠结,出个什么题目呢?这个问题我思考了很久,大家都知道现在这个活动已经脱离了最初发动时的意义了。因为现在所有的题目都是我一 ...… 查看全部问答> |




