本文的目的是,在如何避免意外的Flash写或者擦除方面提供一个指导和实践,这些意外可能会导致较小的或者灾难性的现场失效。给软件增加Flash编程安全保障将可以减小问题的风险和确保可靠的现场更新。以下材料,通过理解潜在的问题和提供避免他们的方法,来增加软件的强健性。
潜在的风险主要有哪些呢?
为了保护意外的擦除或者写损坏,理解这些类型的问题在应用中是如何发生,是很有必要的,大多数问题是由于以下方面导致:
A硬件问题,指令错误执行
B 运行规格冲突
C概念的和架构性弱点
这里主要将讨论硬件相关的问题,他们可以导致超规格运行,概念和架构性问题。尽管软件和代码错误或许同样可以导致自写潜在问题,但是一般的好的编程习惯是不在我们讨论范围内的。
硬件问题我们简单说明如下:
1.所有电气设计是被怀疑为硬件相关问题的,它可以由很多问题来源产生。
2.本文聚焦在阻止指令误操作,这些误操作可能由电源和时钟电路导致。
图1 代码流执行错误说明
为什么会发生指令误操作呢,这里我们先简要说明如下,
在程序指令从Flash Memory中取指期间,当信号时序在MCU内核不满足时指令误操作会发生,这是经常典型的情景,由低电压条件或者时钟脉冲信号超规格导致。例如,考虑一个情况,当在一个普通C函数的末端执行RETURN指令时,在dsPIC33和PIC24架构中,RETURN指令以0000 0110 0000 0000 0000 0000来编码的,如果一个时序冲突发生在从flash中取指期间,RETURN指令将被误解读为01000110 0000 0000 0000 0000,尽管值的变化仅仅有一位,它将极大的改变这个指令的含义为ADD指令。
在一个C程序中,如果ADD或者其它指令操作码替代我们期望的RETURN指令执行时,结果将是一个C函数流入flash中相邻的下一个函数。在例子1中,不期望的代码流场景可以允许C函数,例如Flash Memory擦写函数产生不期望的调用。
除了RETURN指令之外,CALL,GOTO或者其它程序计数器相关的branch指令,同样经常显示在代码中,并且可以允许不期望的代码达到。如果目标地址在读Flash或者解码和执行时经历一个位的翻转时,PC计数器或许依旧指向实施的Flash Memory空间,但是不是期望的地址。
在电源因素上,我们需要考虑什么因素呢?
首先为了避免指令误操作,MCU需要供电电源在他们的电气规格内确保合适运行,这里有很多因素可以导致Issue,包含如下,
A开关或者按钮的机械接触弹起,电池接触,继电器,和电源线缆干扰VDD
B电压调整器的精度
C温度环境和机械寿命导致的变化。
D较差的电路板Layout
E较差的隔离或者EMI兼容性导致的高频电源噪声
MCU除了稳态运行,必须能够合适的处理启动和关断事件,这些瞬态条件具有对于电压和频率时序的需求,图1显示出典型的电压频率图示,为了在一个给定的速度和温度下运行,一个特定的电源电压必须要提供,考虑到一个特殊情况,当系统电源暂时还没有完全达到其典型值的场景,但是MCU已经配置为以全速运行。这种低电压条件可以导致MCU的信号时序冲突,和指令的错误执行,在关断时相同的情况也会发生,MCU在全速运行但电源电压在下掉。
图2 电压频率限制图
对于应用中的启动和关断行为需要特殊的小心分析,启动和关断时间或许对于人来说很短,微秒或者毫秒级,但是事实上可以允许几十万条指令执行。机械元件,例如开关和连接器,对于MCU的电源可以导致潜在的问题,如果电源或者VDD的电容不能足够的去滤波他们的话,接触弹起可能强制启动和关断重复多次,而实际上只需要一次。
综合这个问题,当新的和经过很多年运行被现场破坏的相比较而言,机械系统会展示出相当不同的电气特性,如果在很长时间内空闲,表面氧化物和污物会累积并且进一步退化,当使用机械系统去断开电源,开关切换后放置的电容可以减小MCU看到的VDD的不稳定,但是需要一定的评估,去确保切换瞬间峰值Inrush电流不超过元器件的Rating,否则可能会永久的损坏元器件。
dsPIC33和PIC24 MCU具有一个BOR的电路(Brown OutReset),去缓和欠压条件和将CPU放置到复位状态,避免不期望的行为发生。当你应对VDD瞬态导致的指令误执行,BOR电路也不一定能解决一切问题。BOR电路的硬件使用模拟电路实施,这些电路必须使用不确定的和可能不稳定的VDD产生内部电压参考,去给这些电路供电。他们同样不得不平衡精确的电压,快速的响应时间,和MCU在睡眠时的低静态功耗。
为了处理这些需求,大多数的BOR设计为多模式运行,例如,在VDD上升时,BOR电路保持系统在复位状态,然后当VDD接近BOR释放门限时,它进入更为精确的快速响应模式,它又在系统开始执行时和VDD远离BOR触发点时转换为低电流状态,当VDD下降或者进入睡眠态中的低电流运行状态时,它又会进行模式转换。BOR可以检测各种状态下的电源功耗,但是每一种模式都有一个调整时间delay,确切的触发电压和响应延时,或许VDD在快速振荡变化中穿过BOR触发点时发生变化。
此外,BOR仅仅保护低电压条件,它不能简单或者阻止过快的时钟配置选择或者使用在接近BOR限制时,电源事件经常和非常的某些电路产生的电气噪声巧合,例如,VDD由一个DC/DC电源供电,开启这个电源导致对所有VDD电容在几个毫秒内充电,这意味着VDD将足够的高,对于BOR电路释放给运行阶段,同时电源一直在大电流下开关去充电所有的VDD电容,这是一个去执行几十万条指令的机会,也是一段有很大噪声和不期望的时间,可能导致你的RTSP代码执行带来潜在风险。
在非常低的速度下启动MCU,例如使用FRC,并且后面采用clock switch切换到高速时钟,可以增加强健性,这样可以减小启动时的峰值电流,同时减小在VDD达到稳定状态前的指令执行数目。
外部电压监控器是否可以提供额外的保护呢?接下来我们一起分析一下。
一个外部电压监控器提供额外的保护,避免欠压和超出规格,他们采样电源电压,并且可以通过控制MCLR 引脚将MCU放置在reset状态。一个外部电压监控器是尤其重要的,对于那些允许电源超出规格运行的系统,例如,电压下掉而不会掉到0V,当电源电压掉到低于门限电压时,如0.1V-0.7V之间时,一些MCU内部的BOR和POR电路或许不会产生一个确定的输出,会给出一个
不充分的电压去供自身运行,一些器件会指定这个条件是超规格的,一定需要VDD回到0V,再上升到最小的VDD 电平,如图3所示。可以参考器件规格书电气规格去确定一些细节和限制,这可能会产生一些问题,尤其是在电池供电的应用中。
图3 VDD启动电压及斜率要求
从图3来看,VDD启动具有一定的起始电压VSS,而启动斜率也有一定的要求,如此dsPIC33C处为0.03V/ms.
一个干净的和规格内的时钟是MCU合适运行的关键因素。一些小脉冲,偏斜的占空比,噪声,和其它异常扰动最小时钟脉宽,甚至于一个周期,将导致指令误写。时钟振荡器启动是一个特殊的工况,需要用示波器观察,并且在整个运行范围内去确保有效运行。使用一个时钟,可能它的系统可以启动,在它达到充分的幅度和一个稳定周期之前,例如如下图4,启动一个MCU基于内部FRC,在它稳定后切换为外部振荡器,可以改善其稳定性。如果使用PLL去增加时钟速度,确保它在运行限制之内,不要在其运行中改变其关键设置,参考器件的规格书,可以得到更多的PLL限制细节。
图4 振荡器启动示意图
产品FRM给出的振荡器启动波形如下图5所示。
图5 振荡器启动特性图
为了确保晶振启动并且稳定,振荡器的启动定时器OST可以提供给POSC,其中OST是一个简单的10位的计数器,可以计数1024个周期,然后释放振荡器时钟给系统运行,这个时间被定义为TOST.
振荡器信号的幅值必须达到振荡器的pin的VIL和VIH门限,然后OST才会计数周期,TOST时间在每次振荡器重启时都会需要,如POR,BOR和睡眠唤醒等,当XT或者HS模式选择之后,这里需要注意EC模式选择时TOST定时器是不工作的。
对于振荡器启动过程,一般来说,当主振荡器使能之后,需要一定的时间去开始振荡,这个delay时间定义为TOSCD,在TOSCD之后,OST定时器开始延时1024个时钟周期TOST,然后再释放时钟,时钟做好准备的总的delay时间是TOST和TOSCD,如果PLL使能的话,将具有一个额外的delay发生,以便PLL锁定,如图6所示。
图6 振荡器启动延时和I/O翻转
当振荡器功能不使用时(如使用内部振荡器FRC或者使用外部时钟时),主振荡器pin OSC1和OSC2可以用作其它功能,POSCMD配置位决定振荡器pin的功能,而OSCIOFNC位决定OSC2的pin的功能。
图7 振荡器寄存器说明
图7中,注意此处前述讲到EC代表外部时钟模式选择,在XT和HS模式时,OSCIOFNC为1时,这个pin为时钟输出pin,指令周期FCY时钟会输出在OSC2 pin上,S1OSCIOFNC配置位是在双核产品中slave内核的相应时钟pin输出功能。
图8 OSC2时钟输出pin的功能
图9 相关时钟启动delay规格说明
此处需要注意TOSC是OSCI的周期,TOST为1024个TOSC的周期,对于FRC启动时TOSCD时间最大为15us。
图10 相关时钟规格说明
从上述图10来看,输入时钟的最小周期为15.63nS,这个时钟也就是是对TOSC的要求。
总结,上述针对MCU可靠性设计的若干因素进行讨论,如电源,时钟等方面,并Review了相关的规格书规格,这些潜在的因素会导致程序指令误写从而导致不良后果,需要引起系统设计者的注意。
参考文档:
AN3399 SafeguardingFlash Memory Self-Write Operations
FRM Oscillator Module with High-Speed PLL
Datasheet dsPIC33CK256MP508 FAMILY