第十一章 Flash存储器的在线编程 主要内容 Flash存储器概述与编程模式 MC68HC908GP32单片机Flash存储器编程方法 《嵌入式应用技术基础教程》课件 第十一章 Flash存储器的在线编程 主要内容 Flash存储器概述与编程模式 MC68HC908GP32单片机Flash存储器编程方法 GP32单片机Flash在线编程汇编语言实例 GP32单片机Flash在线编程C语言实例 HCS08系列单片机Flash编程方法
11.1 Flash 存储器概述与编程模式 11.1.1 Flash存储器的基本特点与编程模式 (1)Flash存储器的基本特点 《嵌入式应用技术基础教程》课件 11.1 Flash 存储器概述与编程模式 11.1.1 Flash存储器的基本特点与编程模式 (1)Flash存储器的基本特点 ① 固有不挥发性 ② 易更新性 ③ 成本低、密度高、可靠性好 (2)Flash存储器的两种编程模式 ①监控模式(Monitor Mode)或写入器模式 ②用户模式(User Mode)或在线编程模式 11.1 Flash存储器概述与编程模式
11.1.2 M68HC08系列单片机Flash存储器的特点 与编程模式 《嵌入式应用技术基础教程》课件 11.1.2 M68HC08系列单片机Flash存储器的特点 与编程模式 (1)M68HC08系列单片机Flash存储器的特点 第一,编程速度快及可靠性高。 第二,单一电源电压供电。 第三,支持在线编程。 11.1 Flash存储器概述与编程模式
(2)M68HC08系列单片机Flash存储器的编程模式 《嵌入式应用技术基础教程》课件 (2)M68HC08系列单片机Flash存储器的编程模式 M68HC908系列单片机中绝大多数型号在其内部带有监控ROM,其地址和大小取决于芯片型号。 Flash存储器工作于监控模式的条件是: ① 复位向量($FFFE~$FFFF)内容为“空”($FFFF)。 ② 单片机复位时在IRQ引脚上加上高电压(1.4~2Vdd),并给某些I/O脚置适当值(与芯片型号有关,设计时,参考芯片手册)。 M68HC908系列单片机的Flash存储器工作于用户模式不需要特别的条件,在单片机正常工作的过程中,程序可以随时转入对Flash存储器进行编程操作。这种情况下对Flash存储器的擦除与写入,不需要用户提供其它外部硬件条件。 返回 11.1 Flash存储器概述与编程模式
11.2 MC68HC908GP32单片机Flash存储器编程方法 《嵌入式应用技术基础教程》课件 11.2 MC68HC908GP32单片机Flash存储器编程方法 11.2.1 Flash存储器编程的基本概念 (1)对Flash编程的两种基本操作:擦除(Erase)和写入(Program) 擦除操作的含义是将存储单元的内容由二进制的0变成1, 写入操作的含义是将存储单元的内容由二进制的1变成0。 擦除及写入操作都是通过设置或清除Flash存储器的控制寄存器(FLCR)中的某个或某些位来完成的。 11.2 GP32 Flash存储器编程方法
(2)Flash片内单位:页(Page)和行(Row) 《嵌入式应用技术基础教程》课件 (2)Flash片内单位:页(Page)和行(Row) 页和行的大小(字节数)随整个Flash存储器的大小变化而变化,但页的大小始终为行的两倍。例如MC68HC908GP32内含32K的Flash存储器(地址为$8000~$FDFF),每页的大小为128字节,每行的大小为64字节;而MC68HC908JL3片内Flash存储器仅有4K,每页和每行的大小也分别变为64字节和32字节。 (3)Flash的整体擦除和页擦除 对于GP32单片机来说,对Flash存储器的擦除操作可以进行整体擦除也可以仅擦除某一起始地址开始的一页(128字节)。也就是说,不能仅擦除某一字节或一次擦除小于128字节。注意这一特点,在数据安排时尤为重要。GP32单片机的写入操作以行(64字节)为基础,一次连续写入数据个数只能在一行之内。当然,不经过擦除的区域,不能进行写入,这一点需特别注意。 11.2 GP32 Flash存储器编程方法
11.2.2 Flash存储器的编程寄存器 (1)Flash控制寄存器(Flash Control Register — FLCR) 《嵌入式应用技术基础教程》课件 11.2.2 Flash存储器的编程寄存器 (1)Flash控制寄存器(Flash Control Register — FLCR) FLCR的地址:$FE08,定义为: 数据位 D7 D6 D5 D4 D3 D2 D1 D0 定义 HVEN MASS ERASE PGM 复位 0 0 0 0 0 0 0 0 D7~D4位:未定义。 D3 — HVEN位:高压允许位(High-Voltage Enable Bit)。 D2 — MASS位:整体擦除控制位(Mass Erase Control Bit)。 D1 — ERASE位:擦除控制位(Erase Control Bit)。 D0 — PGM位:编程(写入)控制位(Program Control Bit)。 11.2 GP32 Flash存储器编程方法
(2)Flash块保护寄存器(Flash Block Protect Register — FLBPR) 《嵌入式应用技术基础教程》课件 (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)。 特别情况是:FLBPR的存储内容为$00,整个Flash存储区都受到保护;如果FLBPR的存储内容为$FF,则整个Flash存储区都可以被擦除或写入。 注:只有当单片机处于运行用户程序时,对FLBPR本身和Flash保护区域的擦写操作保护才是有效的。复位不影响FLBPR。 11.2 GP32 Flash存储器编程方法
GP32与JL3芯片Flash块保护寄存器设置比较 《嵌入式应用技术基础教程》课件 GP32与JL3芯片Flash块保护寄存器设置比较 GP32 JL3 FLBPR内容 受保护的Flash区域 $00(%0000 0000) $8000 ~ $FFFF $00 ~ $60 $EC00 ~ $FFFF $01(%0000 0001) $8080 ~ $FFFF $62(%0110 0010) $EC40 ~ $FFFF $02(%0000 0010) $8100 ~ $FFFF $64(%0110 0100) $EC80 ~ $FFFF …… $68(%0110 1000) $ECC0 ~ $FFFF $FE(%1111 1110) $FF00 ~ $FFFF $FF(%1111 1111) Flash区不被保护 $FFC0 ~ $FFFF 注:对MC68HC908GP32而言的,FLBPR设定的是16位起始地址的第14~7位(第15位恒为1);而对MC68HC908JL3而言,它们设定的是16位起始地址的第12~5位(第15~13位恒为1) 。 11.2 GP32 Flash存储器编程方法
11.2.3 Flash存储器的编程过程 (1)页擦除操作 《嵌入式应用技术基础教程》课件 MC68HC908GP32的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位); ⑦ 延时trcv(>1μs),完成一页的擦除操作。 11.2 GP32 Flash存储器编程方法
(2)整体擦除操作 《嵌入式应用技术基础教程》课件 下面过程擦除GP32的整个Flash区域,以便把新的程序装入Flash存储器: ① $6→FLCR(1→ERASE位,1→MASS位):进行整体擦除; ② 读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),完成整体擦除操作。 11.2 GP32 Flash存储器编程方法
(3)编程操作 《嵌入式应用技术基础教程》课件 MC68HC908GP32的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)以后,完成本行写入工作,可以读出校验。 11.2 GP32 Flash存储器编程方法
Flash从设置PGM或ERASE位到HVEN建立时间 MC68HC908GP32的Flash编程参数 参数 符号 最小值 最大值 单位 Flash行大小 - 64 字节 Flash页大小 128 Flash读写周期 tread 32K 8.4M Hz Flash页擦除时间 terase 1 ms Flash整体擦除时间 tmerase 4 Flash从设置PGM或ERASE位到HVEN建立时间 tnvs 10 μs Flash高电平维持时间(页擦除时) 5 Flash高电平维持时间(整体擦除时) tnvhl 100 Flash写入编程维持时间 tpgs ns Flash写入编程时间 tprog 30 40 Flash返回只读状态时间 trcv Flash累积高电平时间 thv 25 Flash行擦除次数 10K 次数 Flash行写入次数 Flash数据保持时间 年 返回 11.2 GP32 Flash存储器编程方法
11.3 GP32单片机Flash在线编程汇编语言实例 《嵌入式应用技术基础教程》课件 11.3 GP32单片机Flash在线编程汇编语言实例 11.3.1 Flash存储器的擦除及写入汇编子程序 (1)擦除子程序 (2)写入子程序 (3)擦除与写入子程序编程要点说明 ① RAM中要留有足够的缓冲区,以便存放复制到RAM中的子程序,具体值是取擦除与写入子程序中的大者即可。 ② 擦除及写入子程序中要调用的延时子程序均随其后,以便同时复制到RAM中,最后一个标号是为复制方便而加入. ③ 擦除及写入子程序中对延时子程序的调用必需使用“BSR 子程序名”,而不能使用 “JSR 子程序名”,因为这里的子程序是复制到RAM中执行,程序地址已经发生了变化,只能用相对调用。 11.3 GP32 Flash在线编程汇编语言实例
④ 擦除子程序与写入子程序及其中的延时子程序,若含有跳转语句,不能使用“JMP 地址”,只能使用“BRA 地址”。原因同上。 ⑤ 使用不同型号芯片时,上述子程序中延时时间应根据芯片手册予以变动。延时子程序也应根据不同的总线频率加以变化,确保时间满足时序要求。 ⑥ 一次擦除后未被写入过的区域可以再次调用写入子程序写入,但写入过的区域,未经擦除不能重写。 ⑦ 由于擦除是每次擦除一页(128字节),所以数据应合理安排,避免误擦。 ⑧ 页首地址的定义须遵照保护寄存器FLBPR定义的规则,即对GP32来说,页地址的低6位为0。 ⑨ 在线编程时使用的Flash存储区域应在程序Flash存储区域之前,因为Flash保护区为FLBPR决定的地址至末尾。 11.3 GP32 Flash在线编程汇编语言实例
11.3.2 Flash存储器在线编程汇编主程序及PC方程序 《嵌入式应用技术基础教程》课件 11.3.2 Flash存储器在线编程汇编主程序及PC方程序 (1)单片机方程序流程图 单片机方程序的主要功能是: ①不断地向PC机发出握手信号,并监测PC机返回的握手信号。可以看到串行通信指示灯闪烁,表明MCU在向PC机发送握手信号。 ②若收到握手信号,表明PC机可以发送数据,设要写入数据的个数为N,则单片机首先将接收数据个数N放入内存(接收的数据在一行之内,N小于等于64),随后接收N个数据,放入内存缓冲区。 ③擦除指定Flash区域,将收到的N个数据写入Flash区。 ④读出该Flash区的数据,并发送到PC机。 11.3 GP32 Flash在线编程汇编语言实例
给擦除子程序EraseSub的入口赋值,调用EraseSub,擦除Flash区$8000开始的一页 《嵌入式应用技术基础教程》课件 进行通信握手,发握手信号 接收N(<=64)→内存 接收N个数据放入内存缓冲区 给擦除子程序EraseSub的入口赋值,调用EraseSub,擦除Flash区$8000开始的一页 给写入子程序WriteSub的入口赋值,调用WriteSub, 将N个数据写入$8000开始的Flash区 从地址$8000开始的Flash区读取N个数据,同时从串行口发送出去 N Y HX赋初值$00 HX+1 =设定数? A中是约定的握手信号吗? 串行口有 数据吗? 接收一个数据→A 主循环开始处 单片机方程序流程图 11.3 GP32 Flash在线编程汇编语言实例
《嵌入式应用技术基础教程》课件 (2)单片机方主程序 (3)PC机方程序及界面 返回 11.3 GP32 Flash在线编程汇编语言实例
11.4 GP32单片机Flash在线编程C语言实例 Flash存储器的擦除及写入C语言子程序 Flash存储器在线编程C语言主函数 《嵌入式应用技术基础教程》课件 11.4 GP32单片机Flash在线编程C语言实例 Flash存储器的擦除及写入C语言子程序 Flash存储器在线编程C语言主函数 返回 11.4 GP32 Flash在线编程C语言实例
11.5 HCS08系列单片机Flash编程方法 11.5.1 Flash存储器的编程寄存器 《嵌入式应用技术基础教程》课件 在MC9S08GB60单片机中,与Flash编程有关的寄存器有6个,它们是Flash时钟分频寄存器(FCDIV)、Flash选项寄存器(FOPT和NVOPT)、Flash配置寄存器(FCNFG)、Flash保护寄存器(FPROT和NVPROT)、Flash状态寄存器(FSTAT)和Flash命令寄存器(FCMD),对应的地址分别为$1820、$1821、$1823、$1824、$1825和$1826。下面分别阐述这些寄存器的功能及用法。 11.5 HC08系列单片机 Flash编程方法
(1)Flash时钟分频寄存器(FLash Clock Divider Register — FLCR) 《嵌入式应用技术基础教程》课件 (1)Flash时钟分频寄存器(FLash Clock Divider Register — FLCR) FLCR的地址:$1820,定义为: 数据位 D7 D6 D5 D4 D3 D2 D1 D0 定义 DIVLD PRDIV8 DIV5 DIV4 DIV3 DIV2 DIV1 DIV0 复位 0 0 0 0 0 0 0 0 D7 — DIVLD位:分频设置状态标志位(Divisor Loaded Status Flag),只读位。 D6 — PRDIV8位:Flash预分频设置位(Prescale Flash Clock by 8)。 D5 ~ D0 位:DIV5~DIV0位,Flash时钟分频器的分频因子。Flash的内部工作时钟fFCLK的计算方法如下: 如果PRDIV8=0,fFCLK=fbus÷([DIV5:DIV0]+1) 如果PRDIV8=1,fFCLK=fbus÷(8×[DIV5:DIV0]+1) 11.5 HC08系列单片机 Flash编程方法
(2)Flash选项寄存器(Flash Options Register — FOPT和NVOPT) 《嵌入式应用技术基础教程》课件 (2)Flash选项寄存器(Flash Options Register — FOPT和NVOPT) FOPT的地址:$1821,定义为: 数据位 D7 D6 D5 D4 D3 D2 D1 D0 定义 KEYEN FNORED - - - - SEC01 SEC00 复位 将NVOPT中的内容装载到该寄存器中 D7—KEYEN位:后门锁机构允许位(Backdoor Key Mechanism Enable)。KEYEN=0,表示不能用后门锁机构来解除存储器的保密性;KEYEN=1,如果用户使用固件,写入8个字节的值,并且和后门钥匙NVBACKKEY~NVBACKKEY+7相匹配,在MCU复位前,存储器的保密性会暂时解除。 D6—FNORED位:矢量重定向禁止位(Vector Redirection Disable)。FNORED=1,矢量重定向禁止;反之允许。 D5~D2位:未定义。 D1~D0位 — SEC01~SEC00位:安全状态码。 11.5 HC08系列单片机 Flash编程方法
(3)Flash配置寄存器(Flash Configure Register — FCNFG) 《嵌入式应用技术基础教程》课件 (3)Flash配置寄存器(Flash Configure Register — FCNFG) FOPT的地址:$1823,定义为: 数据位 D7 D6 D5 D4 D3 D2 D1 D0 定义 KEYACC 复位 0 0 0 0 0 0 0 0 D7~D6位、 D4~D0位:未定义。 D5 — KEYACC位:写访问钥匙允许位(Enable Writing of Access Key)。 KEYACC=1,表示写BVBACKKEY($FFB0-$FFB7)被认为是进行密码比较;KEYACC=0,表示写BVBACKKEY($FFB0-$FFB7)被解释为Flash擦写命令的开始。 11.5 HC08系列单片机 Flash编程方法
(4)Flash保护寄存器(Flash Protect Register — FPORT和NVPROT) 《嵌入式应用技术基础教程》课件 (4)Flash保护寄存器(Flash Protect Register — FPORT和NVPROT) FPROT的地址:$1824,定义为: 数据位 D7 D6 D5 D4 D3 D2 D1 D0 定义 FPOPEN FPDIS FPS2 FPS1 FPS0 复位 将NVOPT中的内容装载到该寄存器中 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位决定了保护区域的大小。 D2~D0位:未定义。 11.5 HC08系列单片机 Flash编程方法
(5)Flash状态寄存器(Flash Status Register — FSTAT) 《嵌入式应用技术基础教程》课件 (5)Flash状态寄存器(Flash Status Register — FSTAT) FSTAT的地址:$1825,定义为: 数据位 D7 D6 D5 D4 D3 D2 D1 D0 定义 FCBEF FCCF FPVIOL FACCER FBLANK 复位 1 1 0 0 0 0 0 0 D7— FCBEF位:Flash命令缓冲区空标志位(Flash Command Buffer Empty Flag)。 D6 — FCCF位:Flash命令完成标志位(Flash Command Complete Flag)。 D5 — FPVIO位:侵害保护标志位(Protection Violation Flag)。 D4 — FACCER位:访问出错标志位(Access Error Flag)。 D2 — FBLANK位:Flash空白标志位(Flash Verified All Blank Flag)。 D3,D1~D0位:未定义。 11.5 HC08系列单片机 Flash编程方法
(6)Flash命令寄存器(Flash Command Register — FCMD) 《嵌入式应用技术基础教程》课件 (6)Flash命令寄存器(Flash Command Register — FCMD) FCMD的地址:$1826,定义为: 数据位 D7 D6 D5 D4 D3 D2 D1 D0 定义 FCMD7 FCMD6 FCMD5 FCMD4 FCMD3 FCMD2 FCMD1 FCMD0 复位 0 0 0 0 0 0 0 0 D7~D0位:对Flash进行访问的命令字节。 Flash访问命令表 命令 命令字节 空白检测 $05 写一个字节 $20 写一个字节(批量模式) $25 页擦除 $40 整体擦除 $41 11.5 HC08系列单片机 Flash编程方法
11.5.2 Flash存储器的编程过程 《嵌入式应用技术基础教程》课件 (1)Flash命令的执行步骤 ① 向Flash地址中写入一个数据。地址和数据信息都会被锁定到Flash接口中。对于空白检测和擦除命令,数据信息是一个任意值;对于页擦除命令,地址信息是擦除页(512字节)地址中的任意一个地址;对于空白检测和整体擦除命令,地址信息是Flash中的任意一个地址。 ② 向Flash命令寄存器FCMD中写入需要执行的命令。 ③ 执行命令。将Flash状态寄存器FSTAT的FCBEF位置1,同时开始执行命令寄存器中的命令。 11.5 HC08系列单片机 Flash编程方法
(2)Flash命令的执行流程 GB60 Flash 编 程 例 图 开始 FACCERR? 清错误标志 设置FCDIV[1] 开始 FACCERR? 清错误标志 设置FCDIV[1] 向FLASH地址中写入数据 向FCMD中写入命令字 FCBEF位置1,开始执行命令 FPVIO 或 FACCEER? 出错 退出 FCCF? 1 结束 GB60 Flash 编 程 例 图 11.5 HC08系列单片机 Flash编程方法
GB60 Flash批量写入流程图 开始 FACCERR? 清错误标志 设置FCDIV[1] 向FLASH地址中写入数据 设置FCDIV[1] 向FLASH地址中写入数据 向FCMD中写入命令字 FCBEF位置1,开始执行命令[2] FPVIO 或 FACCEER? 出错 退出 FCCF? 结束 新的批量写入指令吗? GB60 Flash批量写入流程图 11.5 HC08系列单片机 Flash编程方法
(3)Flash命令出错情况 《嵌入式应用技术基础教程》课件 在执行以下操作时,会导致出错,FACCERR自动置1: ① 在向Flash地址写入信息前没有进行FCDIV寄存器设置; ② 在向Flash地址写入信息前FCBEF没有置1; ③ 在执行命令前,执行两次向Flash地址写入信息操作; ④ 在向Flash地址写入信息后,设置除FCMD外的其他Flash控制寄存器; ⑤ 向FCMD中写入表11-6以外的命令字; ⑥ 向FCMD中写入命令字后,试图读写除FSTAT外的寄存器; ⑦ 在执行命令时,MCU进入STOP模式; ⑧ MCU处于保密状态时,使用背景调试接口进行页擦除或写Flash操作(MCU处于保密状态时,使用背景调试接口只能进行空白测试或整体擦除); ⑨ 向FCBEF位写0取消一个命令的执行。 11.5 HC08系列单片机 Flash编程方法
11.5.3 Flash存储器的安全性 《嵌入式应用技术基础教程》课件 HCS08系列MCU使用硬件电路机制来防止非法用户试图访问Flash和RAM存储器的数据。当设置保密性后,Flash和RAM都被看作保密资源,直接页寄存器、高端页寄存器、背景调试模块被认为是非保密资源。执行过程中,可以访问任何位置的内存数据,但通过背景调试接口或不安全的方式来访问保密资源是不允许的。 保密性设置依赖于FOPT中非易失性的数据位SEC01:SEC00来实现。 返回 11.5 HC08系列单片机 Flash编程方法
《嵌入式应用技术基础教程》课件 本章小结 本章主要以HC08系列中的GP32为例阐述Flash存储器的在线编程方法,也简要阐述了HCS08系列中GB60的在线编程方法。本章首先概述了Flash存储器的基本特点,并介绍其编程模式,随后给出M68HC908GP32的Flash存储器编程的基本操作及汇编语言和C语言的在线编程实例。最后讨论MC9S08GB60的Flash存储器编程方法。 返回