/***************************************************
*作 者 :温子祺
*联系方式: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复位来进行。
软件复位代码:
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被触发,单片机就进行复位。