历史上的今天
今天是:2025年01月16日(星期四)
2020年01月16日 | 单片机成长之路(51基础篇) - 004 STC89C52MCU 软件系统复位
2020-01-16 来源:eefocus
用户应用程序在运行过程中,有时会有特殊需求,需要实现单片机系统复位(热启动之一),传统的8051单片机由于硬件上未支持此功能,用户必须用软件模拟实现,实现起来较麻烦。STC单片机增加了相应的硬件功能,内部的ISP/IAP控制寄存器ISP_CONTR便可以实现此功能。用户只需简单的控制ISP_CONTR特殊功能寄存器的其中两位SWBS和SWRST就可以实现系统复位。
ISP/IAP控制寄存器(ISP_CONTR)
STC单片机ISP/IAP控制寄存器在特殊功能寄存器中的字节地址为E7H,不能位寻址,该寄存器用来管理和ISP/IAP相关的功能设定及是否软件复位等。单片机复位时该寄存器全部被清0。其各位的定义如表4.3.1所示。
表1 ISP/IAP控制寄存器(ISP_CONTR)

ISPEN:ISP/IAP 功能允许位。0:禁止ISP/IAP编程改变Flash。1:允许编程改变Flash。
SWBS:软件选择从用户应用程序区启动(0),还是从ISP程序区启动(1)。要与SWRST直接配合才可以实现。
SWRST:0:不操作;1:产生软件系统复位,硬件自动清零。
WT2、WT1、WT0:ISP/IAP编程时设定CPU等待的最长时间。ISP/IAP编程时可对Flash进行读操作、写操作、擦除操作,当进行这些操作时,时钟将被CPU锁定只进行这些操作,而不同的操作将会耗费CPU不同的时间,这里我们通过人为设定可以给CPU一个最长的等待时间,若在此时间段内相应的操作未完成,数据将丢失或错误。以下给出芯片厂商推荐的等待时间关系表,如表3.4.2所示:
表2 ISP/IAP编程CPU等待时间参考表

