2008-01-17 16:14:00 mybirdsky 阅读数 521
  • 单片机控制第一个外设-LED灯-第1季第6部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第1季第6个课程,主要讲解LED的工作原理和开发板原理图、实践编程等,通过学习目的是让大家学会给单片机编程控制LED灯,并且为进一步学习其他外设打好基础。

    4006 人正在学习 去看看 朱有鹏
2006-05-13 21:32:33

字体变小 字体变大

摘要:文章指出了一种广泛流传的误解:在MCS-51系列单片机中,只要用指令使程序从起始地址开始执行,就可以复位单片机,摆脱干扰。通过一个简单的实验,揭示了软件复位的可靠方法。

  有的单片机(如8098)有专门的复位指令,某些增强型MCS-51系统单片机虽然没有复位指令,但片内集成了WATCHDOG电路,故抗干扰也不成问题。而普及型MCS-51系列单片机(如8031和8032)既然无复位指令,又不带硬件WATCHDOS,如果没有外接硬件WATCHDOG电路,就必须采用软件抗干扰技术。常用的软件抗干扰技术有:软件陷阱、指令冗余、软件WATCHDOG等,它们的作用是在系统受干扰时能及时发现,再用软件的方法使系统复位。所谓软件复位就是用一系列指令来模仿复位操作,这就是MCS-51系列单片机所特有的软件复位技术。

  现用一简单的实验说明,实验电路如附图所示。接于仿真插座P1.0的发光二极管LED0用来表示主程序的工作情况,接于P1。1的发光二极管LED1用于表示低级中断子程序的工作情况,接于P1。2的发光二极管LED2用来表示高级中断子程序的工作情况,接于P3。2口的按钮用来设立干扰标志,程序检测到干扰标志后故意进入死循环或掉进陷井,模仿受干扰的情况,从而检验各种复位方法的实际效果。寮验初始化程序如下:

ORG 0000H
STAT: LJMP MAIN ;复位入口地址
LJMP PX0 ;按钮中断向量(低级中断)
ORG 000BH
LJMP PT0 ;t0中断向量(低级中断)
ORG 001BH
LJMP PT1 ;T1中断向量(高级中断)
ORG 0030H
MAIN:
CLR EA
MOV SP,#7
MOV P1,#0FFH
MOV P3,#0FFH
MOV TMOD,#11H
CLR 00H ;干扰标志初始化
SETB ET0
SETB ET1
SETB EX0
SETB PT1
SETB TR0
SETB TR1
SETB EA
LOOP: CPL P1.0 ;主程序发光二极管LED闪烁
MOV R6,#80H
MOV R7,#0
TT1:
DJNZ R7,TT1
DJNZ R6,TT1
SJMP LOOP
PX0:
SETB 00H ;设立干扰标志,模拟发生干扰
PT0: CPL P1.1 ;低级中断程序发光二极管LED1闪烁
RETI
PT1: CPL P1.2 ;高级中断程序发光二极管LED2闪烁
RETI
END

实验步骤如下:

1. 按上述程序启动执行,三个发光二极管都应闪烁(否则应先排除故障),表示主程序和各中断子程序正常。因模拟干扰标志未加检测,故不受按钮影响。

2. 修改主程序如下,按下按钮后主程序即掉入死循环中。
LOOP: CPL P1.0
MOV R6,#80H
MOV R7,#0H
TT1: DJNZ R7,TT1
DJNZ R6,TT1
JNB 00H,LOOP ;受干扰否?
STOP: LJMP STOP ;掉入死循环。
这时可以看到,主程序停止工作(LED0停止闪烁),而两个中断子程序继续运行(LED1和LED2继续闪烁)。

