产品选型

单片机死循环 单片机为什么会“死机”?看门狗来帮助你

小编 2024-10-22 产品选型 23 0

单片机为什么会“死机”?看门狗来帮助你

我玩单片机的过程中大大小小肯定都会遇到一些问题,不遇到问题是不可能的,出现问题肯定是板子某一个部分出了问题;单片机出现死机的情况也分为很多种,电压的地不稳定、元器件干扰、短路、断路等都会导致单片机故障程序无法运行。下面几种现象都是会造成单片机出问题的故障。

1.出现“跑飞”这种情况是因为程序有一定的隐患或被外部元器件干扰造成的错误动作,导致单片机被写入“出界”数据,程序跑到了RAM区或者跑到了FLASH的空白区。如果PC指向了FLASH空白区,则可以事先将所有FLASH空白区填入某个你想要的数据,迫使程序译码器在这里翻译出你想要的指令,按照我们想要的方式去处理。如果单片机指向了RAM区,那情况就会不一样;因为程序译码器可能得到任意译码结果。

2.“死机”是指单片机进入了“死循环”,或者是MCLK等于近似为零的值。此时,要想救活MCU,就只有复位。这时我们就需要用看门狗了,看门狗的作用是:当程序在某种意外情况下,这时就没办法去”喂狗“,一旦持续某个门槛时间(比如20ms)还没有”喂狗“,那么看门狗就把单片机复位。

程序运行过程中,如果MCU电源出现问题(电源供电问题,或其它外部电路引起的电源扰动),比较容易出现“跑飞”现象。程序跑飞应该是单片机出错了;软件和硬件都可能出这样的问题。

死机一般情况下是CPU根本没有运行,很大的概率是硬件方面的问题造成的,如果复位不成功,430比较容易出现掉电不完全后重新上电。

死机我们通常是指CPU的程序指针进入一个死循环,无法按照我们编入的逻辑执行正常的程序流程。我们直接观察到的现象是:正常功能丧失,按键无反应,显示进入定格状态。单片机死机后,只有复位才能走出死循环,执行正常的程序流程。玩单片机的都知道解决死机的最有效手段是加看门狗(WatchDog)。

目前用得最广泛的看门狗实际上是一个特殊的定时器DogTimer。DogTimer按固定速率计时,计满预定时间就发出溢出脉冲使单片机复位。如果每次在DogTimer溢出前强行让DogTimer清零,就不会发出溢出脉冲。清零脉冲由CPU发出,在单片机程序中每隔一段语句放一个清DogTimer的语句--FeedDog语句,以保证程序正常运行时DogTimer不会溢出。

不是说加了看门狗,单片机就不会死机具体要看你怎么去用。实际上,看门狗有时间会完全失效。当程序进入某个死循环,而这个死循环中又包含FeedDog语句,这时DogTimer始终不会溢出,单片机始终得不到复位信号,程序也就始终跳不出这个死循环。

双时限看门狗有两个定时器;一个为短定时器,一个为长定时器。短定时器定时为T1,长定时器定时为T2,0。当程序进入某个死循环,如果这个死循环包含短定时器FeedDog语句而不包含长定时器FeedDog语句,那么长定时顺终将溢出,使单片机复位。通过编写程序安排长定时器FeedDog语句的位置,可保证出现死机的概率很低。

定时复位看门狗就是定时地让单片机强行复位。这样,即使装置死机,其最大死机时间也不会大于定时器定时时间。只要硬件没有出现问题,看门狗就可以保证单片机不会长时间死机。

希望以上的知识能够给大家提供帮助,这期我们先分享到这里,觉得有用的可以给华维点个赞关注一下!

想要一起学习单片机的朋友,评论”我要入门“,有惊喜,加入我们,就可以与导师一对一互动,快速成长

单片机C语言基础入门第七章:单片机C程序的编写

大家好,今天我们就开始了单片机C程序的编写。首先,由于搬家后一直不能办理上网的事情,所以耽误了到了今天才把这章发出来,实在抱歉。言归正传,我们在前边学习过单片机的开发流程并且介绍了C语言的表达式和语句的表达,对函数也进行了介绍,有了这些认识我们就可以真正的根据要求编写程序进行单片机的开发了。下面我们细致的分析一下单片机C程序的编写以及再熟悉一下开发的流程。

下面我们以STC的51单片机为例,其开发环境是用keil V4,烧写软件是STC官网的ISP软件。首先打开keil新建工程,然后选择单片机的型号,由于在前面部分都介绍过,因此在这里就不在重复过程了,新建工程选好器件后我们就开始编写单片机程序了。如果我们直接就用手册里面的寄存器去操作,发现编译的时候会报错误,如下所示:

voiddelay()

{

unsigned char i,j;

for(i=0;i<=250;i++)

for(j=0;j<=200;j++);

}

voidmain()

{

while(1)

{

P1^0=0;

delay();

P1^0=1;

delay();

}

}

