C8051F的读写芯片FLASH的注意事项

来源:互联网 发布:组织行为学 知乎 编辑:程序博客网 时间:2024/05/16 14:28

摘自:http://bbs.ednchina.com/showtopic-114617.aspx

Flash被破坏


 

问题


在设备上的FLASH代码空间领域似乎是不经意地修改或损坏。


解决方案


任何系统,它包含程序的写或擦除FLASH存储器涉及一些风险,FLASH写/擦除程序将执行如果CPU频率的外部或系统时钟其定义的工作范围VDD,温度,。我们的目标是尽量减少这种风险通过启用FLASH写和擦除尽可能少(只有一个代码放置在可以写入到FLASH,只有一个代码放置在可擦除闪存)模式,并确保在CPU总是定义操作在。 原因闪存腐败的最常见的是“软件”的基础,也就是说,CPU执行的MOVX写的业务,而PSWE位设置为1。 这可能发生,如果CPU转向中断服务程序执行一个空间的pdata xdata转让或给一个变量位于。 有些设备,如C8051F3xx家庭,包括一个FLASH锁定和关键序列(FLKEY),以帮助减少这种风险。

许多事情可以做的FLASH的代码,以防止腐败,如明确使VDD监视器,(如适用)和禁止中断时PSWE = 1。 幸运的是,有一些额外的保护机制,可以使系统更加健壮。

为潜在FLASH的腐败最有可能的候选人就是CPU复位过早退出(在VDD达到Vrst)在初始上电。 这通常是由系统VDD上升时间小于1毫秒的数据表规范慢(对于F30x,'F31x,和'F33x系列器件)。 解决的方法之一就是安装在/ RST引脚片外VDD的掉电电路。 另一种方法是在代码中执行额外的保障措施,确保片内VDD监视器始终启用每当写或擦除闪存尝试。 当然,它也完全可以接受的实现这些(硬件和软件)的计划两者。

另外一个潜在的系统参数,可以影响CPU执行代码的可靠性是系统时钟源。 如果系统时钟由外部晶体振荡器产生,那么外部EMI耦合会导致侏儒脉冲到系统时钟网络,可导致不确定的操作耦合。 一种方法,以减少这种风险,是使“除以2”中的外部晶体振荡器选项。 更好的方法是使用内部振荡器或外部CMOS可以使用振荡器(其中一个是在一个金属屏蔽,以防止外部耦合效应的敏感水晶元素包裹)。

另一个潜在的时钟源相关的设备上可能会发生问题是在大于25 MHz的系统时钟速度运行。 如果设备被指定为工作在大于25兆赫,做出一定的Flash读时序位(FLRT)在Flash量表(FLSCL)寄存器中设置了正确的时钟速度。 如果CPU超过25兆赫和FLRT位速度运行的设置不正确,不正确的操作可能会因为操作码可以读出程序存储器不正确。

这些建议归纳如下:

硬件检查清单:


1。 使用一个良好的电源去耦策略(大型和小型的陶瓷电容器)表示,如果ESD静电领会是对你的产品的威胁(暴露连接器等,这包括任何带有连接器的USB系统。)。 新增瞬态电压的电源抑制二极管如果ESD净是一种威胁。

2。 压力测试对生产经营单位经常骑自行车的动力系统。

3。 压力测试通过运行基于改进的目标板(所有去耦电容去掉)IT软件和使用函数发生器,电源VDD(1 Hz的三角波测试,缩小“(<1微秒)深(1.5低于名义VDD的V)的脉冲序列检验)。

4。 请相信,除了VDD监视器,时钟丢失检测器作为复位源启用。

5。 如果使用外部晶体,晶体确保痕迹很短,是平面的保护地。 从物理扰动保护外部振荡电路。 请注意,除了布局,晶体也是敏感的 温度 。