3. 将定时器T1妆作软件WATCHDOG,将30H单元用作软件WATCHDOG计数器。主程序中加入一条复位软件WATCHDOG的指令。
LOOP: CPL P1.0
MOV 30H,#0 ;复位软件WATCHDOG计数器
LOOP: CPL P1.0
MOV R6,#80H
MOV R7,#0H
TT1: DJNZ R7,TT1
DJNZ R6,TT1
JNB 00H,LOOP ;受干扰否?
STOP: LJMP STOP ;掉入死循环。
T1中断子程序修改如下:
PT1: CPL P1.2 ;高级中断程序发光二极管闪烁
INC 30H
MOV A,30H
ADD A,#0FDH
JC ERR ;达到3次否?
RETI
ERR: LJMP STAT ;软件WATCHDOG动作

  当按下按钮前,程序正常运行(三个LED全闪)。按下按钮后,主程序能迅速恢复工作,但两个中断子程序被封锁,不再工作。过程如下:主程序检测到干扰后进入死循环,不能执行复位30H单元的操作,T1中断使30H不断增值,计数到3时,软件WATCHDOG执行动作,执行一条LJMP指令,使程序从头执行。MAIN过程中清除了干扰标志(表示干扰已经过去),使主程序迅速恢复工作。按理说MAIN过程中也重新设定了各个中断,并开放了它们,为什么中断不能恢复工作呢?这是因为中断激活标志的复位工作被遗忘了,因为它没有明确的位地址可供编程,直接转向0000H地址并不能完成真正的复位。软件复位是使用软件陷井和软件WATCHDOG后必须进行的工作,这时程序出错完全有可能发生中断子程序中,中断激活标志已置位,它将阻止同级中断响应。由于软件WATCHDOG是高级中断,它将阻止所有中断响应。由此可见,清除中断激活标志的得要性,很多文献的作者回为没有认识到这一点进入误区。

4. 在所有指令中,只有RETI指令能清除中断激活标志。出错处理程序ERR主要是完成这一功能,其它的善后工作交由复位后的系统去完成。为此,我们重新设计T1中断子程序如下所示:
PT1: CPL P1.2 ;高级中断程序发光二极管闪烁
INC 30H ;软件WATCHDOG计数器增值
MOV A,30H
ADD A,#0FD
JC ERR ;达到3次否?
RETI
ERR: CLR EA ;关中断
CLR A ;准备复位地址(0000H)
PUSH ACC
PUSH ACC
RETI ;清除中断激活标志并复位

  这段程序先关中断,以便后续处理能顺利进行,然后用RETI指令替代LJMP指令,从而既清除了中断激活标志又完成了转向0000H的任务。按这样改好后程序再运行,结果仍不理想:按下按钮后,有时只有主程序和高级中断子程序能迅速恢复正常,而低级中断仍有被关闭的可能。如果按如下方法把干扰转移到低级中断中,则按下按钮后低级中断必然被关闭:
LOOP: CPL P1.0
MOV R6,#80H
MOV R7,#0H
TT1: DJNZ R7,TT1
DJNZ R6,TT1
SJMP LOOP
PT0: CPL P1.1
JB 00H,STOP
RETI
STOP: LJMP STOP ;掉入死循环。
仔细分析后可能得出结论:当软件WATCHDOG是嵌套在低级中断中起作用时,复位后只清除了高级中断激活标志,低级中断标志仍然被置位,从而使低级中断一直被关闭。

5. 修改出错处理如下:
ERR: CLR EA ;正确的软件复位入口
MOV 66H,#0AAH ;重建上电标志
MOV 67H,#55H
MOV DPTR,#ERR1 ;准备第一次返回地址
PUSH DPL
PUSH DPH
RETI ;清除高级中断激活标志
ERR1: CLR A
PUSH ACC
PUSH ACC
RETI ;清除低级中断激活标志
这时,必须执行两次RETI,才能到达0000H,以保证清除全部中断激活标志,达到和硬件复位相同的效果。同样,软件陷井也必须由下列三条指令
NOP
NOP
LJMP STAT
改成:
NOP
NOP
LJMP ERR
才能达到目的。

  当主程序受到干扰被软件陷阱捕获时,中断标志并未置位,执行ERR过程中,RETI指令等效于RET指令,同样可以达到软件复位的目的。有兴趣的读者可以将软件陷阱代替死循环,分别用LJMP STAT和LJMP ERR1来替代LJMP ERR,再将干扰检测分别设在低级中断和主程序中,实验结果必然证明同:只有LJMP ERR才能万无一失地实现软件复位,使系统摆脱干扰同,恢复正常。在MCS-51单片机的软件复位过程中,必须连续执行两次中断返回指令RETI才能确保系统恢复正常。