从编译的结果我们可以看到有错误出现,报错的原因是undefined identifier(未定义的标识符),为什么会有这么错误呢?我们不是完全按照手册上来的吗,怎么会出现错误呢?这是因为我们在前面没有定义P1^0,而直接进行了赋值,编译器当然认为这是错误的,但是又有个问题,如果我们定义了P1^0那也是个变量,撑死是个内存的数据,这又是怎么和硬件的控制联系在一起的呢?为了解答这个问题我们还得看仔细看一下单片机的手册,看看有没有相关的信息呢。如下图是51单片机RAM的地址分布图:

从图中可以看到,单片机的特殊功能寄存器也在RAM的地址中,换句话讲就是这些特殊功能寄存器也是RAM的一部分,我们如果知道了其所在的地址,然后我们对其进行操作那么就能够实现对硬件的控制,下面是从51单片机手册上得到的特殊功寄存器的地址和功能:

那么我们实现定义变量的话就应该不会出现问题了,那么我们可以将上面的程序修改:

sfr P1=0x90;

sbit P10=P1^0;

void delay()

{

unsigned char i,j;

for(i=0;i<=250;i++)

for(j=0;j<=200;j++);

}

void main()

{

while(1)

{

P10=0;

delay();

P10=1;

delay();

}

}

在修改后的程序中,我们先定义P1,然后在定义P1^0,这样在编译过程中就不会再报错误了。

实际单片机的厂商已经将这些头文件编写成了.h文件,我们只要将头文件包含进来就能用了,如下所示:

如上图所示,我们只需要在开头的位置添加#include<stc15.h>这条预编译指令,即使不在定义P0和P1^0也能够通过编译,这是因为在我们包含的头文件中已经定义了我们需要的变量以及相对应的地址,这是芯片厂商编写的头文件。

上面就是包含的头文件的内容,感兴趣的可以去看一下头文件,里面定义的寄存器的名称,可以认为这个文件是软件和硬件连接的一个接口,实现了硬件和软件的连接目的,让用户可以忽略硬件的地址,直接对变量进行操作就可以。

然后单片机程序采用while(1)死循环的目的是将程序代码这个空间内循环,并根据设计者的需求跳转,而不是跳来跳去。

将上面编译好的程序生成HEX文件后,烧录到单片机的ROM内,然后看到P1^0的输出信号是一个产生频率为12Hz的50%方波如下所示:

添加头文件以后,在以后的编程中就根据手册的寄存器的控制就可以了,这样就可以基本可以对单片机进行开发了,通过单片机产生波形也行也好,实现控制也好,只要根据手册上对特殊寄存器的操作来实现对硬件的控制。

最后还希望大家多多阅读好好的层序源码来提高程序的编写能力,谢谢大家。

如果你觉得本文不错,请点个赞吧,你们的认可是我们奋斗的动力,谢谢!

相关问答

当mcs-51 单片机 运行出错或程序陷入 死循环 时,如何来摆脱困境?

按一下RST(reset),复位。除了P0到P3口复位为0FFH外,其他基本都为00H。检查下错误的地方好了,或者按STK,单步追踪,发现错误在哪,或者设置断点。按一下RST(res...

为什么国外的工程师在给 单片机 死循环 时喜欢用for(;;) 而不是while(1)?

1、首先,这两个语句的含义和功能都一样,都是进入死循环。2、第二,很多人都是习惯上使用某一种,很少去深究这两者到底有什么区别。3、在循环体内有具体代码...

单片机 串行程序不工作?

单片机不工作,稍微有点基础的人都会去查电源、晶振等硬件及源代码,关键是具体到一个特定项目(系统)怎么去查,就此做一些个人经验介绍。1.单片机本身就是集...

单片机 处于混乱状态怎么办?

如果单片机处于混乱状态,首先需要停止程序的执行并重新启动单片机。如果问题仍然存在,可以检查程序是否存在编程错误或者硬件是否存在故障。如果没有找到问题,...

怎么样往 单片机 里烧程序-ZOL问答

哈哈,开个玩笑,单片机烧程序,要用到刻录器(有通用和专用),PC端对应刻录器的刻录软件(一般买刻录器时就配有光盘),和编译好的单片机程序。一般在刻录器上插上单...

单片机 里面什么是看门狗?如何实现系统程序的监控?

看门狗其实是一个特别的定时器看门狗的英文是WatchDogTimer。其实就是单片机内置的一个定时器,如果定时器溢出,可以让单片机复位重启,可以避免程序跑飞或者...

单片机 c语言中的delay_ms(250) 是什么意思-ZOL问答

这是一个死循环,就是单片机会一直执行while(1)语句里面的程序,软件调试出来的时间也就是延时函数调用到调用结束所用的时间通过看汇编指令计算得出汇编指令...

单片机 何时执行中断函数?

[回答]#define_1231_C_#include"reg51.h"#include"1231.h"//sbitOE=P2^3;unsignedintS...

如何解决PIC 单片机 硬件死锁的问题?

pic工业级标准而且是精简指令集不会死循环的哦,可能是你硬件电路设计的有问题,如果程序死循环那就要修改程序逻辑哦pic工业级标准而且是精简指令集不会死...

单片机 按键复位程序怎么写?

硬复位:用按键把单片机的复位脚(或电源)短接到地;软复位:1.把按键功能做成IO电平变化中断,进中断入口后,人为让程序跳转到程序初始化,起到复位的效果...硬...

猜你喜欢