首页 第13章_Flash存储器

第13章_Flash存储器

举报
开通vip

第13章_Flash存储器第13章_Flash存储器 第13章 Flash存储器 第13章 Flash存储器 Flash存储器具有电可擦除、无需后备电源来保护数据、可在线编程、存储密度高、低功耗、成本较低等特点,这使得Flash存储器在嵌入式系统中的使用迅速增长。 本章主要以HC08系列中的GP32为例阐述Flash存储器的在线编程方法,也简要阐述了HCS08系列中GB60的在线编程方法。本章首先概述了Flash存储器的基本特点,并介绍其编程模式,随后给出M68HC908GP32的Flash存储器编程的基本操作及汇编语言和C语言的在...

第13章_Flash存储器
第13章_Flash存储器 第13章 Flash存储器 第13章 Flash存储器 Flash存储器具有电可擦除、无需后备电源来保护数据、可在线编程、存储密度高、低功耗、成本较低等特点,这使得Flash存储器在嵌入式系统中的使用迅速增长。 本章主要以HC08系列中的GP32为例阐述Flash存储器的在线编程方法,也简要阐述了HCS08系列中GB60的在线编程方法。本章首先概述了Flash存储器的基本特点,并介绍其编程模式,随后给出M68HC908GP32的Flash存储器编程的基本操作及汇编语言和C语言的在线编程实例。最后讨论MC9S08GB60的Flash存储器编程方法。 Flash存储器编程方法有写入器模式与在线模式两种,本章讨论的是在线模式。有的芯片内部ROM中,包含了Flash擦除与写入子程序,在本章的进一步讨论中给出了调用方法,使Flash编程相对方便。有的芯片内部ROM中没有固化Flash擦除与写入子程序,只能自己编写Flash擦除与写入子程序。而编写Flash擦除与写入子程序需要较严格的规范,所以这是比较细致的工作,读者应仔细 分析 定性数据统计分析pdf销售业绩分析模板建筑结构震害分析销售进度分析表京东商城竞争战略分析 本章的例程,并参照例程编程。掌握了GP32芯片的Flash编程方法后,可以把此方法应用于整个系列的Flash编程。Flash在线编程对初学者有一定难度,希望通过实例分析学习。本章给出Flash在线编程的C语言实例,对于训练C语言与汇编联合编程技巧很有帮助。 13.1 Flash存储器概述与编程模式 理想的存储器应该具备存取速度快、不易失、存储密度高(单位体积存储容量大)、价格低等特点,但一般的存储器只具有这些特点中的一个或几个。近几年Flash存储器(有的译为:闪速存储器或快擦型存储器)技术趋于成熟,它结合了OTP存储器的成本优势和EEPROM的可再编程性能,是目前比较理想的存储器。Flash存储器具有电可擦除、无需后备电源来保护数据、可在线编程、存储密度高、低功耗、成本较低等特点。这些特点使得Flash存储器在嵌入式系统中获得广泛使用。从软件角度来看,Flash和EEPROM技术十分相似,主要的差别是Flash存储器一次只能擦除一个扇区,而不是EEPROM存储器的1个字节1个字节地擦除,典型的扇区大小是128B~16KB。尽管如此,因为Flash存储器的总体性价比,它还是比EEPROM更加流行,并且迅速取代了很多ROM器件。 嵌入式系统中使用Flash存储器有两种形式:一种是嵌入式处理器上集成了Flash,另一种是片外扩展Flash。 目前,许多MCU内部都集成了Flash存储器。Freescale公司在Flash存储器技术相当成熟的时候,在HC08系列单片机内集成了Flash存储器。该系列内部的Flash存储器不但可用编程器对其编程,而且可以由内部程序在线写入(编程),给嵌入式系统设计与编程提供了方便。存储器是MCU的重要组成部分,存储器技术的发展对MCU的发展起到了极大的推动作用。对于Freescale公司新推出的HCS08系列MCU采用第三代0.25微米的闪存技术, 1 第13章 Flash存储器 其擦写速度更快,性能更稳定。 本节首先简要概述Flash存储器普遍具有的基本特点、Flash存储器的两种编程模式,然后介绍Freescale的HC08系列单片机内的Flash存储器的主要特点,最后对M68HC908GP32单片机的Flash存储器在两种编程模式下的基本情况作简要介绍。 13.1.1 Flash存储器的基本特点与编程模式 (1) Flash存储器的基本特点 Flash存储器是一种高密度、真正不挥发的高性能读写存储器,兼有功耗低、可靠性高等优点。与传统的固态存储器相比,Flash存储器的主要特点如下。 ?固有不挥发性:这一特点与磁存储器相似,Flash存储器不需要后备电源来保持数据。所以,它具有磁存储器无需电能保持数据的优点。 ?易更新性:Flash存储器具有电可擦除特点。相对于EPROM(电可编程只读存储器)的紫外线擦除工艺,Flash存储器的电擦除功能为开发者节省了时间,也为最终用户更新存储器 内容 财务内部控制制度的内容财务内部控制制度的内容人员招聘与配置的内容项目成本控制的内容消防安全演练内容 提供了可能。 ?成本低、密度高、可靠性好:与EEPROM(电可擦除可编程的只读存储器)相比较,Flash存储器的成本更低、密度更高、可靠性更好。 (2) Flash存储器的两种编程模式 从Flash存储器的基本特点可以看出,在单片机中,可以利用Flash存储器固化程序,一般情况下通过编程器来完成,Flash存储器工作于这种情况,叫监控模式(Monitor Mode)或写入器模式,这与一般的EPROM、OTP、EEPROM装入程序的含义相似。另一方面,由于Flash存储器具有电可擦除功能,因此,在程序运行过程中,有可能对Flash存储区的数据或程序进行更新,Flash存储器工作于这种情况,叫用户模式(User Mode)或在线编程模式。但是,并不是所有类型的单片机内Flash存储器都具有在线编程功能,目前,有的公司出品的单片机,还不能够支持Flash存储器在线编程模式。Freescale的HC908系列单片机的片内Flash支持这两种编程模式。一般来说,两种模式对Flash存储器的编程操作的程序是一致的,差别在于调用这些程序的方式和环境。 13.1.2 HC08系列单片机Flash存储器的特点与编程模式 (1) MC908系列单片机Flash存储器的特点 早期的片内Flash技术与ROM或EPROM相比较,其可靠性和稳定性存在一些不足。Freescale公司在Flash存储器技术相当成熟的时候才推出片内带有Flash存储器的8位单片机,在应用方便性和可靠性等方面有自己的特点,主要有: 第一,编程速度快及可靠性高。Freescale HC08系列单片机的片内Flash的整体擦除时间可以控制在5ms以内,对单字节的编程时间也在40ns以内。片内Flash的存储数据可以保持10年以上,可擦写次数也在1万次以上。 2 第13章 Flash存储器 第二,单一电源电压供电。一般的Flash存储器,在正常的只读情况下,只需要用户为其提供普通的工作电压即可,而要对其写入(编程),则需要同时提供高于正常工作电压的编程电压。但是,Freescale HC08系列单片机通过在片内集成电荷泵,可由单一工作电压在片内产生出编程电压。这样,可实现单一电源供电的在线编程,不需要为Flash的编程而在目标板上增加多余的硬件模块。正因为Flash的读写电压要求不同,一些公司的内置Flash存储器便放弃了在线擦除写入功能,而仅有通过编程器的写入功能。 第三,支持在线编程。Freescale HC08系列单片机的片内Flash支持在线编程(In-Circuit Program),允许单片机内部运行的程序去改写Flash存储内容,这样可以代替外部电可擦除存储芯片,减少外围部件,增加了嵌入式系统开发的方便性。 基于以上这些特点,掌握Freescale HC08系列单片机的Flash存储器的编程技术,充分利用Freescale HC08系列单片机Flash存储器的功能,对基于Freescale HC08系列单片机的嵌入式系统的开发是十分必要的。但是,与一般程序相比,Flash存储器的编程技术相对比较复杂,有一些特殊之处,本章将在实际应用基础上,总结Freescale的 MC908GP32单片机的Flash编程方法,给出编程实例。 (2) MC908系列单片机Flash存储器的编程模式 MC908系列单片机中绝大多数型号在其内部带有监控ROM(Monitor ROM),其地址和大小取决于芯片型号。Flash存储器工作于监控模式的条件是: ?复位向量($FFFE,$FFFF)内容为“空”($FFFF)。 ?单片机复位时在IRQ引脚上加上高电压(1.4,2Vdd),并给某些I/O脚置适当值(与芯片型号有关,设计时,参考芯片手册)。 只要满足上面条件之一,就可以使单片机在复位后进入监控工作方式。前者适用于单片机芯片已经安装在用户PCB板上,可以实现在线编程(ICP)。初始时,芯片为“空”,用户以这种方式装入程序后,以后的复位将执行用户装入的程序,不再进入监控模式。后者一般用于通过编程器进行程序装入。 在监控方式下,单片机内部的监控ROM程序开始工作,首先进行初始化,随后进入串行输入命令状态。监控ROM通过一根I/O口线与主机进行串行通信,该I/O口线的指定与芯片型号有关,例如,对MC908GP32,它为PTA0;对MC68HC908JL3,它为PTB0,该I/O口线在使用时需外接上拉电阻。主机程序可以利用监控ROM提供的少数几条指令对单片机内部地址进行读取、写入等基本操作,包括 下载 课程表模板下载资产负债表下载英语单词下载学习机资料下载励志文章下载 程序到RAM中并执行。在此基础上,主机可以通过主机程序或是下载到RAM中的程序完成对Flash存储器编程所需的一系列操作。 M68HC908系列单片机的Flash存储器工作于用户模式不需要特别的条件,在单片机正常工作的过程中,程序可以随时转入对Flash存储器进行编 3 第13章 Flash存储器 程操作。这种情况下对Flash存储器的擦除与写入不需要用户提供其它外部硬件条件。 两种模式各有优缺点:监控模式需要外部硬件支持,但不需要单片机内部程序的存在,所以适合对新出厂芯片进行编程写入,或是对芯片进行整体擦除与写入;用户模式可以在单片机正常工作时进入,所以常用在程序运行过程中对部分Flash存储器的一些单元内容进行修改,特别适合于目标系统的动态程序更新和运行数据的存储。目前监控模式常被仿真器和编程器采用,而在实际的工程应用中,开发者往往只需要考虑和实现用户模式下的Flash存储器在线编程。本章只讨论用户模式下的Flash存储器的编程方法,给出具体的实例。要进行编程器研制或仿真器研制的技术人员需掌握有关监控模式的Flash存储器的编程方法,请参考Freescale的有关手册或其它文献。 13.2 MC908GP32单片机Flash存储器编程方法 Flash存储器一般作为程序存储器使用,不能在运行时随时擦除、写入。当然,由于物理结构方面的原因,对Flash存储器的写操作,更不能像对待一般RAM那样方便。在许多嵌入式产品开发中,需要使用掉电仍能保存数据的存储器来保存一些参数或重要数据,目前一般使用EEPROM来实现。HC08的Flash存储器提供了用户模式下的在线编程功能,可以使用Flash存储器的一些区域来实现EEPROM的功能,这样简化了电路设计,节约了成本。但是,Flash存储器的在线编程不同于一般的RAM读写,需要专门的过程,本节介绍HC08的Flash存储器的基本操作方法。 13.2.1 Flash存储器编程的基本概念 虽然Flash存储器是一种快速的电可擦除、电可编程(写入)的只读存储器,但是基于其物理结构原因,对Flash存储器的擦除及写入一般需要高于电源的电压,Freescale HC08系列单片机的片内Flash存储器内含有“升压电路”,使其能够在单一电源供电情况下进行擦除与写入。对Flash编程的基本操作有两种:擦除(Erase)和写入(Program)。擦除操作的含义是将存储单元的内容由二进制的0变成1,而写入操作的含义,是将存储单元的内容由二进制的1变成0。擦除及写入操作都是通过设置或清除Flash存储器的控制寄存器(FLCR)中的某个或某些位来完成的。 Flash存储器在片内是以页(Page)和行(Row)为单位组织的。页和行的大小(字节数)随整个Flash存储器的大小变化而变化,但页的大小始终为行的两倍。例如MC908GP32内含32K的Flash存储器(地址为$8000,$FDFF),每页的大小为128字节,每行的大小为64字节;而MC68HC908JL3片内Flash存储器仅有4K,每页和每行的大小也分别变为64字节和32字节。 对于GP32单片机来说,对Flash存储器的擦除操作可以进行整体擦除也可以仅擦除某一起始地址开始的一页(128字节)。也就是说,不能仅擦除某一字节或一次擦除小于128字节。注意这一特点,在数据安排时尤为重要。 4 第13章 Flash存储器 GP32单片机的写入操作以行(64字节)为基础,一次连续写入数据个数只能在一行之内。当然,不经过擦除的区域,不能进行写入,这一点需特别注意。 从这里可以看出,对Flash存储器的写入,必须将一组数据准备好后,放入RAM区,然后擦除Flash存储器的相应区域并进行写入。我们要考虑到对Flash存储器的某一字节擦除与写入会影响其后的一页,所以,在进行擦除与写入操作之前,把与擦除区域相关的数据安排好十分必要。 13.2.2 Flash存储器的编程寄存器 在MC908GP32单片机中,与Flash编程有关的寄存器有2个,它们是Flash控制寄存器(FLCR)和Flash块保护寄存器(FLBPR)。对应的地址分别为$FE08和$FF7E,下面分别阐述这些寄存器的功能及用法。 (1) Flash控制寄存器(FLash Control Register — FLCR) FLCR的地址:$FE08,定义为: 数据DDDDDDDD位 7 6 5 4 3 2 1 0 定义 未未未未HMEP 复位 0 0 0 0 0 0 0 0 定义 定义 定义 定义 VEN ASS RASE GM D7,D4位:未定义。 D3 — HVEN位:高压允许位(High-Voltage Enable Bit)。 HVEN=1,打开电荷泵并将高电平加到Flash阵列上;HVEN=0,撤除Flash阵列上的高电平并关闭电荷泵。当PGM=1或ERASE=1时,可以通过设置HVEN将来自片内电荷泵的高压加到Flash阵列上。 D2 — MASS位:整体擦除控制位(Mass Erase Control Bit)。该位在ERASE=1时有效,用于选择Flash擦除操作方式:整体擦除或页擦除。MASS=1,选择整体擦除方式;MASS=0,选择页擦除方式。 D1 — ERASE位:擦除控制位(Erase Control Bit)。该位用于设置Flash编程操作为擦除操作。ERASE位与PGM位之间存在互锁关系,无法同时被设置为1。ERASE=1,选择擦除操作;ERASE=0,不选择擦除操作。 D0 — PGM位:编程(写入)控制位(Program Control Bit)。该位用于设置Flash编程操作为编程(写入)操作,且无法与ERASE位同时为1。PGM=1,选择写入操作;PGM=0,不选择写入操作。 (2) Flash块保护寄存器(FLash Block Protect Register — FLBPR) FLBPR的地址:$FF7E,它的内容为Flash保护区域的起始地址的14,7位,保护区域的起始地址的最高位始终为1,而保护区域的起始地址的低7位(位6,0)始终为0。对FLBPR写入,可以设定被保护的Flash区域,它本身也是一个Flash字节。当Flash处于保护状态时,擦除和写入操作都是受限制的,HVEN将无法被正常置起。Flash块保护寄存器设定的只是保护区域的起始地址,保护区域的结束地址始终为Flash存储区的结束地址($FFFF)。例如,设定FLBPR的值为$02(%0000 0010),则保护区域为$8100,$FFFF(%1000 0001 0000 0000 , %1111 1111 1111 1111)。 5 第13章 Flash存储器 特别情况是:FLBPR的存储内容为$00,整个Flash存储区都受到保护;如果FLBPR的存储内容为$FF,则整个Flash存储区都可以被擦除或写入。 只有当单片机处于运行用户程序时,对FLBPR本身和Flash保护区域的擦写操作保护才是有效的。复位不影响FLBPR。 需要注意的是,FLBPR的8位数据所代 关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf 的地址取决于具体型号的芯片的Flash容量。以上是对MC908GP32而言的,FLBPR设定的是16位起始地址的第14,7位(第15位恒为1);而对MC68HC908JL3而言,它们设定的是16位起始地址的第12,5位(第15,13位恒为1)。这两种情况见表13-1。具体设定时可以根据相应芯片手册结合要保护的区域进行计算得到。 表13-1 GP32与JL3芯片 Flash块保护寄存器设置比较 GP32 JL3 FLBPR内受保护的FLBPR内受保护的 容 Flash区域 容 Flash区域 $00(%000$8000 , $00 , $EC00 , $01(%000$8080 , $62(%011$EC40 , 0 0000) $FFFF $60 $FFFF $02(%000$8100 , $64(%011$EC80 , 0 0001) $FFFF 0 0010) $FFFF „„ „„ $68(%011$ED00 , 0 0010) $FFFF 0 0100) $FFFF $FE(%111$FF00 , „„ „„ 0 1000) $FFFF $FF(%111Flash区$FE(%111$FFC0 , 1 1110) $FFFF 13.2.3 Flash存储器的编程过程 1 1111) 不被保护 1 1110) $FFFF 在HC08系列单片机中,对Flash进行擦除或写入操作需要遵循一定的时序和步骤。对于整个MC68HC908系列的各个型号,这些步骤是一样的,但时序要求可能略有不同,针对具体型号的Flash进行编程时应参考相应的芯 ash编程子程序,片手册。同时需要注意的是,一些型号的监控ROM内含有Fl用户可直接调用,例如MC68HC908JL3;有的型号则没有,例如MC908GP32,这种情况需自行编制子程序。下面介绍MC908GP32的Flash编程的基本操作。 (1) 页擦除操作 下面过程可以擦除GP32的Flash存储器的一页(128字节): ?$2?FLCR(1?ERASE位,0?MASS位):进行页面擦除。 ?读Flash块保护寄存器FLBPR。 ?向被擦除的Flash页内任意一个地址写入任意值,为方便起见,一般向待擦除页首地址写入0。 ?延时tnvs(>10µs)。 ?$A?FLCR(1?HVEN位)。 ?延时terase(>1ms)。 ?$8?FLCR(0?ERASE位)。 ?延时tnvh(>5µs)。 ?$0?FLCR(0?HVEN位)。 6 第13章 Flash存储器 ?延时trcv(>1µs),完成一页的擦除操作。 (2) 整体擦除操作 下面过程擦除GP32的整个Flash区域,以便把新的程序装入Flash存储器,这是应用系统研制过程中开发工具对GP32编程的准备工作。 FLCR(1?ERASE位,1?MASS位):进行整体擦除。 ?$6? ?读Flash块保护寄存器FLBPR。 ?向被擦除的Flash任意一个地址写入任意值,为方便起见,一般向首地址写入0。 ?延时tnvs(>10µs)。 ?$E?FLCR(1?HVEN位、MASS位、ERASE位)。 ?延时tMerase(>4ms)。 ?$C?FLCR(0?ERASE位)。 ?延时tnvhl(>100µs)。 ?$0?FLCR(0?HVEN位、MASS位)。 ?延时trcv(>1µs),完成整体擦除操作。 (3) 编程操作 MC908GP32的Flash编程操作以行(64字节)为单位进行的。当然,一次写入可以小于一行,但不能大于一行。对于已经写过的部分,未经擦除不能重新写入变更其数据,否则将引起数据出错。写入过程如下: ?$1?FLCR(1?PGM位)。 ?读Flash块保护寄存器FLBPR。 ?向将要写入的Flash行内任意一个地址写入任意值,为方便起见,一般向行首地址写入0,这一步选定了所要编程的行,以下的目标地址必须在这一行中。 ?先延时tnvs(>10µs);再将$9?FLCR(1?HVEN位)。 ?先延时tpgs(>5µs);再将待写数据写入对应的Flash地址。 ?延时tprog(>30µs),完成一个字节的写入(编程)工作。 ?重复?、?,直至同一行内各字节写入完毕。 ?$8?FLCR(0?PGM位)。 ?先延时tnvh(>5µs);再将$0?FLCR(0?HVEN位)。 ?延时trcv(>1µs)以后,完成本行写入工作,可以读出校验。 表13-2对上述过程出现的参数进行说明,这是MC908GP32的Flash编程的各项参数,其他型号的单片机的参数数值请参阅相应的芯片手册。 表13-2 MC908GP32的Flash编程参数 符最最单参数 号 小值 大值 位 Flash行大小 — 64 64 字 7 第13章 Flash存储器 节 字Flash页大小 — 128 128 节 tr8.4Flash读写周期 32K Hz ead M teFlash页擦除时间 1 — ms rase TMFlash整体擦除时间 4 — ms erase Flash从设置PGM或tn10 — µs ERASE位到HVEN建立时间 vs Flash高电平维持时tn5 — µs 间(页擦除时) vh Flash高电平维持时tn100 — µs 间(整体擦除时) vhl Flash写入编程维持tp5 — µs 时间 gs tpFlash写入编程时间 30 40 µs rog Flash返回只读状态tr1 — µs 时间 cv Flash累积高电平时th— 25 ms 间 v 次Flash行擦除次数 — 10K — 数 次Flash行写入次数 — 10K — 数 Flash数据保持时间 — 10 — 年 注:?terase和tMerase的最小时间也是擦除操作的最佳时间, 如果擦除时间长于该最小值,Flash的寿命会受到影响。 ?thv指的是在下一次擦除操作执行以前,该Flash行在写入编 程操作中被加上高电平的累积时间。 13.3 GP32单片机Flash在线编程汇编语言实例 本节首先给出GP32单片机的Flash编程子程序,随后给出在用户模式 下进行Flash在线编程的实例,并通过与PC机串行通信方式进行验证,PC 方采用VB语言编程。 13.3.1 Flash存储器的擦除及写入汇编子程序 8 第13章 Flash存储器 由于GP32单片机内部的监控ROM中没有固化Flash编程子程序,要在运行中能对Flash进行在线编程,初始装入的用户程序,必须包含对Flash的擦除及写入子程序。由于程序驻留Flash区,在运行擦除及写入子程序时,整个Flash区会被加上高于普通工作电压的编程电压,致使对Flash区读取不稳定,可能导致程序不能正常执行。为了使擦除、写入程序正常执行,需将擦除、写入子程序移入RAM中并转入RAM区执行。为此,需在RAM区开辟一个缓冲区,供程序移入使用。表13-3给出了Flash在线编程的汇编工程的文件组织情况。 表13-3 Flash汇编工程文件 工程文Flash.prj 所在路MC08Ex2007\GP32\GP32S\S14_Flash 件名 文件类文件名 功能简述 讲解章节 径 GP32AS芯片头文件 [汇编工程型 头文件 Includ总头文件 [汇编工程M.h 文件组织]4.3 SCI.h 串行通信头文件 [串行通信es.h 文件组织]4.3 MCUIni[初始化及芯片初始化文件 子函数]7.4 汇编语t.s PLL编程实例] Flash.Flash擦写文件 [本章] 言 14.2.5 SCI.s 串行通信文件 [串行通信s 子程序子函数]7.4.1 Vector中断处理子程序[汇编工程文件 s08.s 与中断向量表文件 文件组织]8.2 汇编语 Main.s 主程序文件 [本章] 言 主程序(1) 擦除、写入子程序(Flash.s) 文件 //ErasePage:擦除Flash存储区的一页 -----------------------* //功能:擦除Flash区中以HX为首地址的一页 * //入口:HX = 要擦除的Flash页首地址(供DoErasePage使用) * //出口:无 * //堆栈深度:11 * //内部调用:DoErasePage * //全局变量:PrgInRAM 9 第13章 Flash存储器 * //说 明:本程序的实际工作程序,在执行前被移入RAM区,移 * // 到RAM区的起始地址为PrgInRAM * //--------------------------------------------------- ---* ErasePage:: PSHA //保护A PSHH //保护HX PSHX AIS #-1 //开辟临时变量 //1. 将擦除程序从FLASH移到RAM中 //1.1计算需要移入RAM区PrgInRAM的程序字节数 LDA #0 //[SP+1]存放移入RAM区的程序字节数,初始为0 STA 1,SP LDHX #DoErasePage //擦除程序首地址->HX ErasePage_1: INC 1,SP AIX #0x1 CPHX #EraseEnd //判断是否到了擦除程序的末地址 BLO ErasePage_1 //否,继续 //1.2计算完程序长度,将程序移入RAM区PrgInRAM开始的地址中 LDHX #0x0000 MoveToRAM: LDA DoErasePage,X //(Erase1Page + HX) -> A STA PrgInRAM,X //A -> (PrgInRAM + HX) INCX DBNZ 1,SP,MoveToRAM //程序是否移入完毕?否,继续 //程序移入完毕 AIS #1 //释放临时变量 PULX //恢复HX(HX中存放要擦除的Flash初始地址) PULH 10 第13章 Flash存储器 //2. 执行RAM中的擦除程序PrgInRAM JSR PrgInRAM PULA //恢复A RTS //DoErasePage:flash页擦除执行程序 -----------------------* //功能:设置flash控制寄存器和块保护寄存器,按照flash的擦时* // 序,擦除指定页 * //入口:HX(要擦除的Flash页首地址) * //出口:无 * //堆栈深度:5 * //内部调用:Delay_usA(延时一定时间) * //--------------------------------------------------- ---* DoErasePage:: PSHA //保护A LDA #%00000010 //(1) 置FLCR的ERASE=1,MASS=0 STA FLCR LDA FLBPR //(2) 读出块保护寄存器(FLBPR) LDA #$68 //(3) 任意值->被擦除Flash首地址 STA ,X LDA #6 //(4) 延时 > 10us BSR Delay_usA LDA #%00001010 //(5) 置HVEN位为1 STA FLCR // (打开电荷泵高电压到Flash阵列) LDA #248 //(6) 延时 > 1ms(每次500us,共2次) BSR Delay_usA LDA #248 11 第13章 Flash存储器 BSR Delay_usA LDA #%00001000 //(7) 清Erase位为0 STA FLCR LDA #3 //(8) 延时 > 5us BSR Delay_usA CLRA //(9) 清HVEN位为0 STA FLCR LDA #3 //(10) 延时 > 1us BSR Delay_usA PULA //恢复A RTS //Delay_usA:延时一定时间 --------------------------------* //功能:延时一定时间,供flash页擦除执行程序调用,和其一 并移* // 入内存 * //入口:A(0-255) * //出口:无 * //堆栈深度:2 * //--------------------------------------------------- ---* Delay_usA:: NOP //1个时钟周期 NOP //1个时钟周期 DBNZA Delay_usA //3个时钟周期 RTS //4个时钟周期 //--------------------------------------------------- ---* EraseEnd: //擦除程序的末地址 NOP //WriteFlash:向flash写入小于1行(64字节)的数据 12 第13章 Flash存储器 -----------* //功能:移动写flash执行程序和相关延时程序到内存中,并 调用 * // 写flash执行程序 * //入口:(1) A = 待写入的数据个数N * // (2) RAMandFalsh[0-3] * // [0-1] = RAM区首地址 [2-3]=Flash区首地址 * //出口:无 * //堆栈深度:13 * //内部调用:DoWriteFlash * //全局变量:RAMandFalsh[0-3],PrgInRAM * //说 明:本程序的实际工作程序,在执行前被移入RAM区, 移 * // 到RAM区的起始地址为PrgInRAM * //------------------------------------------------------* WriteFlash:: PSHH //保护HX PSHX AIS #-2 //开辟2个临时变量 STA 2,SP //[SP+2]存放要写入的数据个数N //1. 将程序从Flash中移到RAM中以PrgInRAM为始址的 区域 //1.1计算需要移入RAM区PrgInRAM的程序字节数 LDA #0 //[SP+1]存放移入RAM区的程序字节数,初 始为0 STA 1,SP LDHX #DoWriteFlash //写入程序首地址 -> HX 13 第13章 Flash存储器 WriteFlash_1: INC 1,SP AIX #$1 CPHX #WriteEnd //是否到了写入程序的末地址 BLO WriteFlash_1 //否,继续 //1.2算完程序长度,将其移入RAM区以PrgInRAM为始址的区域 LDHX #0x0000 WriteFlash_2: LDA DoWriteFlash,X //(DoWriteFlash + HX) -> A STA PrgInRAM,X //A -> (PrgInRAM + HX) INCX DBNZ 1,SP,WriteFlash_2 //程序是否移入完毕?否,继续 //程序移入完毕 LDA 2,SP //要写入的数据个数N -> A AIS #2 //释放临时变量 //2. 转入内存,执行写入执行程序 JSR PrgInRAM PULX //恢复HX PULH RTS //DoWriteFlash:Flash写入执行程序 ------------------------* //功能:设置Flash控制寄存器和块保护寄存器,按照Flash的写时* // 序,在指定地址写入数据 * //入口: * // (1)A:要写入的数据个数 * // (2)RAMandFalsh[0-3] * // [0-1] = RAM区首地址 [2-3]=Flash区首地址 * //出口:无 14 第13章 Flash存储器 * //堆栈深度:7 * //内部调用:Delay_usB(延时一定时间) * //全局变量:RAMandFalsh * //------------------------------------------------------* DoWriteFlash:: PSHH //保护HX PSHX AIS #-1 //开辟临时变量 STA 1,SP //[SP + 1]存放写入个数N LDA #%00000001 //(1) 置FLCR的PGM位为1 STA FLCR LDA FLBPR //(2) 读出Flash块保护寄存器 LDHX RAMandFlash+2 //(3) 任意数据 -> 所选块任意单元 STA ,X // 选中要写入的行 LDA #6 //(4) 延时 > 10us BSR Delay_usB LDA #%00001001 //(5) 置FLCR的HVEN位为1 STA FLCR LDA #3 //(6) 延时 > 5us BSR Delay_usB //向页内目标地址写入N个数据 DoWriteFlash_1: //(7) 逐个取RAM中一个数,并存放到目标Flash区 LDHX RAMandFlash //取RAM区(源)地址 LDA ,X //取RAM中一个数 AIX #1 //源地址 + 1 STHX RAMandFlash LDHX RAMandFlash + 2 //取Flash区(目的)地址 STA ,X //将RAM中的数存入相应Flash区 AIX #1 //目的地址 + 1 15 第13章 Flash存储器 STHX RAMandFlash+2 //(8) 延时 > 30us LDA #9 BSR Delay_usB //重复写入N个数据 DBNZ 1,SP,DoWriteFlash_1 //写入结束?否,继续 LDA #$8 //(9) 0 -> PGM STA FLCR LDA #3 //(10) 延时 > 5us BSR Delay_usB LDA #$00 //(11) 0 -> HVEN STA FLCR LDA #1 //(12) 延时 > 1us BSR Delay_usB AIS #1 //释放1一个字节临时变量 PULX //恢复HX PULH RTS //Delay_usB:延时一定时间 --------------------------------* //功能:延时一定时间,供Flash写入执行程序调用,和其一并移入* // 内存 * //入口:A(0-255) * //出口:无 * //堆栈深度:2 * //--------------------------------------------------- ---* Delay_usB:: NOP //1个周期 NOP //1个周期 DBNZA Delay_usB //3个周期 16 第13章 Flash存储器 RTS //4个周期 //--------------------------------------------------- ---- WriteEnd: //写入程序的结束地址 NOP (2) 擦除与写入子程序编程要点说明 使用Flash在线编程技术可以省去外接EEPROM,不仅简化了电路设计,也提高了系统稳定性。但是Flash在线编程的技术文献资料比较少,特别是实用程序目前还较少见到,涉及Flash在线编程的技术细节应仔细斟酌。由于擦除与写入子程序是复制到RAM中执行,我们给出的两个子程序已经包含了复制并转入RAM执行的程序过程,正是由于这个特殊的过程,根据实际编 程调试与项目开发过程中积累的经验,提出以下注意点,供读者参考: ?RAM中要留有足够的缓冲区,以便存放复制到RAM中的子程序,具体值是取擦除与写入子程序中的大者即可。它们的大小可在编译后的.LST文件中查得。 ?擦除及写入子程序中要调用的延时子程序均随其后,以便同时复制到RAM中,最后一个标号是为复制方便而加入,否则复制时要用其它方法得到结束地址,编程变得不规范。 ?擦除及写入子程序中对延时子程序的调用必须使用“BSR 子程序名”,而不能使用 “JSR 子程序名”,因为这里的子程序是复制到RAM中执行的,程序地址已经发生了变化,所以只能用相对调用。 ?擦除子程序与写入子程序及其中的延时子程序,若含有跳转语句,不能使用“JMP 地址”,只能使用“BRA 地址”。原因同上。 ?使用不同型号芯片时,上述子程序中延时时间应根据芯片手册予以变动。延时子程序也应根据不同的总线频率加以变化,确保时间满足时序要求。 ?一次擦除后未被写入过的区域可以再次调用写入子程序写入,但写入过的区域,未经擦除不能重写。 ?由于擦除是每次擦除一页(128字节),所以数据应合理安排,避免误擦。 ?页首地址的定义须遵照保护寄存器FLBPR定义的规则,即对GP32来说,页地址的低7位为0。 ?在线编程时使用的Flash存储区域应在程序Flash存储区域之前,因为Flash保护区为FLBPR决定的地址至末尾。 13.3.2 Flash存储器在线编程汇编主程序及PC方程序 为了更清晰地了解Flash存储器在线编程总体轮廓,本节给出调用实例的编程框架。调用实例由单片机方程序与PC机方程序构成。单片机系统的硬件带有MAX232串行三线接口,与PC机的串行口相连,A口的PTA7过电阻 17 第13章 Flash存储器 接通信指示灯。总体思想是:通过PC机界面输入数据,将数据发向单片机,单片机接收数据写入Flash区域,同时读出返回给PC机,PC机接收该数据进行分解并显示,供比较校验,以可视化方式完成Flash擦除、写入、校验工作。 (1) 单片机方程序流程图 单片机方程序的主要功能是: ?不断地向PC机发出握手信号,并监测PC机返回的握手信号。可以看到串行通信指示灯闪烁,表明MCU在向PC机发送握手信号。 ?若收到握手信号,表明PC机可以发送数据,设要写入数据的个数为N,则单片机首先将接收数据个数N放入内存(接收的数据在一行之内,N小于等于64),随后接收N个数据,放入内存缓冲区。 ?擦除指定Flash区域,将收到的N个数据写入Flash区。 ?读出该Flash区的数据,并发送到PC机。 其流程见图13-1。1 18 第13章 Flash存储器 主循环开始 进行通信握手,发握手信号 HX赋初值$00 N N N N 串行口有 HX+1 数据吗? =设定数? Y Y Y Y 接收一个数据?A N N A中是约定的握手信号吗? Y Y 接收N(<=64)?内存 接收N个数据放入内存缓冲区 擦除子程序ErasePage的入口赋值,调用 ErasePage,擦除Flash区$8000开始的一页 写入子程序WriteFlash的入口赋值,调用 WriteFlash, 将N个数据写入$8000开始的 Flash区 从地址$8000开始的Flash区读取N个数据, 同时从串行口发送出去 图13-1 Flash在线编程例程单片机方程序流程图 (2) 单片机方主程序main.s //--------------------------------------------------- ---* //工 程 名:Flash.prj * //功 能: * // (1) 等待接收N+1个数,并放入N和data数组中 * // (2) 擦除以Fdata为首地址的Flash一页,将N个数据写入 * // (3) 从以Fdata为首址的Flash区读取N个数据,串口 19 第13章 Flash存储器 发送 * //说 明: * // (1) 与Visual Basic 6.0 程序Flash_Test.vbp联合运行 * // (2) 擦/写函数中用来暂存写入或擦除程序的首地址变量 * // PrgInRAM,用来暂存待写入或擦除的Flash首地址变量* // RAMandFlash,用来存放写入的数据个数N和写入的数 * // 据首址Data,必须在main函数文件中定义为全局的,否* // 则将出错 * // (3) 调用擦/写子程序之前先将待擦/写页后一页以后的所* // 有区域写保护 * //--------清华2007版《嵌入式技术基础与实践》实例--------* //总头文件 .include "Includes.h" //主程序 .area flash(abs) .org FlashStartAddr //设写入区为$8000,$807F一页(几个初始值仅作比较) Fdata: .byte 11,12,13,14,15,16,17,18,66 .area flash(abs) .org PrgStartAddr MainInit:: //复位后从此处执行(见Vectors08.s文件末尾处) SEI //关总中断 //1. 堆栈初始化为RAM最高端 LDHX #RAMendAddr + 1 //HX = #RAMEndAddr + 1 TXS //HX - 1 -> SP 20 第13章 Flash存储器 //2. 芯片初始化 JSR MCUinit //初学时跳过此处 //3. 模块初始化 JSR SCIinit //(1) 串行口初始化 //总循环 MainLoop: LDA #86 //发送握手信号86 JSR SCIsend1 JSR SCIre1 //等待接收握手信号56 CMP #56 BNE MainLoop //不是56继续握手 JSR SCIre1 //接收要写入的字符个数(<=64)存到N中 STA N LDA N //接收N个字节并存到以Data为首址的内 存中 LDHX #Data JSR SCIreN //保护擦除页后一页之后的区域($8100-$FFFF) LDA #%00000010 STA FLBPR //擦除以Fdata为首地址的Flash的1页(GP32:128字节) LDHX #Fdata JSR ErasePage //保护要写行所在页后一页之后的区域($8100-$FFFF) LDA #%00000010 STA FLBPR //将以Data开始的N个数写入以Fdata为首址的Flash 区 LDHX #Data //数据在RAM中的首地址 ->RAMandFlash[0-1] STHX RAMandFlash LDHX #Fdata //数据在Flash中的首地址 ->RAMandFlash[2-3] STHX RAMandFlash+2 LDA N //写入Flash的数据个数 JSR WriteFlash //向PC机发送写入Flash区的N个数据 21 第13章 Flash存储器 LDHX #Fdata LDA N JSR SCIsendN JMP MainLoop //转程序总循环入口 //包含本工程的其他文件 ----------------------------------- .include "MCUinit.s" //芯片初始化 .include "SCI.s" //串行通信 .include "Flash.s" //Flash擦/写 //包含中断处理子程序与中断向量表文件 "Vectors08.s"-------- //注意:这个包含语句的存放位置必须放在最后 .include "Vectors08.s" //中断处理子程序与中断向量 表 (3) PC机方界面及程序 PC机方程序采用Visual Basic6.0语言编写,其界面见图13-2。主要功能为:输入要写入Flash的数据个数(1,64),设为N,按“确定”按钮后在上框中输入N个具体数据,按下“写入并校验”后,PC机与单片机进行通信握手,握手成功后,将N及上框中的N个具体数据发送到单片机,单片机接收后,将N个数据写入$8000开始的Flash中,并读出数据发回PC机。PC机接收这些数据,进行分解后显示在下框中,供比较校验。若上、下两框中数据一致,说明写入成功。 程序中MSCommFlash是串行通信控件(Microsoft Comm Control 6.0控件,文件名为MSComm32.OCX)的引用名称,串行通信初始化在Form_Load()事件过程中完成,所使用的变量及数组均已先定义,TEXT3()为上、下框中的输入控件数组,有关说明见程序中的注释。 22 第13章 Flash存储器 图13-2 Flash编程实验VB程序界面 13.4 GP32单片机Flash在线编程08C语言实例 本节给出MCU方与汇编语言对应的Flash在线编程的08C工程文件组织,如表13-4所示,PC机方VB程序不变。具体程序参见实例程序“MC08Ex2007\GP32\GP32C\C14_Flash”下的08C工程。 表13-4 Flash08C工程文件 工程Flash.prj 所在MC08Ex2007\GP32\GP32C\C14_Flash 文件名 文件文件功能简述 讲解章节 路径 GP32GP32 MCU映像寄[08C工程文件组类型 名 C.h 存名定义头文件 织]5.3 EnDi开放或禁止MCU[08C工程文件组 sInt.h 各模块中断头文件 织]5.3 头文Type类型别名定义头[用typedef定义类件 .h 文件 型]5.2.10 Incl总头文件 [08C工程文件组[08C工程文件组 FlasFlash头文件 参见教学资料工程实udes.h 织]5.3 织]5.3 SCI.串行通信头文件 [串行通信子函h.h 例 MCUI[初始化及PLL编程实h 数]7.4.1 芯片初始化文件 C语言 nit.c 例] 14.2.5 子函SCI.串行通信文件 [串行通信子函数文件 FlasFlash擦写文件 参见教学资料工程实c 数]7.4.1 Vect中断处理函数与参见教学资料工程实h.c 例 C语言Main主函数文件 参见教学资料工程实ors08.c 中断向量表 例 *13.5 HCS08系列单片机Flash编程方法 主函数 .c 例 HCS08系列MCU的Flash编程方法和前面讲述的HC08系列有很大差异,本节以MC9S08GB60为例介绍HCS08系列中的Flash存储器的基本操作方法。 23 第13章 Flash存储器 13.5.1 Flash存储器的编程寄存器 在MC9S08GB60单片机中,与Flash编程有关的寄存器有6个,它们是Flash时钟分频寄存器(FCDIV)、Flash选项寄存器(FOPT和NVOPT)、Flash配置寄存器(FCNFG)、Flash保护寄存器(FPROT和NVPROT)、Flash状态寄存 $1821、器(FSTAT)和Flash命令寄存器(FCMD),对应的地址分别为$1820、$1823、$1824、$1825和$1826。下面分别阐述这些寄存器的功能及用法。 (1) Flash时钟分频寄存器(FLash Clock Divider Register — FCDIV) FCDIV的地址:$1820,定义为: 数DDDDDDDD6 据位 7 5 4 3 2 1 0 定DPRDDDDDD 复0 0 0 0 0 0 0 0 义 IVLD DIV8 IV5 IV4 IV3 IV2 IV1 IV0 D7 — DIVLD位:分频设置状态标志位(Divisor Loaded Status Flag),位 DIVLD DIVLD为只读位。DIVLD=1,表示在复位后FCDIV已经被改写过,可以对Flash进行擦写操作;DIVLD=0,表示在复位后FCDIV没有被改写过,不可以对Flash进行擦写操作。 D6 — PRDIV8位:Flash预分频设置位(Prescale Flash Clock by 8)。PRDIV8=1,表示Flash分频器的时钟输入是总线时钟频率的八分之一;PRDIV8=0,表示Flash分频器的时钟输入是总线时钟频率。 D5,D0位:DIV5,DIV0位,Flash时钟分频器的分频因子。Flash的内部工作时钟fFCLK的计算方法如下: 如果PRDIV8=0,fFCLK=fbus?([DIV5:DIV0]+1) 如果PRDIV8=1,fFCLK=fbus?(8×([DIV5:DIV0]+1)) 在对Flash进行编程操作时,Flash的内部工作时钟必须降到150KHZ~200KHZ,擦/写操作的脉冲是Flash的内部工作时钟的一个时钟周期,所以擦/写的时间相应地在6.7µs~5µs。表13-5列出了对FCDIV寄存器设置不同的数值时对Flash擦写操作的影响。 表13-5 Flash时钟分频器的参数设置 fBuPRDDIV5擦写的时fFCLK s IV8 :DIV0 钟脉冲 20M1 12 192.3K5.2µs 10M0 49 200KHz 5µs Hz Hz 8MH0 39 200KHz 5µs Hz 4MH0 19 200KHz 5µs z 2MH0 9 200KHz 5µs z 1MH0 4 200KHz 5µs z 2000 0 200KHz 5µs z 1500 0 150KHz 6.7µs KHz (2) Flash选项寄存器(FLash Options Register — FOPT和NVOPT) KHz 24 第13章 Flash存储器 MCU复位时,Flash中的非易失性的NVOPT值被赋给FOPT寄存器,FOPT可以读,但写操作是无效的。要改变FOPT寄存器的值,需要对Flash中NVOPT位擦除并重新写入新的数值。 FOPT的地址:$1821,定义为: 数DDDDDDD7 D6 据位 5 4 3 2 1 0 定KEYFN未未未未SS 复将NVOPT中的内容装载到该寄存器中 义 EN ORED 定义 定义 定义 定义 EC01 EC00 D7 — KEYEN位:后门锁机构允许位(Backdoor Key Mechanism Enable)。位 0 KEYEN=0,表示不能用后门锁机构来解除存储器的保密性;KEYEN=1,如果用0 户使用固件,写入8个字节的值,并且和后门钥匙NVBACKKEY~NVBACKKEY+70 相匹配,在MCU复位前,存储器的保密性会暂时解除。 0 D6 — FNORED位:矢量重定向禁止位(Vector Redirection Disable)。0 FNORED=1,矢量重定向禁止;FNORED=0,矢量重定向允许。 0 D5,D2位:未定义。 0 表13-6 安全状态 D1,D0位 — SEC01~SEC00位:安全状态码。 这两位决定了MCU的保密性,如果MCU是保密的,SEC01: 状RAM和Flash中的内容不能通过非法访问,背景调SEC00 态 试接口也不可访问。表13-6给出了MCU的安全状保0:0 态。 密 在一次成功的后门钥匙登录或一次成功的保0:1 Flash空白检测后,SEC01~SEC00位会改变为1:0。 密 (3) Flash配置寄存器(FLash Configure 不1:0 Register — FCNFG) 保密 FCNFG的地址:$1823,定义为: 保1:1 密 数据DDDDDDDD5 位 7 6 4 3 2 1 0 定义 未未KE未未未未未 复位 0 0 0 0 0 0 0 0 定义 定义 YACC 定义 定义 定义 定义 定义 D7,D6位、 D4,D0位:未定义。 D5 — KEYACC位:写访问钥匙允许位(Enable Writing of Access Key)。KEYACC =1,表示写NVBACKKEY($FFB0-$FFB7)被认为是进行密码比较;KEYACC=0,表示写NVBACKKEY($FFB0-$FFB7)被解释为Flash擦写命令的开始。 (4) Flash保护寄存器(FLash Protect Register — FPROT和NVPROT) FPROT的地址:$1824,定义为: 数据DDDDDDDD7 位 6 5 4 3 2 1 0 定义 FPFFFF未未未 复位 将NVPROT中的内容装载到该寄存器中 OPEN PDIS PS2 PS1 PS0 定义 定义 定义 0 25 0 0 0 0 第13章 Flash存储器 D7 — FPOPEN位:打开Flash中的非保护区域位(Open Unprotected Flash for Program/Ease),打开的这些区域可以进行擦写。FPOPEN=1,Flash中非保护区域可以进行擦写操作;FPOPEN=0,整个Flash区域都不可进行擦写操作。 D6 — FPDIS位:Flash保护设置位(Flash Protection Disable)。FPDIS=1,Flash不进行保护;FPDIS=0,Flash保护FPS2:FPS0所设置的区域。 D5,D3 — FPS2,FPS0位:Flash保护区域设置。FPDIS=0时,这3位决定了保护区域的大小。表13-7是Flash空间保护表。 表13-7 Flash空间保护表 FPS2:FPS受保护的保护区矢量表的重定1:FPS0 Flash区域 域大小 向 0:0:0 $FE00 , 512字$FDC0 , 0:0:1 $FC00 , 1K字节 $FBC0 , $FFFF 节 $FDFD 0:1:0 $FFFF$F8 00 , 2K字节 $FBFD$ F7C0 , 0:1:1 $F000 , 4K字节 $EFC0 , $FFFF $F7FD 1:0:0 $E000 , 8K字节 $DFC0 , $FFFF $EFFD 1:0:1 $C000 , 16K字$BFC0 , $FFFF $DFFD 1:1:0 $8000 , 32K字$7FC0 , $FFFF 节 $BFFD 1:1:1 $8000 , 32K字$7FC0 , $FFFF 节 $7FFD D2,D0位:未定义。 $FFFF 节 $7FFD (5) Flash状态寄存器(FLash Status Register — FSTAT) FSTAT的地址:$1825,定义为: 数DDDDDDDD2 据位 7 6 5 4 3 1 0 定FFFF未FBL未未 复1 1 0 0 0 0 0 0 义 CBEF CCF PVIO ACCER 定义 ANK 定义 定义 D7— FCBEF位:Flash命令缓冲区空标志位(Flash Command Buffer 位 Empty Flag)。FCBEF=1,表示命令缓冲区可以接收一个新的命令;FCBEF=0,表示命令缓冲区不空,不能接收新的命令。 D6 — FCCF位:Flash命令完成标志位(Flash Command Complete Flag)。FCCF=1,表示所有命令已经执行完毕;FCCF=0,表示有命令正在执行中。 D5 — FPVIO位:侵害保护标志位(Protection Violation Flag)。当FCBEF位被清除,一个擦写命令试图访问保护区域时,FPVIO位自动置1。FPVIO=1,表示试图对保护区域进行擦写操作;FPVIO=0,表示不进行侵害保护设置。 D4 — FACCER位:访问出错标志位(Access Error Flag)。当擦写操作序列没有正常完成时,该位自动置1。FACCER=1,表示一个访问错误已经发生。 26 第13章 Flash存储器 D2 — FBLANK位:Flash空白标志位(Flash Verified All Blank Flag)。如果Flash没有被写入任何数据,在执行一个空白检测命令后,该标志位置1。在执行一个空白检测命令后,FBLANK=1,表示Flash是空的,即所有的字节为$FF;FBLANK=0,表示Flash非空。 ,D0位:未定义。 D3,D1 (6) Flash命令寄存器(FLash Command Register — FCMD) FCMD的地址:$1826,定义为: 数据DDDDDDDD位 7 6 5 4 3 2 1 0 定义 FFFFFFFF 复位 0 0 0 0 0 0 0 0 CMD7 CMD6 CMD5 CMD4 CMD3 CMD2CMD1 CMD0 D7,D0位:对Flash进行访问的命令字表13-8 Flash访问命位 节。表13-8列出了对Flash访问的命令字节。 令表 命如果向Flash命令寄存器写入一个表命令 令字节 13-8以外的字节,将产生一个访问错误。 空白检测 $05 13.5.2 Flash存储器的编程过程 写一个字节 $20 (1) Flash命令的执行步骤 写一个字节$25 ?向Flash地址中写入一个数据。地址和页擦除 $40 (批量模式) 数据信息都会被锁定到Flash接口中。对于空整体擦除 $41 白检测和擦除命令,数据信息是一个任意值; 对于页擦除命令,地址信息是擦除页(512字节)地址中的任意一个地址;对于空白检测和整体擦除命令,地址信息是Flash中的任意一个地址。 ?向Flash命令寄存器FCMD中写入需要执行的命令。 ?执行命令。将Flash状态寄存器FSTAT的FCBEF位置1,同时开始执行命令寄存器中的命令。 (2) Flash命令的执行流程 和MC908GP32相同,在进行Flash擦写编程时,也需要遵循严格的时序流程。图13-3反应的是除批量模式写Flash外的其他命令的编程流程。批量模式写一字节命令和其他命令的执行过程有很大差别。批量模式意味着有很多连续数据需要写入Flash,每执行一次写入命令后,向Flash中加入的高电压并不撤销,这样就加快了数据写入速度;而对于其他的命令,在命令执行的时候,加高电压,命令执行结束的时候立即撤销高电压。图13-4是批量模式写Flash命令的编程流程。 (3) Flash命令出错的情况 在执行以下操作时,会导致出错,FACCER自动置1。 ?在向Flash地址写入信息前没有进行FCDIV寄存器设置。 ?在向Flash地址写入信息前FCBEF没有置1。 ?在执行命令前,执行两次向Flash地址写入信息操作。 ?在向Flash地址写入信息后,设置除FCMD外的其他Flash控制寄存 27 第13章 Flash存储器 器。 ?向FCMD中写入表13-8以外的命令字。 ?向FCMD中写入命令字后,试图读写除FSTAT外的寄存器。 ?在执行命令时,MCU进入STOP模式。 ?MCU处于保密状态时,使用背景调试接口进行页擦除或写Flash操作(MCU处于保密状态时,使用背景调试接口只能进行空白测试或整体擦除)。 ?向FCBEF位写0取消一个命令的执行。 开始 开始 0 FACCER? 0 FACCER? 1 1 清错误标志 清错误标志 [1][1] 设置FCDIV设置FCDIV 0 FCCF? 向FLASH地址中写1 入数据 向FLASH地址中写 入数据 向FCMD中写入命 令字 向FCMD中写入命 令字 FCBEF位置1,开 始执行命令 FCBEF位置1,开[2] 始执行命令 1 FPVIO 或 出错 FACCER? 退出 FPVIO 或 1 出错 0 FACCER? 退出 0 FCCF? 0 1 1 新的批量写 入指令吗, 结束 0 0 0 FCCF? 注:[1] 复位后仅需要写一次。 [2] 在进行FCBEF或FCCF判断前至少等待4 1 个总线周期 结束 图13-3 GB60 Flash编程例程图13-4 GB60 Flash批量写入流程 图 图 13.5.3 Flash存储器的安全性 由于HCS08系列MCU中加入了调试模块,这一方面增加了芯片的实用性,另一方面却给芯片的安全带来了隐患。为了确保芯片的安全性,其安全机制 28 第13章 Flash存储器 相对于HC08系列要复杂。 HCS08系列MCU使用硬件电路机制来防止非法用户试图访问Flash和RAM存储器的数据。当设置保密性后,Flash和RAM都被看作保密资源,直接页寄存器、高端页寄存器、背景调试模块被认为是非保密资源。执行过程中,可以访问任何位置的内存数据,但通过背景调试接口或不安全的方式来访问保密资源是不允许的。 保密性设置依赖于FOPT中非易失性的数据位SEC01:SEC00来实现。在芯片复位时,非易失性的NVOPT将数据赋给高端页寄存器中的FOPT。所以用户要赋予MCU的保密性,需要写程序时修改NVOPT位置的数据,NVOPT地址是$FFBF,修改NVOPT和修改其他Flash地址数据的方法相同。数据位SEC01:SEC00如果是1:0状态,则取消了MCU保密性,其他的组合都具有MCU保密性。用户特别注意,在对Flash进行整体擦除后,NVOPT也被置为$FF,复位后,数据位SEC01:SEC00将是1:1状态,是一种保密状态。所以在整体擦除后,建议立即编程,将NVOPT的数据位SEC01:SEC00改写成1:0,那么下一次复位后,MCU就是非保密状态。 当MCU处于保密状态下,片上调试模块是不能工作的,背景调试模块仍然可以工作,但不能进入激活的背景模式。 用户可以选择一种“后门”机制,假如寄存器NVOPT/FOPT的KEYEN位为0时,后门机制无效,但是如果KEYEN位为1时,用户按照如下的方法取消MCU的保密状态: ?将FCNFG的KEYACC位置1。 ?向NVBACKKEY,NVBACKKEY+7的位置(Flash中$FFB0 –$FFB7)依次写 0 入8个字节,由于第?步的操作,MCU会将该写入操作理解为是密码比较操作,这8个字节被看作是后门的钥匙。 ?将FCNFG的KEYACC位置0,如果用户写入的8个字节和NVBACKKEY,NVBACKKEY+7的位置的8个字节是匹配的,MCU会将SEC01:SEC00改写成1:0,从而取消MCU的保密性。 这种保密钥匙只能从保密的存储器中写入,所以在没有用户程序的配合下,背景调试命令也不可以进入的。当然如果不知道后门钥匙,使用这种方法也是不可以取消MCU的保密性。 练习题 【基础题】 1(简述Flash存储器的特点。 2(M68HC08系列单片机的Flash存储器有哪两种编程模式,两种模式有什么区别,分别在什么条件下进行? 3(对MC908GP32单片机进行Flash在线编程时应注意哪些问题? 4(利用Flash区存储需要变动的参数时,应该注意哪些问题?举例说明。 [提示: Flash区是按页擦除、按行或页方式写入的,无法只针对某一字 29 第13章 Flash存储器 节擦除,这是Flash存储器编程的特点之一] 5(调试本章给出的例程,通过例程理解MC908GP32单片机的Flash存储器在线编程原理与方法。 【综合题】 6(理解教学资料中GP32的Flash C语言编程实例,说明其中如何实现子程序的完全独立封装的。 7(自己编程实现MC9S08GB60单片机的Flash存储器的擦除和写入。 8(MC9S08GB60单片机和MC908GP32单片机的存储器安全机制和Flash编程有哪些不同点, 9(设计一组试验程序验证MC9S08GB60单片机的安全性。 30
本文档为【第13章_Flash存储器】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_079973
暂无简介~
格式:doc
大小:105KB
软件:Word
页数:44
分类:互联网
上传时间:2017-09-21
浏览量:33