SWBS与SWRST组合情况如下:
从用户应用程序区(AP区)软件复位并切换到用户应用程序区(AP区)开始执行程序:
ISP_CONTR=00100000B,SWBS=0(选择AP区),SWRST=1(软复位)。
从系统ISP监控程序区软件复位并切换到用户应用程序区(AP区)开始执行程序:
ISP_CONTR=00100000B,SWBS=0(选择AP区),SWRST=1(软复位)。
从用户应用程序区(AP区)软件复位并切换到系统ISP监控程序区开始执行程序:
ISP_CONTR=01100000B,SWBS=1(选择ISP区),SWRST=1(软复位)。
从系统ISP监控程序区软件复位并切换到系统ISP监控程序区开始执行程序:
ISP_CONTR=01100000B,SWBS=1(选择ISP区),SWRST=1(软复位)。
本复位是整个系统复位,所有的特殊功能寄存器都会复位到初始值,I/O口也会被初始化。
用户应用程序区(AP区)指仅仅是用户自己编写的程序区。
ISP监控程序区ISP区是指芯片出厂时就已经固化在单片机内部的一段程序,STC单片机可以进行ISP串行下载程序,这就是因为芯片在出厂时已经在单片机内部固化了ISP引导码,程序首次上电时先会从ISP区开始执行代码,体现在实际实验中时,就是我们在下载程序时,先要点击下载软件界面上的下载,然后再开启单片机电源,当单片机检测到上位机有下载程序的需要时,便启用ISP下载功能给单片机下载程序。若经过短暂的时间没有检测到上位机有下载程序的需求,单片机便会从用户应用程序区(AP区)开始执行代码。
接下来我们通过一个例程,为大家演示如何使用STC单片机的软件复位功能实现运行中的程序突然复位。
【例】:在实验板上实现如下描述,在数码管前两位显示以秒递增数,到增加到10时,利用STC单片机的软件复位功能让单片机复位。
1 #include 2 #define uchar unsigned char//宏定义 3 #define uint unsigned int 4 sbit dula=P2^6; //段控制位 5 sbit wela=P2^7; //位控制位 6 uchar miao,fen,aa,n1,n2,n3,n4; 7 uchar code table[]={ //显示编码 8 0x3f,0x06,0x5b,0x4f, 9 0x66,0x6d,0x7d,0x07, 10 0x7f,0x6f,0x77,0x7c, 11 0x39,0x5e,0x79,0x71}; 12 13 void delay(uint z); //延时程序声明 14 void init(void);//初始化程序声明 15 void display(uchar n1 ,uchar n2,uchar n3,uchar n4); //显示程序声明 16 17 18 void main(){ //主程序 19 init(); //调用初始化程序 20 while(1){ //进入大循环 21 if(aa==20){ //判断是否到了1S 22 miao++; //秒数加1 23 if(miao==60){ //判断是否到了60秒 24 miao=0; //秒数清0 25 fen++; //分数加1 26 if(fen==60){ //判断是否到了60分 27 fen=0; //分数到60则清0 28 } 29 n1=fen/10; //第一个数码管显示分的十位 30 n2=fen%10; //第二个数码管显示分的个位 31 n3=miao/10; //第三个数码管显示秒的十位 32 n4=miao%10; //第四个数码管显示秒的个位 33 } 34 display(n1,n2,n3,n4); 35 } 36 } 37 } 38 39 void delay(uint z){ //延时程序 40 uint x,y; 41 for(x=z;x>0;x--) 42 for(y=110;y>0;y--); 43 } 44 45 46 47 void display(uchar n1 ,uchar n2,uchar n3,uchar n4) { 48 dula=1; //开段选 49 P0=table[n1]; //送分的十位 50 dula=0; //关段选 51 P0=0xff; //消隐 52 wela=1; //开位选 53 P0=0xfe; //选通分的十位 54 wela=0; //关位选 55 P0=0xff; //消隐 56 delay(1); //延时 57 58 dula=1; //开段选 59 P0=table[n2]; //送分的个位 60 dula=0; //关段选 61 P0=0xff; //消隐 62 wela=1; //开位选 63 P0=0xfd; //选通分的个位 64 wela=0; //关位选 65 P0=0xff; //消隐 66 delay(1); //延时 67 68 dula=1; //开段选 69 P0=table[n3]; //送秒的十位 70 dula=0; //关段选 71 P0=0xff; //消隐 72 wela=1; //开位选 73 P0=0xfb; //选通秒的十位 74 wela=0; //关位选 75 P0=0xff; //消隐 76 delay(1); //延时 77 78 dula=1; //开段选 79 P0=table[n4]; //送秒的个位 80 dula=0; //关段选 81 P0=0xff; //消隐 82 wela=1; //开位选 83 P0=0xf7; //选通秒的个位 84 wela=0; //关位选 85 P0=0xff; //消隐 86 delay(1); //延时 87 } 88 89 void init(void){ 90 91 } 92 93 void timer0(void) interrupt 1 using 1 { 94 TH0=(65536-50000)/256; //求模 95 TL0=(65536-50000)%256; //求余 96 aa++; 97 } 分析: (1)“sfr ISP_CONTR=0xe7;”定义ISP/IAP控制寄存器。 (2)“ISP_CONTR=0x20;”用软件复位到用户应用程序区(AP区),重新开始执行程序。 (3)从演示结果可看出,当数码管上的数字显示到“09”,再加一秒时,数字立即变成“00”,则说明程序复位从头开始执行了。
史海拾趣
|
推荐下载,非常不错的电子书hardware_design_verification.chm Copyright Prentice Hall Modern Semiconductor Design Series Preface To the Audience To the Instru ...… 查看全部问答> |
|
请教!!!使用Driverstudio,Defaultpnp的问题 使用DRIVERMONITOR显示 IRP: Major=IRP_MJ_PNP Minor= (0x18) defaultPnp--. IRP 856C8790, STATUS c00000bb 调用m_lower.ActivateConfiguration配置时,返回AC_FAILED_TO_OPEN_PIPE_OBJECT, 是我端点配置错误吗? 应该跟底下的固 ...… 查看全部问答> |
|
添加了mainMenu控件和inputPanel控件,但是控件不显示 我在Textbox的GotFocus事件事添加了 inputpanel1.Enabled=true; 但是在mainMenu控件上看不到图标,也没有办法切换输入法… 查看全部问答> |
|
lineMakeCall 失败 错误号为 LINEERR_INVALBEARERMODE 的原因 我的调用顺序为: lineOpen --------------Success lineTranslateAddress -----success 设置为: lpCallParams->dwTotalSize = dwSizeOfCallParams; lpCallParam ...… 查看全部问答> |
|
ERROR: Res2Exe: WriteResFile: Open input file D:\\WINCE500\\PBWorkspaces\\GDI1029\\RelDir\\Emulator_x86_Release\\shlwapi.dll failed. ERROR: Res2Exe: WriteResFile: Open input file D:\\WINCE500\\PBWorkspaces\\GDI1029\\RelDir\\Emula ...… 查看全部问答> |
|
一般检测一个按键可以这样做:while(1){ SysCtlDelay(SysCtlClockGet()/30); //延迟100ms temp=GPIOPinRead(GPIO_PORTD_BASE,GPIO_PIN_5); if(temp==0) ...… 查看全部问答> |
|
本帖最后由 dontium 于 2015-1-23 13:30 编辑 新闻背景:6月9日,TI 宣布推出业界首款单芯片无源红外线 (IR) MEMS 温度传感器,首次为便携式消费类电子产品实现非接触温度测量功能。该 TMP006 数字温度传感器可帮助智能电话、平板电脑以及笔记本电 ...… 查看全部问答> |
|
本帖最后由 paulhyde 于 2014-9-15 09:39 编辑 各位高手帮忙指点一下,按照下图中的cxa1238芯片的22脚接的本振,可是怎么调频率总是680k左右,我的载频是35M,所以本振应该是在45M左右,可是怎么调可调电容,它频率总不变啊!!!!找也没找出原因 ...… 查看全部问答> |
|
研究ADS1115一段时间了,终于搞定啦,其实操作还是蛮简单的,主要分为三部分的步骤,本次列子是模拟IIC操作的哦。。。。。 其实主要分为三部分, 第一部分:write config register 1 0x90 最后一位是R/W位,高为读,低 ...… 查看全部问答> |




