智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 3240|回复: 3
打印 上一主题 下一主题

[软件类] 防止由于代码跑飞而导致 MCU 应用故

[复制链接]

7

主题

9

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
272
QQ
威望
244
贡献
26
兑换币
8
注册时间
2010-1-18
在线时间
1 小时
跳转到指定楼层
1#
发表于 2010-1-18 19:10:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
MC68HC(9)08 系列MCU 具备防止代码跑飞的功能,而且即使发生了代码跑飞,
它也能防止应用出现故障。导致代码跑飞的原因可能是错误的代码、超出规范允
许范围运行MCU、或者是严重的EMI 或电气噪声事件。从定义来看,并没有明
确指出在代码跑飞期间会出现什么情况,但是由于它是超出规范运行环境而导致
的,很容易破坏程序计数器,从而导致MCU 出现不可预测的行为。
在可能发生这种现象的 MCU 应用中,我们建议采取下文中介绍的各种预防措施。
但是即使采取了这些推荐预防措施,在异常情况下,仍然存在着较小的代码跑飞
的可能性。正因为如此,我们还介绍了能够防止MCU 或应用硬件在这种情形下
遭到损坏的技术。在下列应用中,这些预防措施尤为重要:使用了任何类型的片
上或外部非易失性存储器(闪存、EEPROM 或备份RAM)的应用、以及外部硬
件有可能进入一种异常状态,甚至是破坏状态的应用。
根据定义,在代码跑飞后,MCU 的运行是不可预测的,甚至不能相信其I/O 端口
会继续输出可接受的状态。这就有可能使其端口进入一种不可预测的状态,进而
导致外部硬件也进入不可预测的状态。
在使用非易失性存储器的应用中,储存器中的内容有可能被MCU 的失控行为破
坏。如果闪存或EEPROM 存储器中包含应用代码,问题会更严重。如果代码遭
到破坏,整个应用可能都无法运行,而且不可能通过局部的重新编程来恢复。这
就要求我们通过在线重新编程,甚至可能必须更换包含MCU 的整个PCB,来修
复这些设备。
防止由于代码跑飞而导致MCU 应用故障的技术
2 General Business Information 飞思卡尔半导体
在基于 ROM 的简单应用中,可能不使用非易失性存储器,也无需关心I/O 出现
无法预测的状态。在这种情况下,采取预防措施来防止代码跑飞就显得不那么紧
迫,尽管它仍然具备一些作用,例如在电压下降时防止LED 指示灯或其它显示器
的混乱闪烁。
即使事先没有迹象表明一个应用可能出现某种有害的故障,我们还是强烈建议您
采取所有必要的预防措施,以防止代码跑飞,这是一个非常好的做法。这些建议
都是一些老生常谈,但人们有时会置若罔闻,因此也并非总是被采用的。虽然我
们在这里讨论的是MC68HC(9)08 这款特定的器件,但这些技术适用于所有MCU
的应用。
1. 防止代码跑飞
在上电和掉电过程中,代码跑飞都是潜在的风险。这两种情况要以不同方式进行
处理。
防止代码跑飞的最重要的方法就是低电压禁止功能(LVI)。当Vdd 电源降低到
规定的最小值以下时,LVI 能让MCU 保持复位状态。尽管LVI 可以在电源故障
时保护应用系统,但它最重要的作用还是在有意关断电源时出现的瞬时状态下提
供保护。如果没有采用某种形式的LVI,则在每次关闭电源时,代码跑飞的可能
性会非常大。实施LVI 有两种可选方式:内部和外部。
显而易见,片上LVI 是我们的首选,因为它不会产生任何额外成本。在使用带内
部LVI 的MCU(所有MC68HC(9)08)、而未采用外部LVI 的应用中,应该始终
启用内部LVI。两个CONFIG 寄存器位LVRSTD 和LVIPWRD 都应为零。这是
它的默认状态,但是在带3 伏选项的芯片中,要注意使用正确的电压。默认的电
压是3 伏,因此,在5 伏应用中,应该将相应的位(LVI5OR3)置1。即使CONFIG
寄存器中的默认值是正确的,也应在应用代码的开头,写入这个寄存器和所有其
它的一次性写入寄存器。这样可以提供更高的安全性,因为即使在代码跑飞后,
试图写入这些寄存器的操作也会被禁止。
7 6 5 4 3 2 1 0
LVISTOP LVIRSTD LVIPWRD LVI5OP3
CONFIG 寄存器中的LVI 控制位
在规定可以低至 2.7 伏电压运行的芯片中,例如MC68HC(9)08KX8 或
MC68HC(9)08GP32,LVI 可以在5 伏应用中提供出色的保护。它可以保证在3.9
至4.5 伏之间的某个电压下启动,从而确保电源电压在远没有降到规定的最低
Vdd 电压之前,就将复位信号保持为低。为了得到最好的结果,应该使用法定的
3 伏总线速度(不超过4MHz)。这可以确保到低至2.7 伏的整个电压范围下设
备都正常运行。
1a. 掉电保护
1. 防止代码跑飞
防止由于代码跑飞而导致MCU 应用故障的技术
飞思卡尔半导体 General Business Information 3
如表 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,以及相应的电路。
表 1. LVI 启动电压
VDD LVI 启动点(电压下降)
最小 典型 最大
3 伏2.45 2.60 2.70
5 伏3.90 4.25 4.50
图 1:外部LVI
当电压下降时,有些应用可能需要将状态信息保存到内部或外部的非易失存储器
中。LVI 就可以用于这一用途,但应注意避免超出规范以外的运行。如果启用了
LVI,但没有启用复位功能,则可以通过轮询LVI 状态寄存器中的LVIOUT 位,
来根据需要启动信息转移。然而,只有当电源电压仍然有效时,才可能进行操作。
因此只有在采用5 伏LVI 启动点,而且按规定可以低至3 伏运行的应用中,这种
方法才是适用的。只要采用4MHz 或更低的总线速度,就可以实现这-功能,例
如在908GP32 或908KX8 中。
如果采用了这种方法,设计者就必须确保存储电容足够大,能在电压达到3 伏1
之前,有充裕的时间来执行所需的代码。很显然,这个方法不能提供全面的LVI
掉电保护,我们一般不推荐使用这一方法。
1. 如果想要代码在低于规范的Vdd 上运行,则应在RAM 上运行,而不是在闪存上运行。这是因
为与闪存相比,RAM 能在更低的电压下正确读取数据。但是,如果Vdd 低于规定的最小值,这两
种方法都不能保证正确的运行。
1. 防止代码跑飞
防止由于代码跑飞而导致MCU 应用故障的技术
4 General Business Information 飞思卡尔半导体
还有一些启动这种操作而不使用 LVI 的方法,从而能打开LVI 的全部功能(包
括复位功能)以备使用。然而,它们需要一个MCU 引脚和一些外部硬件。
当然,只需要一个2 脚的稳压器或3 脚的低电压检测(LVI)芯片就可以了。
可能的方法包括:将LVI 芯片(如MC34064)的信号送入轮询口,或者用
一个A/D 口监测带隙稳压器(如LM385-1.2)。在后一种方法中(见图2),
随着电源电压下降,A/D 参考电压也随着Vdd 一起下降,而外部参考信号还
保持有效电平。结果就是随着电源电压的降低,参考信号的A/D 测量值反而
上升,而测量值就可用于在希望的电压下启动相应的程序。
图 2:外部电压参考信号
在有些电池应用中,可能有两个甚至三个阈值,在不同的阈值处要采取不同的措
施(保存信息、关断大功耗硬件等)。采用A/D 的方法通过一个MCU 引脚就能
满足这个要求。
掉电时,内部LVI 可以控制复位脚,但在上电过程中也要当心。内部的上电复位
(POR)电路在振荡器启动前(一般是在Vdd 达到2 伏的几毫秒后),会保持复
位脚为低电平,然后再持续4096 个时钟周期的低电平。如果这段时间还不够长,
无法确保电源电压在复位脚变为高平前达到规定的范围,那么就需要采取措施,
使复位脚维持更长时间的低电平。诸如MC34064 之类的外部LVI(见图1)可以
在电源电压低于启动点前保持复位脚为低电平。如果不采用外部LVI,最常见的
方法就是在复位脚上加一个电容,以及上拉电阻器,如图3 所示。这样能充分延
迟其上升时间,以使电源达到规定的最小值。设计人员必须利用他们对系统电源
的了解,确定合适的时间常数。典型参数是10kΩ- 100kΩ和0.1μF - 1.0μF。如
果采用这种复位电路来提供上电保护,则应该始终启用内部LVI 以提供掉电保护。
1b. 上电保护
1. 防止代码跑飞
防止由于代码跑飞而导致MCU 应用故障的技术
飞思卡尔半导体 General Business Information 5
图 3. 简单的外部上拉和电容
图 3 中与复位脚串连的电阻是可选的。由于内部生成的低电平复位信号在输出至
引脚前有缓冲,因此这个电阻并非绝对必需。然而,我们还是建议您用示波器检
查一下复位脚在上电和掉电阶段的动作。加上串连电阻后,外部电容的存在不会
影响到内部产生的低电压环境,因此可以更清晰地观察复位信号。
图 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 伏/秒。
1c. 复位脚的

8

主题

78

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
469
QQ
威望
342
贡献
53
兑换币
11
注册时间
2010-3-13
在线时间
37 小时
2#
发表于 2010-5-5 19:31:35 | 只看该作者
谢谢!
回复 支持 反对

使用道具 举报

3

主题

59

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
429
威望
340
贡献
77
兑换币
0
注册时间
2010-3-4
在线时间
6 小时
3#
发表于 2010-7-6 21:12:53 | 只看该作者
谢谢诶
回复 支持 反对

使用道具 举报

17

主题

202

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1235
威望
626
贡献
417
兑换币
385
注册时间
2012-11-9
在线时间
96 小时
4#
发表于 2013-3-24 16:02:23 | 只看该作者
能用不
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关于我们|联系我们|小黑屋|智能车制作 ( 黑ICP备2022002344号

GMT+8, 2025-1-10 16:03 , Processed in 0.324763 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表