【楼主位】 fewer003
总结了引起AVR单片机死机重启的原因,希望能起到抛砖引玉的效果,也希望同行能够补充
当碰到总复位的问题时,我们可以读取MCUCSR来确定复位原因,总的原则是先软后硬(先排除软件的问题,后再查找是否是硬件的问题),先简单后麻烦(先排除容易更换的芯片和器件,后排除比如贴片的单片机),先易(出错)后难(出错)
我是个新手,只总结了一点点,一些自己没碰到,是在查自己单片机总复位的原因时找到的,如不准确,请指正。最近在用MEGA64L做一个项目,这是我第一次独立做项目,又是新手,难免磕磕碰碰,上周一就废话少说,进入正题吧。
1.看门狗未按时喂狗,时间溢出即复位。这样的复位会间隔时间固定,要看具体型号的单片机的看门狗的设置了。解决方法,及时喂狗,或者关掉看门狗(注:像MEGA64一类的高级别的单片机,若工作在模式2是关不掉的,详细请看DATASHEET);
2.电源不稳定。因此而复位的时间不会太确定,当系统的工作功率变大或者电压不稳时会引发掉电复位,除了可以读取MCUCSR来确定,也可以用示波器来查看。解决方法:更改或完善电源部分的设计;
3.开中断未有中断服务程序。这种情况我未碰到,是同行遇见过的。解决方法:写好中断程序,或者关掉中断^_^;
4.中断中调用太多的函数及调用深度太大,这样会引起堆栈溢出,程序便会跑飞,死机或复位。解决方法:不要调用太多的函数,可以设置标志位,或者干脆写在中断里边;
5.晶振损坏。这是我遇到的问题,原先没有怀疑晶振的问题,排除了软件及电源部分,但我始终找不到复位的原因,最后没有办法,抱着换晶振不行就再换
MCU的情况下试试,结果问题就解决了,教训啊!!!仔细想想也是,如果系统的频率不稳定了,死机跟复位是应该的,还是想请教一下马老师对此的看法?
暂时就这么多,请同行前辈们补充指正!
---------------------------------------------------
【3楼】 zxq6 小马哈
我碰到过,是寄存器没有设置对。估计就是第三条吧,仿真的时候系统就一直在一个延时函数里面非正常跳转。当时很是郁闷,因为我以前从来不怀疑程序会引起系统跑飞。
呵呵,看来以后写程序需要规范些了。
---------------------------------------------------
【10楼】 fewer003
看看堆栈是不是溢出了?
阅读(9389) | 评论(0) | 转发(0) |