Transcript 全屏显示
FLASH存储器和 MC68HC908在线编程 Tsinghua Motorola MCU&DSP Application Center Jiangjunfeng 2002.4 FLASH 存储器 • Motorola微控制器片内集成FLASH的 优点 – 单一电源供电(FLASH编程时通过片内集成 电荷泵产生编程电压) – 可靠性高(数据保存>10年,擦写>1万次) – 擦写速度快(整体擦除5ms,单字节编程 40us) FLASH Array • GP32 Flash erase on page basis 1 page = 128 bytes = 2 rows Starting from address xx00, xx80 Flash program - on row basis 1 Row = 64 bytes Starting from address xx00, xx40, xx80, xxC0 • JL3 Flash erase on page basis 1 page = 64 bytes = 2 rows Starting from address xx00, xx40, xx80, xxC0 Flash program - on row basis 1 Row = 32 bytes Starting from address xx00, xx20, xx40, xx60 xx80, xxA0, xxC0 FLASH 编程模式 1.) 监控模式 - 一般需要硬件支持 - 一般需要RAM程序支持 - 编程器和仿真器使用 2.) 用户模式 - 需要芯片内部软件支持 - 需要RAM程序支持 - 目标系统使用 监控模式编程 - 监控方式的进入 – 复位向量($FFFE-$FFFF)为空($FFFF) – 在特定引脚上提供特定电平(复位时) - 监控ROM的指令 - 下载到RAM中的程序 FLASH控制寄存器(FLCR) FLCR READ: WRITE: RESET: 0 HVEN — MASS — ERASE — PGM — 0 0 0 HVEN MASS ERASE PGM 0 0 0 0 高压允许位,用于将来自片内电荷泵 的高压加到FLASH阵列上; 整体擦除控制位,用于选择擦除方式 (=1,整体擦除 / =0,页擦除); 擦除控制位,用于选择擦除操作; 写入控制位,用于选择编程写入操作。 FLASH块保护寄存器(FLBPR) FLBPR READ: WRITE: RESET: = 00 = 01 = 02 … = FE = FF BPR7 BPR6 BPR5 BPR4 BPR3 BPR2 BPR1 BPR0 U U U U U U U U $8000 ~ $FFFF $8080 ~ $FFFF $8100 ~ $FFFF $FF00 ~ $FFFF entire flash is NOT protected FLASH块保护寄存器(FLBPR) - GP32(第14-7位) Block protect range FLBPR = 00 $8000 ~ $FFFF = 01 $8080 ~ $FFFF = 02 $8100 ~ $FFFF … = FE $FF00 ~ $FFFF = FF entire flash is NOT protected - JL3(第12-6位) Block protect range FLBPR = 00-60 = 62 = 64 … = FE = FF entire flash is protected $EC40 ~ $FFFF $EC80 ~ $FFFF $FFC0 ~ $FFFF entire flash is NOT protected FLASH写入操作(1) 1) 2) 3) 4) 5) 6) 7) 置PGM位为1; 读出FLASH块保护寄存器; 向页地址范围内($XX00-XX7F,或$XX80 - $XXFF)任意FLASH单元写入任意值; 延时Tnvs≥10微秒; 置HVEN位为1; 延时Tpgs≥5微秒; 向页内目标地址写入编程数据; FLASH写入操作(2) 8) 9) 10) 11) 12) 13) 延时Tprog≥30微秒; 重复7)、8),直至同一页内各字节编程 完毕; 清PGM位为0; 延时Tnvh≥5微秒; 清HVEN位为0; 延时Trcv≥1微秒以后,该FLASH页可以被 正常读取。 FLASH擦除操作(1) 1) 2) 3) 4) 5) 6) 置ERASE位为1(整体擦除时同时置MASS 位为1); 读出FLASH块保护寄存器; 向被擦除的FLASH页(整体擦除时为整 个FLASH区)内任意地址写入任意值; 延时Tnvs ≥ 10微秒; 置HVEN位为1; 延时Terase ≥ 1毫秒(整体擦除时为 Tmerase ≥ 4毫秒); FLASH擦除操作(2) 7) 8) 9) 10) 清ERASE位为0; 延时Tnvh≥5微秒(整体擦除时为 Tnvhl ≥ 100微秒); 清HVEN位为0; 延时Trcv≥1微秒后,该FLASH页(整体擦 除时为整个FLASH区)可以被正常读取。 FLASH存储器编程范例(常量定义) 常量定义 FLCR EQU $FE08 FLBPR EQU $FF09 ;C10US、C30US、C50US和C1MS用于延时例程 C10US EQU $FFFE C30US EQU $FFF8 C50US EQU $FFF1 C1MS EQU $FEC8 FLASH存储器编程范例(延时例程 ) 延时例程 NULLCYCLE: AIX CPHX BNE RTS #1 #0 NULLCYCLE ; 2 CYCLES ; 3 CYCLES ; 3 CYCLES ; 4 CYCLES 调用方法如下(以延时30us为例): LDHX BSR #C30US NULLCYCLE ; 3 CYCLES ; 4 CYCLES 如果循环次数为n,则整个延时步骤耗费的总线周期为: 3(LDHX)+ 4(BSR)+(2(AIX) + 3(CPHX)+ 3(BNE))* n + 4(RTS) =8n+11 (8n+11)/2.4576=30us n=8 C30US=$FFF8 FLASH存储器编程范例(页擦除例程 1) 页擦除例程 RMB 4 ;BUFF=$C7(“STA ”),; BUFF+3= $81 (“RTS”) ;BUFF+1和BUFF+2为需要擦除的FLASH页内的十六位地址 SUB_ERASE: LDA #2 ; 置ERASE位为1,清MASS位为0 STA FLCR LDA FLBPR JSR BUFF ;向被擦除的FLASH页内任意地址写入任意值 LDHX #C10US ; 延时Tnvs(10us) BSR NULLCYCLE LDA #0E ; 置HVEN位为1 STA FLCR LDHX #C1MS ; 延时Terase(1ms) BSR NULLCYCLE BUFF (To be continued) FLASH存储器编程范例(页擦除例程 2) 页擦除例程 (continue) LDA STA LDHX BSR CLRA STA LDHX BSR RTS #0C FLCR #C10US NULLCYCLE ; 清ERASE位为0 ; 延时Tnvh(10us) ; 清HVEN位为0 FLCR #C10US NULLCYCLE ; 延时Trcv(1us),此处延时10us FLASH存储器编程范例(写入程序1) 写入程序 FLASHFLAG B_ERROR BUFFCOU COUNTE1 COUNTE2 PRADDR TEMP RMB EQU RMB RMB RMB RMB RMB ;BUFFCOU 1 0 2 1 1 2 2 ;用于记录FLASH写入操作的状态 ;用于标志写入操作是否成功(0) ;存储数据源缓冲区的起始地址 ; 需复制到FLASH中的字节数 ; COUNTE1的临时存储备份 ; FLASH目标写入区域的起始地址 ; BUFFCOU的临时存储备份 -------PRADDR (To be continued) FLASH存储器编程范例(写入程序2) 写入程序(continue) SUB_PROGRAM: MOV LDHX STHX LDA STA LDA LDHX STA LDHX BSR LDA STA LDHX BSR COUNTE1,COUNTE2 ; 将COUNTE1和BUFFCOU备份 BUFFCOU TEMP #1 ; 置PGM位为1 FLCR FLBPR PRADDR ; 向地址范围内任意FLASH单元写入任意值 ,X #C10US ; 延时Tnvs(10us) NULLCYCLE #9 ; 置HVEN位为1 FLCR #C10US ; 延时Tpgs(5us),此处10us NULLCYCLE (To be continued) FLASH存储器编程范例(写入程序3) 写入程序(continue) LDHX CYCLE_PR: PSHH PSHX LDHX LDA AIX STHX PULX PULH STA AIX PSHH PSHX LDHX BSR PULX PULH DEC BNE PRADDR ; 向目标地址写入编程数据 ; 保存目标写入地址 BUFFCOU ,X #1 BUFFCOU ; 提取源数据 ; 将BUFFCOU指向下一个源数据 ; 取出目标写入地址到(H:X) ,X #1 ; 向目标地址写入数据 ; 将(H:X)指向下一个目标地址 ; 保存目标写入地址 #C30US NULLCYCLE ; 延时Tprog(30us) ; 取出目标写入地址到(H:X) COUNTE1 CYCLE_PR ; 重复直至同一页内各字节编程完毕 (To be continued) FLASH存储器编程范例(写入程序4) 写入程序(continue) LDA STA LDHX BSR CLRA STA LDHX BSR #8 FLCR #C10US NULLCYCLE ; 清PGM位为0 ; 延时Tnvh(5us),此处为10us ; 清HVEN位为0 FLCR #C10US NULLCYCLE ; 延时Trcv(1us),此处延时10us (To be continued) FLASH存储器编程范例(校验1) 校验 LDHX STHX LDHX VERIFY_PR: PSHX PSHH LDHX LDA AIX STHX PULH PULX TEMP BUFFCOU PRADDR ; 恢复BUFFCOU指向缓冲区首字节 ; 取出目标写入地址到(H:X) ; 保存目标写入地址 BUFFCOU ,X #1 BUFFCOU ; 提取源数据 ; 将BUFFCOU指向下一个源数据 ; 取出目标写入地址到(H:X) (To be continued) FLASH存储器编程范例(校验2) 校验(con tinue) CMP BNE AIX DEC BNE RTS ERROR_PR: BSET RTS ,X ; 比较源数据与目标地址中写入的数据 ERROR_PR ; 如不同则跳转到出错处理语句 #1 ;相同将(H:X)指向下一个目标地址 COUNTE2 ; 递减COUNTE2 VERIFY_PR ; 如果为0则校验完毕 B_ERROR,FLASHFLAG ; 如果出错置上标志位 Flash In System Programming through SCI Port FLASH Data $0000 I/O Registers $0040 RAM $023F Application Software FLASH Programming Algorithm TxD SCI RxD PTA0 $8000 Erase FLASH FLASH ISP Routine $FE00 Registers Monitor ROM $FFFF Vectors Programming and erasing of FLASH locations cannot be performed by code being executed from the FLASH memory 监控程序中修改FLASH字节的编程简述(1) 功能子程序 • SUB_WAIT(延时子程) • SUB_ERASE(FLASH页擦除子程) • SUB_PROGRAM(FLASH页写入子程) 监控程序中修改FLASH字节的编程简述(2) 编程步骤 1、拷贝欲修改的FLASH字节所在的整个页(128字节) 到RAM中(如复制到$0180后); 2、在RAM中修改欲修改的FLASH字节所对应的内容; 3、拷贝SUB_WAIT和SUB_ERASE到RAM中(如复制到 $0100后),执行SUB_ERASE,擦除FLASH页; 4、拷贝SUB_WAIT和SUB_PROGRAM到RAM中,执 行SUB_PROGRAM,将RAM中修改后的FLASH页 写回FLASH。 监控程序中修改FLASH字节的编程图解(1) (1)拷贝FLAS页(如FLASH页$8000-$807F) (2)在RAM中修改字节 (如欲修改FLASH中的字节$8040,则应修改RAM中对 应字节$01C0) 监控程序中修改FLASH字节的编程图解(2) (3)擦除FLASH页 (4)写入FLASH页 注意事项 • FLASH擦写时,FLASH擦写程序代码应放在RAM中, 或利用ROM中的例程。 • FLCR的HEVN置1时,整个FLASH加上编程高电压, 此时对FLASH内字节的读写不稳定。 MC68HC08GP32IDK监控程序和用户程序的关系 • 用户复位向量$DFFE-$DFFF,芯片复位向量$FFFE$FFFF • 用户复位向量为非空(非$FFFF ),监控程序等待键 盘命令,5s内没有动作,跳转到用户复位向量处,运 行用户程序 • 监控程序入口地址$DFDA-$DFDB,用JMP跳转命令可 以从用户程序返回监控程序 利用ROM中的例程进行FLASH在线编程 (ref. 908LJ12) DataFile1 pointer DataFile2 pointer CPUSPD Data Size Address High 1 Address Low 1 Data0 Data1 DataN PROGRAM VERIFY FLASH : LDHX JSR : $<DataFile1PTR> PRGRNGE : LDHX JSR : $<DataFile2PTR> LDRNGE CPUSPD Data Size Address High 1 Address Low 1 Data0 Data1 DataN Function Name Calling Address Feature WRITE_EE $FC00 Stack the DATA segment from data file to the FLASH block and updates dirty control bit accordingly. If block overflows, performs block erase. READ_EE $FC03 Read last updated DATA segment from FLASH block back to data file. LDRNGE $FF30 Load data from FLASH block to data file with specific location and size. PRGRNGE $FC06 Program specific FLASH location with data listed in data file. ERARNGE $FCBE Perform mass erase or single block erase according to user selection. ICP_LDRNGE $FF24 Perform same operation as LDRNGE. This subroutine is specially designed to use under monitor mode. ICP_PRGRNGE $FF28 Perform same operation as PRGRNGE. This subroutine is specially designed to use under monitor mode. ICP_ERARNGE $FF2C Perform same operation as ERARNGE. This subroutine is specially designed to use under monitor mode. FLASH 应用一(1) MC68HC08GP32在线开发实验系统 FLASH 应用一(2) MC68HC08GP32在线开发实验系统 FLASH 应用二 MC68HC08GP32编程器 FLASH 应用三(1) MC68HC908LJ12在线编程开发工具 FLASH 应用三(2) MC68HC908LJ12在线编程开发工具特点 • 编程器的功能 —(监控模式对FLASH进行在线编程) 通过硬件方式进入监控模式对片内FLASH进行写入操作; 不占用任何系统资源; 使用4.9152MHz有源晶振。 • 开发板的功能 —(提供给用户最小的调试工作系统) 内含大约3.5K的监控程序; 使用32768Hz晶振; 监控程序提供给用户各种基本的开发和调试功能:程序的下载和运行、 断点设置、寄存器显示及修改、存储器显示及修改等等。 FLASH 应用四(1) MC68HC908在线编程头 FLASH 应用四(2) MC68HC908在线编程头特点 • 适用于MC68HC908系列的单片机 MC68HC908GR32, MC68HC908SR12, MC68HC908LJ12等 • 编程功能 可通过硬件方式进入监控模式对片内FLASH进行擦写 • 通讯功能 可作为与PC机串口通讯的工具