2019-01-19 09:26:11 qq_20222919 阅读数 794
  • 单片机控制第一个外设-LED灯-第1季第6部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第1季第6个课程,主要讲解LED的工作原理和开发板原理图、实践编程等,通过学习目的是让大家学会给单片机编程控制LED灯,并且为进一步学习其他外设打好基础。

    4006 人正在学习 去看看 朱有鹏

最近在调试系统的时候,发现单片机老是复位,于是想着用程序来判断一个单片机的复位信号是来自于哪里。查找资料发现STM8单片机的复位源总共有9种

●NRST引脚产生的外部复位
● 上电复位(POR)
● 掉电复位(BOR)
● 独立看门狗复位
● 窗口看门狗复位
● 软件复位
● SWIM复位
● 非法操作码复位
● EMS复位:当一些关键的寄存器被破坏或错误加载时产生的复位

但是这9种复位源通过复位寄存器能看到的只有5种

复位状态寄存器(RST_SR)

位7:5 保留,必须保持为0。
位4 EMCF:EMC复位标志
位3 SWIMF:SWIM复位标志位
位2 ILLOPF:非法操作码复位标志位
位1 IWDGF:独立型看门狗复位标志位
位0 WWDGF:窗口型看门狗复位标志位
 

由于单片机没有用到看门狗,所以这两种看门狗复位用不到,SWIM复位是烧写程序或者仿真时用的。那就只剩下一个EMC复位、非法操作码复位可以判断。但是更希望看到的是单片机是电源不稳引起的掉电复位还是单片机复位引脚被干扰引起的NRST复位。但是寄存器中没有可以判断这两种复位源的标志位。那么能不能自己想办法来判断这两种复位源呢?

  首先分析一下掉电复位和NRST复位的区别,掉电复位也就是单片机完全断电,复位后内存中所有的东西会丢失。NRST复位时内存数据没有丢失,内存中的东西还是复位前存储的数据。那么根据这个特性是不是可以在内存中某个地址存数一个标志。复位后去读取这个标志,如果这个标志和存放的一样,说明单片机没有掉电,属于NRST复位。如果读取到的值不是存储的值那么说明单片机断电了,内存中存储的内容丢失了,属于掉电复位。那么这样就能区分开是掉电复位还是NRST复位了。

写个程序测试了一下,测试结果符合预期。

测试代码如下:

#include "iostm8s103F3.h"
#include "main.h"
#include "uart.h"
#include "stdio.h"

void SysClkInit( void )
{
    CLK_SWR = 0xe1;                  //HSI为主时钟源  16MHz CPU时钟频率
    CLK_CKDIVR = 0x00;               //CPU时钟0分频,系统时钟0分频
}

void main( void )
{
    __asm( "sim" );                             //禁止中断
    SysClkInit();
    Uart1_Init( 9600 );
    __asm( "rim" );                             //开启中断
    
    //复位源判断
    if( ( * ( u16* )( 0x000102 ) ) == 0x55 )    //判断0x000100这个地址中存储的值是不是0x55
    {
        printf( " key reset!\r\n" );                     //值等于0x55说明是程序写进去的,属于按键复位
    }
    else                                                        //如果这个地址的值不等于0x55 说明单片机是刚上电
    {
      printf( " power reset!\r\n" );                  //属于上电复位 然后将指定的值写入指定的地址,若单片机不断电,这个值就会一直保持不变
        * ( u16* )( 0x000102 ) = 0x55;
    }
    if( RST_SR_WWDGF )
    {
        printf( "wwdg reset!\r\n" );
    }
    if( RST_SR_IWDGF )
    {
        printf( "iwdg reset!\r\n" );
    }
    if( RST_SR_ILLOPF )
    {
        printf( "illop reset!\r\n" );
    }
    if( RST_SR_SWIMF )
    {
        printf( "swim reset!\r\n" );
    }
    if( RST_SR_EMCF )
    {
        printf( "emcf reset!\r\n" );
    }
    //WWDG_CR = 0x80;                    //启动独立看门狗
    //  IWDG_KR = 0xCC;                   //启动窗口看门狗
    while( 1 )
    {
    }
}


