单片机的状态迁移与复位操作
本文以经典的80C51单片机为例,利用工作状态及其状态迁移的新概念、新观点和新方法,揭示一些单片机运作的内在规律,对于单片机学习者和应用开发者具有一定的启迪作用和实际意义。
1 单片机的工作状态及其状态迁移
80C51单片机的各种活动,可以描述成多个不同的工作状态或工作模式。这里利用笔者构思的一个单片机工作状态迁移图(如图1所示)来说明。不过,这里重点关注的是复位状态。
图1 单片机工作状态迁移图
经过仔细分析之后,从图1中可以看出:
① 把单片机经历的所有生存状态归纳和描绘成5个状态——1个非工作状态(即无电状态)和4个工作状态。
② 只有复位状态是一个暂态,其他均为稳态;并且每次单片机进入正常运行状态时,都要经历一次复位状态。
③ 只有在正常运行状态(这里记作NORMAL)下,单片机才按照程序存储器中固化的用户程序按部就班地一步一步执行,从而完成开发者设计的各项任务。
④ 停机状态(或PD模式)和待机状态(或IDL模式),主要是为节能降耗而规划的节电状态(或称“睡眠状态”)。
⑤ 从无电状态离开的唯一条件就是上电,并且唯一能够到达的是一个暂态——复位状态。
⑥ 复位状态以外的4个状态都有迁移到复位状态的途径,只是导致迁移的条件不尽相同。
⑦ 无电状态之外的4个工作状态,都可能因为随时断电而导致单片机进入“无电状态”。
⑧ 从另外3个工作状态迁移到复位状态,基本都是依靠外部引脚RST上的复位信号。原始复位源比较单一,这是因为传统80C51的复位逻辑相对简单。如果想增加“电源欠压复位”和“看门狗复位”等其他复位源,则需要片外扩充独立电路来实现。
⑨ 标准80C51没有设计“软件复位”功能,如果需要该功能,可以通过用户程序自行实现。不同的是,软件复位不会令CPU经历一次复位状态。
2 复位源、复位操作和复位状态
像数字电路中的时序逻辑电路器件需要具备复位功能一样,各种类型的单片机也都需要具备复位功能(RESET)。复位功能按其英文原意是重新设置的意思,也就是从头开始执行程序,或者重新从头执行程序(Restart)的意思。复位是单片机的一项重要操作内容,其目标是确保单片机运行过程有一个良好的开端,确保单片机运行过程中有一个良好的状态。
需要强调的是: 关于“复位”一词,它既包含复位活动的意思,又包含复位状态的意思。或者说,复位既是一个动态的概念(指复位活动、复位操作、复位处理或复位过程等),又是一个静态的概念(指复位状态或复位模式等)。
2.1 常规复位源和扩充复位源
从现今的技术高度来看,标准80C51单片机的复位功能设计得不够完善,不仅没有设置复位标志位寄存器,而且复位源的种类也很少。
所谓“复位源”,就是导致或者引起单片机内部复位的源泉。对于当前市场上出现的种类比较齐全的单片机,其典型复位源大致可以归纳为以下6种: 上电复位、人工复位、电源欠压复位、看门狗复位、非法地址复位和软件复位。这些复位源的特点是:
① 上电复位这一种复位源是必不可少的。因为每次给单片机加电时,其电源电压的稳定,以及时钟振荡器的起振和振幅稳定,都需要一定的延迟时间。
② 只有上电复位和人工复位这两种复位源,是讲解80C51单片机的教科书、技术文章和文献资料中比较常见的。
③ 对于电源欠压复位、看门狗复位和非法地址复位3种复位源,标准80C51是不具备的,不过可以额外扩充,可由单片机用户根据实际需要通过附加一些软件或硬件的手段来实现。
④ 虽然电源欠压复位、看门狗复位、非法地址复位3种复位源可以额外扩充,但是都必须借助于复位引脚RST来实施复位操作或复位锁定。
⑤ 标准80C51本来不具备软件复位功能,但是可以通过纯软件方式以及虚拟手段,来实现或者部分实现其他单片机的软件复位。这种方法扩充的软件复位是一种比较特殊的复位源,一是不通过RST引脚实现复位,二是复位操作的内容与众不同。软件复位作为一种新技术,目前有越来越多的新型单片机配备了该功能。例如Philips公司的P87LPC700和P89LPC900系列、TIBB公司的MSC1200系列、SunPlus公司的SPMC65系列等,内部都设计了专门用于实现软件复位的控制寄存器或者控制位。
2.2 复位操作的具体内容
单片机复位功能的实现过程实质上就是在单片机内部进行一系列的复位操作。在复位期间,单片机内部的复位操作究竟完成了哪些内容,是程序设计人员应该搞清的问题,因为单片机复位操作完成之后的内部状态,就是运行用户程序和进行软件处理的背景、基础和起点。
对80C51单片机来说,只有软件复位的具体内容和影响范围,是可以由用户自由定制的;而凡是直接作用于复位引脚RST上的复位源(如上电复位等),所实现的复位操作的具体内容和影响范围都应该是一样的。现在归纳如下:
① 程序计数器PC返回到原始状态0000H;
② 所有特殊功能寄存器SFR全部还原为复位值(可以查阅技术手册);
③ 所有通用并行端口(P0、P1、P2和P3)的引脚全部被设置为输入状态;
④ 清除各级中断优先级的激活触发器,以便受理各级中断请求(在标准80C51中只设置了2个中断优先级别,而在有些新型兼容产品中设置了4个级别)。
2.3 复位状态的具体表现
单片机一旦进入复位状态并且停留在复位状态下(即外接引脚RST被锁定在有效的高电平上),就会表现出如下一些具体特征:
◇ CPU不再执行程序而保持静止(冻结)状态;
◇ 各种片内外围模块(定时器、串行口、总线接口、中断系统等)均停止工作;
◇ 各个并口(P0~P3)的所有口线均对外呈现高阻状态;
◇ 各SFR的内容均恢复到复位值(即返回到知情范围);
◇ 内部RAM内容维持记忆,只要电源电压不低于最低维持电压(一般为2 V)就能够保持原有内容;
◇ 内部时钟源振荡器仍然会维持振荡,只要电源电压还在1 V(甚至略低于1 V),振荡器就能够维持工作;
◇ 各种片外电路(如扩展存储器、扩展I/O端口或锁存器等)都应该维持原有内容和状态。
2.4 补充说明
格外值得关注的是,经历了复位操作之后的各个并行端口的状态。因为端口引脚是单片机联系外部世界的、最多的一类引脚,其复位状态(即初始化状态)将直接影响外部电路,甚至还会对外部电路构成威胁或造成损坏。为了避免这种影响或威胁,总是把各条端口引脚复位成“输入方式”。理由是,输入方式对外呈现出很高的阻抗,从而有效地防止了可能发生的过流损坏。
任何方式或任何复位源引起的复位操作,都不会改变RAM区的用户数据。甚至就连欠压复位事件的发生,只要电源电压VDD还没有跌落到连RAM内容都不能维持的地步(一般以2 V为门限),就不会丢失RAM中的用户数据。
3 几点新启示
单片机系统一旦进入PD模式(即停机模式,或掉电模式,有时也称“掉电保护模式”),系统时钟源就会停止工作,CPU以及所有的片载硬件模块一起退出运行状态,从而使功耗大幅度降低(可以到达μA级,甚至以下)。
单片机应用项目开发人员利用停机模式可以达到两种目的: ① 降低单片机应用系统的总体耗能;② 抵御电源电压跌落时可能带来的CPU失控,就是一旦发现电源电压跌落、欠压或故障,则强行把单片机推入停机模式,以免发生程序混乱。停机期间,即使电源电压降低到2 V,仍然能够维持RAM内容不丢失。
通过仔细分析图1可以发现,当初Intel公司为80C51设置停机模式的主要初衷,应该是基于上述第二种目的。理由是,从图1中可以看出,常规唤醒方式可以令单片机从PD模式直接返回到NORMAL模式,一般利用特定的中断源作为唤醒源。不过对标准80C51来说,Intel公司没有设计利用中断源作为唤醒源的途径,不能不说是一种遗憾。
为了弥补这个遗憾,一些新型兼容产品(例如Atmel公司的AT89S51/52/53/8252/8253、Philips公司的P89V51RB2/RC2/RD2以及P89LPC900系列等)添加了利用被使能且被设置为用电平触发的外部中断源INT0和INT1来作为唤醒源,唤醒后的单片机能够从设置PD=1指令之后的下一条指令恢复运行。