在节电设计中掉电状态MCU的复位唤醒速度
引言 在MCU的节电措施中,除了降低工作频率与工作电压以外,剩下的就是如何选择MCU的节电模式了。由于节电的机理是设法停掉片内一部分电路的工作,因此节电效果最好的是片内电路全停的掉电方式。以MCS51系列的AT89C2051为例,其休闲方式(CPU冻结,但振荡器、中断、定时器与串行口等仍继续运行)的耗电约为850uA,而掉电方式(片内所有电路均停止工作,仅保持I/O端口引脚状态和片内RAM内容不变)的耗电仅为1uA不到。显然,对于那些正常运行中存在等待状态的MCU应用项目来说,应当尽可能地选择这种掉电方式来作节电设计。但由于掉电状态下MCU片内的时钟和中断系统均不工作,所以无法以片外中断方式唤醒片内的CPU,而只能以复位方式予以唤醒。然而实际应用需求往往对MCU的唤醒速度有所要求,而在一般概念中MCU的复位速度是很慢的(如上电复位),且相关的数据手册和应用资料均未对此给出明确清晰的说明,因此MCU掉电时的复位唤醒速度便成了能否采用这种节电方式的关键所在。为此,有必要从理论和实践两方面进行探讨并寻求相关答案。
1 MCU的复位方式及其特点 一般说来,MCU的复位操作通常可分为上电复位、手动复位、看门狗复位、失电复位、以及节电方式下的掉电复位。根据这些复位操作发生时的系统状态又可将它们归为三类:上电复位、运行复位、掉电复位。下面分别对这三类复位操作及其特点进行具体分析。 1.1 上电复位 上电复位几乎是所有MCU应用系统都在使用的启动方式,它是指系统加电开始运行时的自动复位,一般是在电源上升稳定后利用模拟或数字的延时环节给MCU提供一定时间进行片内复位操作。常见的复位电路有片外RC延时电路和片内复位定时器等。
对于该上电复位操作所需的时间,一般的MCU数据手册都给出了相应的说明。以Intel公司的MCS51 PDF文档为例:①振荡器起振到稳定的时间大约为1ms~10ms,(即10MHz的晶振为1ms,1MHZ的晶振为10ms);②为确保可靠复位,RST引脚上的高电平必须保持到振荡器起振再加两个机器周期;③上电时VCC必须在10ms左右的时间内完成其上升。 以上三点说明给人的印象是上电复位所需的时间是很长的,而且很容易造成这样的错觉:上电复位所需时间=电源上升时间+振荡器起振时间+片内初态建立时间。这也影响了某些文献关于上电复位时间的相关论述。也正因为如此,在实际设计中为了确保可靠复位,设计者通常都把片外复位电路的RC数值取得较大。 然而事实并非如此。图一给出了AT89C51的一个测试实例:当电源电压上升到2V左右时振荡器开始起振(此时距电源上升起点约1ms),尔后其振荡幅度基本上跟随电源电压逐步攀升,直至2.3ms时两者均达最大(VCC=5V,Vx2≈5Vpp);与此同时,复位时片内初态的设置操作将I/O引脚(图一中P1.4)电平抬高发生在VCC上升到50%时,此后若将RST引脚的高电平拉低,MCU将立即开始执行程序,而不必等到振荡器振幅达到最大。(以上两个时间参数系指振荡器的片外定时元件为4MHz陶瓷谐振器)。
图一AT89C51上电复位时的起振时序 由此可以得出这样的结论:上电时的复位操作(初态设置+振荡器起振)在电源电压上升到其50%时便可完成,而不是在片内振荡器振幅稳定的两个机器周期之后(即片内初态的建立并不依赖于片内振荡器的状态)。此后RST引脚的电平是否变低决定了MCU何时开始取指执行。但为避免在电源电压不足时仓促执行程序可能对片外带来的意外结果,复位信号还是应当持续到电源电压上升结束时方可撤除。从这一点出发可以认为,上电复位所需时间完全取决于电源电压的上升时间。由于此处电源电压上升的实测时间为2.3ms,因而可以确定选得过大(8.2k×10uF=82ms),会使上电开机时间拖得太长。 1.2 运行复位 运行复位是指系统异常时的手动复位、程序跑飞时的看门狗复位、电源电压下降时的失电复位等。它们的共同点是片内振荡器及其它电路都在正常运行,CPU正在执行程序。 此时提供给MCU的RST引脚上的复位信号必须不小于两个机器周期。这是因为MCU每个机器周期只对片外的 RST引脚采样一次。为了避免RST引脚上的干扰信号导致复位的误动作,必须连续采样到两次有效的片外RST复位信号,MCU才会启动片内的复位流程,使片内的RESET信号有效(直到此时片外的RST信号方可撤去),并以此片内RESET信号去设置片内各部件的初始状态以及控制随后的取指执行。考虑到送达片外RST引脚上的复位信号有可能正好发生在一次片内采样之后,所以为实现运行时的可靠复位RST引脚上的复位信号至少得维持2个机器周期。 1.3 掉电复位 掉电复位是指MCU处于节电的掉电状态下以复位方式将其唤醒重新执行指令的操作。掉电后MCU片内的所有电路均已停止工作,但其片内RAM内容和各端口引脚的状态保持不变,而且MCU的供电电压也大都保持不变(也有少数应用中将掉电状态下的MCU供电电压降为2V以求最大限度的节电)。这种情况下的复位操作与上电复位所实现的目标是相同的:振荡器起振并稳定、片内相关部件建立初态。但与上电复位不同的是:MCU的工作电压仍然存在。 从上电复位的讨论中可以得知,其可靠复位所需时间主要取决于电源电压的上升时间;那么对于此处掉电复位来说,当已没有了电源电压上升的问题时(对于那种掉电后电源电压下降到2V者,则应先将电源电压上升到正常值后方可对RST引脚施加复位信号),复位所需时间又取决于什么?对于这一点,相关的数据手册并未给出确切说明,只说“复位信号激活了振荡器,复位信号必须保持有效到使振荡器起振并达稳定(一般少于10ms)” ,这似乎是说该MCU的掉电复位唤醒时间约为数毫秒。然而,该数据手册提供的相关内部电路框图以及所作的实际测试均表明,情况并非完全如此。
片内振荡器的起振和向后传输均受控于掉电控制位PD,因此掉电复位时必定是先进行片内初始状态的设置(其中包含PD位清零),然后才能使片内振荡器起振并后传。同时,也正由于片内振荡器的起振是由片内初态进行控制的,所以片内初态一旦可靠建立,片外复位信号就没有必要一直保留到使片内振荡器振幅趋于稳定。以下测试证实了这一点。 图二给出了AT89C51在掉电复位唤醒时的实际测试结果,此时其片内振荡器的片外定时元件为4MHz的陶瓷谐振器。
图二 AT89C51在掉电状态下复位时的起振时序 由图二可见,当复位信号前沿到来时,片内振荡器立即在1/2VCC(2.5V)左右处开始起振。在起始的3us时段内其振幅很小,4us~9us期间其振幅迅速增加,到10us~15us内则渐趋稳定。由此可得以下几点结论:首先,片内振荡器的起振速度大大快于数据手册中所说的“一般少于10ms”。其次,当复位信号到来时,片内振荡器并未象上电复位那样等了一段时间以后再起振,而是立即起振。这是由于在掉电复位唤醒前,电源电压依然存在,使得片内振荡器的某些静态工作点仍然维持着,所以一旦复位操作清除了掉电控制位PD,振荡器便立即在工作点处(1/2VCC=2.5V)开始起振,显然比上电复位时省掉了一段逐步建立工作点所需的启动时间。 为了确切了解AT89C51的可靠复位唤醒要求片外所加的复位信号至少应保持多少宽度,笔者以另一MCU发出的窄脉冲作为被测MCU的复位信号,并不断改变其宽度,再以观察被测MCU的一个I/O引脚电平的变化来判断是否可靠地完成了复位唤醒操作,即在MCU进入掉电状态之前先将该引脚用指令置为低电平,随后掉电复位唤醒发生时的片内初态设置操作又会把该引脚强制置为高电平,最后,由掉电复位唤醒结束后的第一条指令再将其立即拉为低电平。测试结果显示,当外加的复位信号宽度为1us~6us时,被测MCU有时不能可靠复位,具体表现为该I/O引脚被复位的初态设置操作强制拉高后又可能随着复位信号的撤除而立即下降。而当外加的复位信号宽度大于8us后,被测MCU就能可靠复位唤醒并在外加复位信号撤除后能顺利开始执行程序。 这个结果表明:①复位时MCU的端口引脚跟随复位信号的高电平前沿立即变高,滞后小于1us;②复位唤醒时MCU的片内初态的设置领先于片内振荡器的起振。③复位唤醒时外加的复位信号宽度最小只需几个us即可,不必等到振荡器振幅达到最大就可使MCU开始执行指令(上述8us处的振荡幅度大约为160mVpp),这可能是因为在片内振荡器后面有一级分频器,将振荡器在1/2VCC处的小幅度振荡整形为满幅度时钟信号了。 由此可知,掉电状态下MCU的复位唤醒虽与片内振荡器有关,但其唤醒时间并不等同于片内振荡器从起振到稳定的时间。若想获得最快的复位唤醒速度,还可考虑使用片外振荡器,以便MCU的掉电操作对振荡器不构成影响。 对于非MCS51的其它MCU系列,其掉电唤醒的复位操作和时序大致与上述相同,只是具体时间参数上可能有所差异。以MICROChip的 PIC12F508为例,其片内主管复位延时的定时器DRT的延时值分为两类,一类是上电复位时的延时值为18ms,另一类是采用片内RC振荡器或片外时钟输入时用作复位唤醒的延时值为10us。稍显不足的是,该文档还声称当采用片外晶振时其DRT的延时值仍为18ms,这显然与本文所测数据相差甚远。
2.结束语 能否以硬件复位对MCU实行快速唤醒是妨碍采用掉电方式进行MCU节电设计的一道门槛,其关键在于MCU掉电时的复位唤醒时间是否可知、是否够快。本文工作就这两点给出了答案。结论是明确的:采用片内振荡器时,掉电状态下的复位唤醒时间小于片内振荡器从起振到稳定的时间(且远小于上电复位时间),采用陶瓷谐振器时,该时间可快至10微秒左右,若想进一步加快则可采用片外时钟方案。
|