每次上电后先判断 0x000102 这个地址的值是不是0x55,如果不是说明单片机是刚上电,内存中的值是随机的。于是将0x000102这个地址中的值改为0x55,如果下一次单片机复位后读到这个地址的值是0x55的话,说明单片机没有掉电。属于复位引脚引起的复位。0x000102这个地址必须保证不会被程序用到,要不然在程序执行过程中值被改写,下次单片机复位后读到的值就不是0x55了。

其余的复位源直接去读取寄存器就可以了。

 

2018-09-23 14:28:13 huangmaiqiu2594 阅读数 5578
  • 单片机控制第一个外设-LED灯-第1季第6部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第1季第6个课程,主要讲解LED的工作原理和开发板原理图、实践编程等,通过学习目的是让大家学会给单片机编程控制LED灯,并且为进一步学习其他外设打好基础。

    4006 人正在学习 去看看 朱有鹏

 

/*****************************************分析 一***********************************************/

     一、高电平复位

     复位电路的工作原理 在书本上有介绍,51单片机要复位只需要在第9引脚接个高电平持续2us就可以实现,那这个过程是如何实现的呢?在单片机系统中,系统上电启动的时候复位一次,当按键按下的时候系统再次复位,如果释放后再按下,系统还会复位。所以可以通过按键的断开和闭合在运行的系统中控制其复位。      

        (1)、上电复位

        在电路图中,电容的的大小是10uf,电阻的大小是10k。所以根据公式,可以算出电容充电到电源电压的0.7倍(单片机的电源是5V,所以充电到0.7倍即为3.5V),需要的时间是10K*10UF=0.1S。也就是说在电脑启动的0.1S内,电容两端的电压时在0~3.5V增加。这个时候10K电阻两端的电压为从5~1.5V减少(串联电路各处电压之和为总电压)。所以在0.1S内,RST引脚所接收到的电压是5V~1.5V。在5V正常工作的51单片机中小于1.5V的电压信号为低电平信号,而大于1.5V的电压信号为高电平信号。所以在开机0.1S内,单片机系统自动复位(RST引脚接收到的高电平信号时间为0.1S左右)。    

      (2) 按键复位

       在单片机启动0.1S后,电容C两端的电压持续充电为5V,这是时候10K电阻两端的电压接近于0V,RST处于低电平所以系统正常工作。当按键按下的时候,开关导通,这个时候电容两端形成了一个回路,电容被短路,所以在按键按下的这个过程中,电容开始释放之前充的电量。随着时间的推移,电容的电压在0.1S内,从5V释放到变为了1.5V,甚至更小。根据串联电路电压为各处之和,这个时候10K电阻两端的电压为3.5V,甚至更大,所以RST引脚又接收到高电平。单片机系统自动复位。  

       总结: 1、复位电路的原理是单片机RST引脚接收到2US以上的电平信号,只要保证电容的充放电时间大于2US,即可实现复位,所以电路中的电容值是可以改变的。 2、按键按下系统复位,是电容处于一个短路电路中,释放了所有的电能,电阻两端的电压增加引起的。

二、低电平复位

      在使用STM32芯片时,常用的复位方式为按键复位,且为低电平复位。其原理与上述高电平复位相反,分析也挺简单,这里不在赘述,只给出按键复位原理图。

 