6。 如果系统)操作系统在嘈杂的环境或RF电(高层次的电磁干扰,由于大电流或电压开关,如继电器,马达控制应用,发射器,使用一个外部的“可以”振荡器,如果需要精确的时间基准,或使用设备上的内部振荡器。  不要 在这些应用中使用了晶体振荡器的电气干扰会导致CPU接触到“矮”脉冲违反最低系统时钟周期的高,低倍。

7。 切换到内部振荡器在Flash写或擦除操作。 外部振荡器可以继续运行,并且CPU可以切换回它时,Flash操作已完成。

8。 如果无法切换到内部振荡器,使用的XTAL / 2。 这将减少一个侏儒脉冲将被提交到CPU的机会。

9。 如果无法切换到内部振荡器,为XTLVLD投票之前,Flash操作,以确认该振荡器运行,是稳定的。

10。 如果无法切换到内部振荡器,使用晶体驱动力量,是一个值比正常Flash操作过程中,如果可能更高。

11。 如果超过25 MHz的系统时钟频率运行,使肯定的是,闪存读取FLSCL时序位都设置适当的工作频率。

简单的软件清单:

12。 有且只有一个例程写入快闪记忆体和一个例行程序擦除闪存。 这些应该在代码中仅有的两个地方PSWE位设置为'1'的地方。

13。 禁止中断= 1时PSWE在Flash擦写程序。  

14。 禁止中断使用在“EA = 0;电针= 0;”。

15。 数之间的最小化“PSWE = 1”和“PSWE = 0”的说明。

16。 指针的地址执行任何计算或循环变量的更新仅在PSWE为0。 使用简单的指针引用,例如“* pwrite = the_data;”。  不要 提领夫妇与更新的地址,如“* pwrite + + = the_data;”。

17。 Flash写明确定位在'资料'或'的别名'段,而不是'的pdata'或'xdata'指针。能使用“契约”和“大”的内存模型谨慎,因为这些模型将存储自动变量,如指针和循环计数器在'的pdata'和'xdata'段。

18。 如果写一个字节的Flash,支架系列与PSWE指针引用写道如下:

无符号char xdata *的别名pwrite;
无符号字符*来源;
无符号字符mydata;
为(地址= 0;地址<100;地址+ +)
{
    / /执行复杂的数学或任何指针
    / /提领时PSWE = 0
    mydata = *源+ +; 

    / /将指针时PSWE = 0
    pwrite =(无符号char xdata *)地址; 
    
    / / PSWE = 1
    PSCTL = 0x01;    

    / /开始使用一个简单的字节写
    / /提领(无地址递增或递减)
    * pwrite = mydata;      

    / / PSWE = '0'
    PSCTL = 0; 
}

19。 找到代码中的所有实例写入复位源寄存器(RSTSRC),并 在每一个确认 的VDD监视器被明确地源启用为复位。 特别是,检查任何情况下代码试图迫使软件复位,因为许多程序员会无意中禁用VDD监视器当强制软件复位。

20。 此外confim所有写入RSTSRC使用直接赋值运算符(=)和  使用-明智的经营者,如有些“| =”或"&=".

21。 启用VDD监视器,使作为内Startup.A51(为Keil C51的),或者在_sdcc_external_startup(复位源代码中)(用于SDCC的)。 如果使用不同的编译器,检查修改系统启动代码的编译器的文档。

22。 设备上有一个VDM0CN登记,可解决使VDD监视器,使作为一个复位源VDD监视器任何拖延。

23。 启用VDD监视器,使作为复位源里面写和擦除的Flash程序,然后在Flash写或擦除操作发生。

24。 对于引导加载方案,传输的Flash锁和整个引导加载界面的关键序列(0xA5将使返回0xF1写入向FLKEY)。 不要放置在代码空间的关键序列,如果你没有的。

25。 对于非引导加载方案,推导了Flash锁和密钥序列使用的算法(如与0x55异或),例如,如果程序的控制进入Flash写或擦除意外常规,不正确的闪光灯键序列将被传递到硬件,从而保护了闪存。

26。 对于计划中,Flash写/擦除操作将要等到下一个系统复位需要,故意写一个不正确的闪存锁和密钥序列向FLKEY。 这将导致进一步的硬件忽略任何试图写或擦除。

27。 执行地址边界检查里面的Flash擦写程序。 生成一个系统复位,如果目标地址是出界(请确保您不小心禁用作为复位源VDD监视器)。

先进的软件清单:

28。 使用链接器(或编译器如果可以这样做),明确定位Flash写和擦除接近结束程序代码空间。 这将有助于防止它们被意外地立即执行的,由于上面的入口点为分行的失败。

29。 地方“陷阱”前夕闪光功能写和擦除函数的入口点,这样如果程序控制前一个例行的“不断下降”,它会打击陷阱,而不是Flash写/擦除功能。 陷阱例程应该强制系统复位。


应用笔记AN201是一个闪光的修改代码示例资源。 应用笔记AN201 - “写作从固件到FLASH”可以在以下网址找到:


原创粉丝点击