软件复位

/***************************************************
 *作    者 :温子祺
 *联系方式:wenziqi@hotmail.com
 *说    明 :软件复位的研究   
 ***************************************************/  

 ISP_CONTR:ISP/IAP控制寄存器

 

D7

D6

D5

D4

D3

D2

D1

D0

复位值

ISPEN

SWBS

SWRST

-

-

WT2

WT1

WT0

000x,0000

 

  • SWBS当设置为0时,软件复位后从用户应用程序区启动;当设置为1时,软件复位从ISP程序区启动,。要与SWRST直接配合才可以实现。 

 

  • SWRST当设置为0时,不执行软件复位;当设置为1时,产生软件系统复位,硬件自动清零。

 

    该复位是整个系统复位,所有的特殊功能寄存器都会复位到初始值,I/O口也会初始化。

 

【例子】通过按键中断来使MCU软件复位,复位后闪烁LED灯一段时间,然后MCU保持当前状态,空转。若要继续使LED重新闪烁,要求MCU复位来进行。

 

软件复位代码:

1 #include "stc.h"
2
3  #define LED_PORT P2 //定义LED控制端口为P2口
4
5  /********************************************
6 *函数名称:Delay
7 *输 入:无
8 *输 出:无
9 *说 明:延时一段时间
10 ********************************************/
11  void Delay(void)
12 {
13 unsigned char i,j;
14
15 for(i=0;i<130;i++)
16 for(j=0;j<255;j++);
17 }
18  /********************************************
19 *函数名称:SoftReset
20 *输 入:无
21 *输 出:无
22 *说 明:软件复位MCU
23 ********************************************/
24  void SoftReset(void)
25 {
26 ISP_CONTR=0x20;
27 }
28  /********************************************
29 *函数名称:EXTInit
30 *输 入:无
31 *输 出:无
32 *说 明:外部中断初始化
33 ********************************************/
34  void EXTInit(void)
35 {
36 EX1=1; //允许外部中断1中断
37   IT1=0; //低电平触发
38   EA=1; //允许所有中断
39  }
40  /********************************************
41 *函数名称:main
42 *输 入:无
43 *输 出:无
44 *说 明:函数
45 ********************************************/
46 void main(void)
47 {
48 unsigned char i;
49
50 EXTInit(); //外部中断初始化
51
52 for(i=0;i<20;i++) //循环闪烁LED灯
53 {
54 LED_PORT=~LED_PORT;
55 Delay();
56 }
57
58 while(1)
59 {
60 ;//空操作
61 }
62 }
63 /********************************************
64 *函数名称:EXT1IRQ
65 *输 入:无
66 *输 出:无
67 *说 明:外部中断1中断服务函数 复位操作
68 ********************************************/
69 void EXT1IRQ(void)interrupt 2
70 {
71 SoftReset();
72 }
73

代码分析:

SoftReset是复位操作函数,对ISP/IAP控制寄存器ISP_CONTR赋值位0x20,即将ISP_CONTR

中“SWRST”置1来进行软件复位。要说明的是这里的软件复位是真正意义上的复位,同硬件复位的效果一模一样。

在main函数中,初始化外部中断后进行LED灯闪烁一阵时间,然后进入while(1)死循环进行空操作。

软件复位操作放在外部中断1中断服务函数函数当中,只要外部中断1被触发,单片机就进行复位。

原文地址:https://www.cnblogs.com/wenziqi/p/1769296.html