/**************************************************分析二*********************************************/

    单片机的复位引脚RST(全称RESET)出现2个机器周期以上的复位电平时,单片机就执行复位操作。如果RST持续为复位电平,单片机就处于循环复位状态。当单片机处于正常电平时就正常转入执行程序。

 图1:当单片机上电瞬间由于电容电压不能突变会使电容两边的电位相同,此时RST为低电平,之后随着时间推移电源通过电阻对电容充电,充满电时RST为高电平。正常工作为高电平,低电平复位。即上电低电平,然后转向高电平。

  图2:当单片机上电瞬间由于电容电压不能突变会使电容两边的电位相同,此时RST为高电平,之后随着时间推移电源负极通过电阻对电容放电,放完电时RST为低电平。正常工作为低电平,高电平复位。

 

2020-01-08 21:12:44 imxlw00 阅读数 17
  • 单片机控制第一个外设-LED灯-第1季第6部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第1季第6个课程,主要讲解LED的工作原理和开发板原理图、实践编程等,通过学习目的是让大家学会给单片机编程控制LED灯,并且为进一步学习其他外设打好基础。

    4006 人正在学习 去看看 朱有鹏

单片机通电时,从初始态开始执行程序,称为上电复位。单片机死机时,通过手动按“重启”键使其从初始态开始执行程序,称为手工复位。复位电路是单片机应用电路中的重要组成部分。

单片机复位的条件:使单片机的RST端(引脚9的RESET端)加上持续两个机器周期的高电平。例如,若时钟频率为12MHz,每机器周期为1ms,则只需在RST引脚出现2ms以上时间的高电平,就可以使单片机复位。
在这里插入图片描述

  • 图3-14(a)所示为上电复位电路,它是利用电容充电来实现的。在通电瞬间,RESET端的电位与VCC相同,随着充电电流的减少,RESET的电位逐渐下降。只要保证RESET为高电平的时间大于两个机器周期,就能正常复位。
  • 图3-14(b)所示为按键复位电路,需复位时,按下RESET键,此时电源VCC经电阻R1、R2分压,在RESET端产生一个复位高电平使单片机复位。
2017-11-01 16:21:22 wzz110011 阅读数 1754
  • 单片机控制第一个外设-LED灯-第1季第6部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第1季第6个课程,主要讲解LED的工作原理和开发板原理图、实践编程等,通过学习目的是让大家学会给单片机编程控制LED灯,并且为进一步学习其他外设打好基础。

    4006 人正在学习 去看看 朱有鹏

在学习MSP430单片机的时候,经常会遇到一个问题,那就是单片机上电复位以后它到底是什么样的状态?因为它功能复杂,且资源丰富,IO管脚很多,时钟和低功耗模式配置灵活,那么上电后它们处于什么样的状态?

对于电子开发的工程师而言,芯片手册是最好的文档,而且要学会阅读英文的手册,以下我就通过TI公司的用户指南帮助大家一步一步缕清楚,上电复位。


首先我们要了解430单片机的复位包括POR(power on reset)系统上电复位和PUC(power up clear)上电清除,总的来说poc信号更广泛,暂且不深入讨论,我们只要知道上电后会触发POC和PUC即可。那么POR信号会使系统做什么呢?

请看下图:


打对勾的三条很重要,它的IO管脚会配置为输入模式,状态寄存器会清零,而且看门狗定时器会工作。

这告诉我们,如果要使用IO口做输出,那么需要进行配置。而且要关闭看门狗定时器才能防止溢出复位。

Status register is reset是说状态寄存器SR全部清零,这句话包含了很多信息,我们可以再看一下,SP寄存器的各个位的含义:


SR寄存器是一个16位的寄存器,与我们相关的几位在图中打钩了,其它的位只需要在用汇编语言的时候用。

SCG0和SCG1都为0表示主时钟MSCK和子系统时钟SMCLK都是默认打开的,OSCOFF=0表示外部的低频晶体振荡器也是默认打开的,也就是我们常说的32768手表晶体。

GIE是总中断使能位,如果我们需要使用外部中断就需要将这一位置1,它有点类似51单片机的EA。

到此为止,我们就已经了解整个复位的情况。

单片机软硬件复位

阅读数 2625

没有更多推荐了,返回首页