Freescale公司的工程师所写,喜欢的话,可以上我的博客看看,里面内容更丰富! http://blog.eccn.com/u/108403/index.htm引言:MC68HC(9)08 系列MCU 具备防止代码跑飞的功能,而且即使发生了代码跑飞,它也能防止应用出现故障。导致代码跑飞的原因可能是错误的代码、超出规范允许范围运行MCU、或者是严重的EMI 或电气噪声事件。从定义来看,并没有明确指出在代码跑飞期间会出现什么情况,但是由于它是超出规范运行环境而导致的,很容易破坏程序计数器,从而导致MCU 出现不可预测的行为。 在可能发生这种现象的MCU 应用中,我们建议采取下文中介绍的各种预防措施。但是即使采取了这些推荐预防措施,在异常情况下,仍然存在着较小的代码跑飞的可能性。正因为如此,我们还介绍了能够防止MCU 或应用硬件在这种情形下遭到损坏的技术。在下列应用中,这些预防措施尤为重要:使用了任何类型的片上或外部非易失性存储器(闪存、EEPROM 或备份RAM)的应用、以及外部硬件有可能进入一种异常状态,甚至是破坏状态的应用。 根据定义,在代码跑飞后,MCU 的运行是不可预测的,甚至不能相信其I/O 端口会继续输出可接受的状态。这就有可能使其端口进入一种不可预测的状态,进而导致外部硬件也进入不可预测的状态。 在使用非易失性存储器的应用中,储存器中的内容有可能被MCU 的失控行为破 坏。如果闪存或EEPROM 存储器中包含应用代码,问题会更严重。如果代码遭 到破坏,整个应用可能都无法运行,而且不可能通过局部的重新编程来恢复。这就要求我们通过在线重新编程,甚至可能必须更换包含MCU 的整个PCB,来修复这些设备。 1. 防止代码跑飞 在基于ROM 的简单应用中,可能不使用非易失性存储器,也无需关心I/O 出现 无法预测的状态。在这种情况下,采取预防措施来防止代码跑飞就显得不那么紧迫,尽管它仍然具备一些作用,例如在电压下降时防止LED 指示灯或其它显示器的混乱闪烁。 即使事先没有迹象表明一个应用可能出现某种有害的故障,我们还是强烈建议您采取所有必要的预防措施,以防止代码跑飞,这是一个非常好的做法。这些建议都是一些老生常谈,但人们有时会置若罔闻,因此也并非总是被采用的。虽然我们在这里讨论的是MC68HC(9)08 这款特定的器件,但这些技术适用于所有MCU的应用。 在上电和掉电过程中,代码跑飞都是潜在的风险。这两种情况要以不同方式进行处理。 1a. 掉电保护 防止代码跑飞的最重要的方法就是低电压禁止功能(LVI)。当Vdd 电源降低到规定的最小值以下时,LVI 能让MCU 保持复位状态。尽管LVI 可以在电源故障时保护应用系统,但它最重要的作用还是在有意关断电源时出现的瞬时状态下提供保护。如果没有采用某种形式的LVI,则在每次关闭电源时,代码跑飞的可能性会非常大。实施LVI 有两种可选方式:内部和外部。
显而易见,片上LVI 是我们的首选,因为它不会产生任何额外成本。在使用带内 部LVI 的MCU(所有MC68HC(9)08)、而未采用外部LVI 的应用中,应该始终 启用内部LVI。两个CONFIG 寄存器位LVRSTD 和LVIPWRD 都应为零。这是 它的默认状态,但是在带3 伏选项的芯片中,要注意使用正确的电压。默认的电 压是3 伏,因此,在5 伏应用中,应该将相应的位(LVI5OR3)置1。即使CONFIG 寄存器中的默认值是正确的,也应在应用代码的开头,写入这个寄存器和所有其它的一次性写入寄存器。这样可以提供更高的安全性,因为即使在代码跑飞后,试图写入这些寄存器的操作也会被禁止。
![](http://blog.eccn.com/UploadFiles/2007-8/827948360.jpg) 在规定可以低至2.7 伏电压运行的芯片中,例如MC68HC(9)08KX8 或MC68HC(9)08GP32,LVI 可以在5 伏应用中提供出色的保护。它可以保证在3.9 至4.5 伏之间的某个电压下启动,从而确保电源电压在远没有降到规定的最低Vdd 电压之前,就将复位信号保持为低。为了得到最好的结果,应该使用法定的3 伏总线速度(不超过4MHz)。这可以确保到低至2.7 伏的整个电压范围下设备都正常运行。 如表1 所示,MC68HC(9)08 的LVI 的5 伏规范能保证当电压低于启动点时(在 3.9 到4.5 伏之间),将复位口维持低电平。在只有5 伏的MCU 中,如 MC68HC(9)08AZ60,在4.5 伏以上可以保证正常运行。尽管在LVI 启动点之上, 设备应该能正常运行,但实际上是无法保证的。在对安全性要求很高的应用中, 应该使用外部LVI。这样可以选择在电源电压降到4.5 伏以下之前启动,就百分 之百地确保了不会要求芯片在额定电压范围之外执行代码。图1 中给出了适用的 外部LVI 器件,包括MC33064 和MC34064,以及相应的电路。
![](http://blog.eccn.com/UploadFiles/2007-8/827657003.jpg) ![](http://blog.eccn.com/UploadFiles/2007-8/827429929.jpg) 图1:外部LVI 当电压下降时,有些应用可能需要将状态信息保存到内部或外部的非易失存储器中。LVI 就可以用于这一用途,但应注意避免超出规范以外的运行。如果启用了LVI,但没有启用复位功能,则可以通过轮询LVI 状态寄存器中的LVIOUT 位,来根据需要启动信息转移。然而,只有当电源电压仍然有效时,才可能进行操作。因此只有在采用5 伏LVI 启动点,而且按规定可以低至3 伏运行的应用中,这种方法才是适用的。只要采用4MHz 或更低的总线速度,就可以实现这-功能,例如在908GP32 或908KX8 中。 如果采用了这种方法,设计者就必须确保存储电容足够大,能在电压达到3 伏(如果想要代码在低于规范的Vdd 上运行,则应在RAM 上运行,而不是在闪存上运行。这是因为与闪存相比,RAM 能在更低的电压下正确读取数据。但是,如果Vdd 低于规定的最小值,这两种方法都不能保证正确的运行。) 之前,有充裕的时间来执行所需的代码。很显然,这个方法不能提供全面的LVI 掉电保护,我们一般不推荐使用这一方法。 还有一些启动这种操作而不使用LVI 的方法,从而能打开LVI 的全部功能(包 括复位功能)以备使用。然而,它们需要一个MCU 引脚和一些外部硬件。 当然,只需要一个2 脚的稳压器或3 脚的低电压检测(LVI)芯片就可以了。 可能的方法包括:将LVI 芯片(如MC34064)的信号送入轮询口,或者用 一个A/D 口监测带隙稳压器(如LM385-1.2 )。在后一种方法中(见图2),.. 随着电源电压下降,A/D 参考电压也随着Vdd 一起下降,而外部参考信号还 保持有效电平。结果就是随着电源电压的降低,参考信号的A/D 测量值反而 上升,而测量值就可用于在希望的电压下启动相应的程序。 ![](http://blog.eccn.com/UploadFiles/2007-8/827147526.jpg) 图2:外部电压参考信号 在有些电池应用中,可能有两个甚至三个阈值,在不同的阈值处要采取不同的措施(保存信息、关断大功耗硬件等)。采用A/D 的方法通过一个MCU 引脚就能满足这个要求。 1b上电保护 掉电时,内部LVI 可以控制复位脚,但在上电过程中也要当心。内部的上电复位 (POR)电路在振荡器启动前(一般是在Vdd 达到2 伏的几毫秒后),会保持复 位脚为低电平,然后再持续4096 个时钟周期的低电平。如果这段时间还不够长,无法确保电源电压在复位脚变为高平前达到规定的范围,那么就需要采取措施,使复位脚维持更长时间的低电平。诸如MC34064 之类的外部LVI(见图1)可以在电源电压低于启动点前保持复位脚为低电平。如果不采用外部LVI,最常见的方法就是在复位脚上加一个电容,以及上拉电阻器,如图3 所示。这样能充分延迟其上升时间,以使电源达到规定的最小值。设计人员必须利用他们对系统电源的了解,确定合适的时间常数。典型参数是10kΩ- 100k Ω和0.1μF - 1.0μF 。如果采用这种复位电路来提供上电保护,则应该始终启用内部LVI 以提供掉电保护。
![](http://blog.eccn.com/UploadFiles/2007-8/827423090.jpg) 图3. 简单的外部上拉和电容、 图3 中与复位脚串连的电阻是可选的。由于内部生成的低电平复位信号在输出至 引脚前有缓冲,因此这个电阻并非绝对必需。然而,我们还是建议您用示波器检查一下复位脚在上电和掉电阶段的动作。加上串连电阻后,外部电容的存在不会影响到内部产生的低电压环境,因此可以更清晰地观察复位信号。 1C复位脚的整体控制 图4 中给出了掉电和上电期间,电源电压以及复位脚的典型动作。掉电时,当电 源电压超出规定的范围,内部LVI 会拉低复位脚并且一直保持低电平,直到电源 重新建立。如果采用这项功能而且运行正常,那么对电源电压的下降时间就没有特别的要求。这样就允许采用电源衰减时间很长的设计,例如使用较大的存储电容,或者掉电时系统的电流消耗很低。只要加在LVI 上的电源电压还能让其电路正常运行,LVI 就可以在复位脚上保持低电平。如果深入观察复位脚上的信号就会发现,一旦电源降得非常低,复位脚会回漂到十分之几伏的电压。这是正常的。这种情况只有在电源电压已经降得非常低(不足1 伏),不可能执行任何代码,也不会破坏闪存时,才会发生。 MC68HC(9)08 规范中有电源电压须从100mV(有些器件是200mV,详见数据 手册)以下开始的要求,以保证内部上电复位(POR)。当电压接近为0 时,由 于半导体器件停止导通,使得有些应用的掉电衰减时间常数可能会太长。在系统设计过程中,应该考虑到这一点,以保证调电后剩余的Vdd 降到起始电平所需要的时间不至于长得不合理。例如,可以采取在主电源电容上跨接一个附加阻性负载的形式。 电源的初始上升斜率还应该足够快,以保证上电复位。所需的最小斜率取决于特定MCU 使用的Vdd。举例来说,MC68HC908GP32 的5 伏电压规范给出的数 字是35 伏/秒。大多数MC68HC08 设备都是这个数字(3 伏为20 伏/秒),但 908AZ60A 和908AB32 规定5 伏电压下为20 伏/秒。 图4. Vdd 和复位脚的典型波形 图4 显示的是采用图3 所示的外部RC 电路,而且POR 电路的运行正常时,复 位脚的动作。POR 保持复位脚为低电平,直到振荡器启动并运行了4096 个周期。 这时引脚被释放,在外部RC 电路的控制下变为高电平。设计者应该根据对电源 的了解来选择RC 时间常数,使复位脚只有在Vdd 超过其规定最低值之后,才能 升至规定的Vil 值(0.3xVdd)。 引言:MC68HC(9)08 系列MCU 具备防止代码跑飞的功能,而且即使发生了代码跑飞,它也能防止应用出现故障。导致代码跑飞的原因可能是错误的代码、超出规范允许范围运行MCU、或者是严重的EMI 或电气噪声事件。从定义来看,并没有明确指出在代码跑飞期间会出现什么情况,但是由于它是超出规范运行环境而导致的,很容易破坏程序计数器,从而导致MCU 出现不可预测的行为。 在可能发生这种现象的MCU 应用中,我们建议采取下文中介绍的各种预防措施。但是即使采取了这些推荐预防措施,在异常情况下,仍然存在着较小的代码跑飞的可能性。正因为如此,我们还介绍了能够防止MCU 或应用硬件在这种情形下遭到损坏的技术。在下列应用中,这些预防措施尤为重要:使用了任何类型的片上或外部非易失性存储器(闪存、EEPROM 或备份RAM)的应用、以及外部硬件有可能进入一种异常状态,甚至是破坏状态的应用。 根据定义,在代码跑飞后,MCU 的运行是不可预测的,甚至不能相信其I/O 端口会继续输出可接受的状态。这就有可能使其端口进入一种不可预测的状态,进而导致外部硬件也进入不可预测的状态。 在使用非易失性存储器的应用中,储存器中的内容有可能被MCU 的失控行为破 坏。如果闪存或EEPROM 存储器中包含应用代码,问题会更严重。如果代码遭 到破坏,整个应用可能都无法运行,而且不可能通过局部的重新编程来恢复。这就要求我们通过在线重新编程,甚至可能必须更换包含MCU 的整个PCB,来修复这些设备。 1. 防止代码跑飞 在基于ROM 的简单应用中,可能不使用非易失性存储器,也无需关心I/O 出现 无法预测的状态。在这种情况下,采取预防措施来防止代码跑飞就显得不那么紧迫,尽管它仍然具备一些作用,例如在电压下降时防止LED 指示灯或其它显示器的混乱闪烁。 即使事先没有迹象表明一个应用可能出现某种有害的故障,我们还是强烈建议您采取所有必要的预防措施,以防止代码跑飞,这是一个非常好的做法。这些建议都是一些老生常谈,但人们有时会置若罔闻,因此也并非总是被采用的。虽然我们在这里讨论的是MC68HC(9)08 这款特定的器件,但这些技术适用于所有MCU的应用。 在上电和掉电过程中,代码跑飞都是潜在的风险。这两种情况要以不同方式进行处理。 1a. 掉电保护 防止代码跑飞的最重要的方法就是低电压禁止功能(LVI)。当Vdd 电源降低到规定的最小值以下时,LVI 能让MCU 保持复位状态。尽管LVI 可以在电源故障时保护应用系统,但它最重要的作用还是在有意关断电源时出现的瞬时状态下提供保护。如果没有采用某种形式的LVI,则在每次关闭电源时,代码跑飞的可能性会非常大。实施LVI 有两种可选方式:内部和外部。
显而易见,片上LVI 是我们的首选,因为它不会产生任何额外成本。在使用带内 部LVI 的MCU(所有MC68HC(9)08)、而未采用外部LVI 的应用中,应该始终 启用内部LVI。两个CONFIG 寄存器位LVRSTD 和LVIPWRD 都应为零。这是 它的默认状态,但是在带3 伏选项的芯片中,要注意使用正确的电压。默认的电 压是3 伏,因此,在5 伏应用中,应该将相应的位(LVI5OR3)置1。即使CONFIG 寄存器中的默认值是正确的,也应在应用代码的开头,写入这个寄存器和所有其它的一次性写入寄存器。这样可以提供更高的安全性,因为即使在代码跑飞后,试图写入这些寄存器的操作也会被禁止。
![](http://blog.eccn.com/UploadFiles/2007-8/827948360.jpg) 在规定可以低至2.7 伏电压运行的芯片中,例如MC68HC(9)08KX8 或MC68HC(9)08GP32,LVI 可以在5 伏应用中提供出色的保护。它可以保证在3.9 至4.5 伏之间的某个电压下启动,从而确保电源电压在远没有降到规定的最低Vdd 电压之前,就将复位信号保持为低。为了得到最好的结果,应该使用法定的3 伏总线速度(不超过4MHz)。这可以确保到低至2.7 伏的整个电压范围下设备都正常运行。 如表1 所示,MC68HC(9)08 的LVI 的5 伏规范能保证当电压低于启动点时(在 3.9 到4.5 伏之间),将复位口维持低电平。在只有5 伏的MCU 中,如 MC68HC(9)08AZ60,在4.5 伏以上可以保证正常运行。尽管在LVI 启动点之上, 设备应该能正常运行,但实际上是无法保证的。在对安全性要求很高的应用中, 应该使用外部LVI。这样可以选择在电源电压降到4.5 伏以下之前启动,就百分 之百地确保了不会要求芯片在额定电压范围之外执行代码。图1 中给出了适用的 外部LVI 器件,包括MC33064 和MC34064,以及相应的电路。
![](http://blog.eccn.com/UploadFiles/2007-8/827657003.jpg) ![](http://blog.eccn.com/UploadFiles/2007-8/827429929.jpg) 图1:外部LVI 当电压下降时,有些应用可能需要将状态信息保存到内部或外部的非易失存储器中。LVI 就可以用于这一用途,但应注意避免超出规范以外的运行。如果启用了LVI,但没有启用复位功能,则可以通过轮询LVI 状态寄存器中的LVIOUT 位,来根据需要启动信息转移。然而,只有当电源电压仍然有效时,才可能进行操作。因此只有在采用5 伏LVI 启动点,而且按规定可以低至3 伏运行的应用中,这种方法才是适用的。只要采用4MHz 或更低的总线速度,就可以实现这-功能,例如在908GP32 或908KX8 中。 如果采用了这种方法,设计者就必须确保存储电容足够大,能在电压达到3 伏(如果想要代码在低于规范的Vdd 上运行,则应在RAM 上运行,而不是在闪存上运行。这是因为与闪存相比,RAM 能在更低的电压下正确读取数据。但是,如果Vdd 低于规定的最小值,这两种方法都不能保证正确的运行。) 之前,有充裕的时间来执行所需的代码。很显然,这个方法不能提供全面的LVI 掉电保护,我们一般不推荐使用这一方法。 还有一些启动这种操作而不使用LVI 的方法,从而能打开LVI 的全部功能(包 括复位功能)以备使用。然而,它们需要一个MCU 引脚和一些外部硬件。 当然,只需要一个2 脚的稳压器或3 脚的低电压检测(LVI)芯片就可以了。 可能的方法包括:将LVI 芯片(如MC34064)的信号送入轮询口,或者用 一个A/D 口监测带隙稳压器(如LM385-1.2 )。在后一种方法中(见图2),.. 随着电源电压下降,A/D 参考电压也随着Vdd 一起下降,而外部参考信号还 保持有效电平。结果就是随着电源电压的降低,参考信号的A/D 测量值反而 上升,而测量值就可用于在希望的电压下启动相应的程序。 ![](http://blog.eccn.com/UploadFiles/2007-8/827147526.jpg) 图2:外部电压参考信号 在有些电池应用中,可能有两个甚至三个阈值,在不同的阈值处要采取不同的措施(保存信息、关断大功耗硬件等)。采用A/D 的方法通过一个MCU 引脚就能满足这个要求。 1b上电保护 掉电时,内部LVI 可以控制复位脚,但在上电过程中也要当心。内部的上电复位 (POR)电路在振荡器启动前(一般是在Vdd 达到2 伏的几毫秒后),会保持复 位脚为低电平,然后再持续4096 个时钟周期的低电平。如果这段时间还不够长,无法确保电源电压在复位脚变为高平前达到规定的范围,那么就需要采取措施,使复位脚维持更长时间的低电平。诸如MC34064 之类的外部LVI(见图1)可以在电源电压低于启动点前保持复位脚为低电平。如果不采用外部LVI,最常见的方法就是在复位脚上加一个电容,以及上拉电阻器,如图3 所示。这样能充分延迟其上升时间,以使电源达到规定的最小值。设计人员必须利用他们对系统电源的了解,确定合适的时间常数。典型参数是10kΩ- 100k Ω和0.1μF - 1.0μF 。如果采用这种复位电路来提供上电保护,则应该始终启用内部LVI 以提供掉电保护。
![](http://blog.eccn.com/UploadFiles/2007-8/827423090.jpg) 图3. 简单的外部上拉和电容、 图3 中与复位脚串连的电阻是可选的。由于内部生成的低电平复位信号在输出至 引脚前有缓冲,因此这个电阻并非绝对必需。然而,我们还是建议您用示波器检查一下复位脚在上电和掉电阶段的动作。加上串连电阻后,外部电容的存在不会影响到内部产生的低电压环境,因此可以更清晰地观察复位信号。 1C复位脚的整体控制 图4 中给出了掉电和上电期间,电源电压以及复位脚的典型动作。掉电时,当电 源电压超出规定的范围,内部LVI 会拉低复位脚并且一直保持低电平,直到电源 重新建立。如果采用这项功能而且运行正常,那么对电源电压的下降时间就没有特别的要求。这样就允许采用电源衰减时间很长的设计,例如使用较大的存储电容,或者掉电时系统的电流消耗很低。只要加在LVI 上的电源电压还能让其电路正常运行,LVI 就可以在复位脚上保持低电平。如果深入观察复位脚上的信号就会发现,一旦电源降得非常低,复位脚会回漂到十分之几伏的电压。这是正常的。这种情况只有在电源电压已经降得非常低(不足1 伏),不可能执行任何代码,也不会破坏闪存时,才会发生。 MC68HC(9)08 规范中有电源电压须从100mV(有些器件是200mV,详见数据 手册)以下开始的要求,以保证内部上电复位(POR)。当电压接近为0 时,由 于半导体器件停止导通,使得有些应用的掉电衰减时间常数可能会太长。在系统设计过程中,应该考虑到这一点,以保证调电后剩余的Vdd 降到起始电平所需要的时间不至于长得不合理。例如,可以采取在主电源电容上跨接一个附加阻性负载的形式。 电源的初始上升斜率还应该足够快,以保证上电复位。所需的最小斜率取决于特定MCU 使用的Vdd。举例来说,MC68HC908GP32 的5 伏电压规范给出的数 字是35 伏/秒。大多数MC68HC08 设备都是这个数字(3 伏为20 伏/秒),但 908AZ60A 和908AB32 规定5 伏电压下为20 伏/秒。 图4. Vdd 和复位脚的典型波形 图4 显示的是采用图3 所示的外部RC 电路,而且POR 电路的运行正常时,复 位脚的动作。POR 保持复位脚为低电平,直到振荡器启动并运行了4096 个周期。 这时引脚被释放,在外部RC 电路的控制下变为高电平。设计者应该根据对电源 的了解来选择RC 时间常数,使复位脚只有在Vdd 超过其规定最低值之后,才能 升至规定的Vil 值(0.3xVdd)。
[此贴子已经被作者于2007-8-28 18:21:32编辑过] |