对MC68HC908内Flash在线编程的一种方法

发布者:水手谷水手最新更新时间:2013-01-21 来源: 21ic关键字:MC68HC908  Flash  在线编程 手机看文章 扫描二维码
随时随地手机看文章

MC68HC908系列单片机的片内Flash可以在两种模式下在线编程:监控模式(monitor mode)和用户模式(usermode)。两种模式各有优缺点:监控模式需要外部硬件支持,但不需要单片机内部程序的存在,所以适合于对新出厂芯片进行编程写入,或是对芯片的整体擦除或写入;用户模式可以在单片机正常工作时进入,所以常用在运行过程中对部分Flash单元进行修改,特别适合于目标系统的动态程序更新和运行数据存储。在Freescale的许多文档中一再强调在用户模式下调用编程子例程之前,应该先将子例程复制到RAM中去,然后跳转到RAM执行;但是对于RAM区较少的单片机(如MC68HC908QY4),必须利用监控ROM中固化的程序。对于这类单片机,即使是在监控模式下,RAM区同样是不够Flash编程使用的。因此,本文以MC68HC908QY4为例,为开发者提供一种在用户模式下,通过利用监控ROM中固化的程序实现对单片机片内Flash在线编程的方法。

Flash编程操作

用户可以对Flash进行3种编程操作:整体擦除、页擦除和写入。MC68HC908系列单片机提供了闪速存储控制寄存器(FLCR),Flash的写入和擦除操作都是通过设置FLCR中的控制位来完成的。

目前在FLCR中只有4位是有效的:
◇HVEN(高压允许位),用于将来自片内电荷泵的高压加到Flash阵列上;
◇MASS(整体擦除位),用于选择擦除方式(=1为整体擦除,=0为页擦除);
◇ERASE(擦除控制位),用于选择擦除操作;
◇PGM(编程写入控制位),用于选择编程写入操作。

在对Flash进行编程操作时,必须注意两个单位———页(page)和行(row)。页多用在对Flash进行页擦除操作时,而行多用在对Flash进行编程写入时。对于不同型号的单片机,页和行的定义可能是不一致的(例如MC68HC908GP32,1页等于128字节,1行等于64字节;而对于MC68HC908JL3,1页等于64字节,1行等于32字节);但总的来说,1页都等于2行。

用户还可以选择对部分Flash进行编程保护。保护区的首地址由Flash块保护寄存器(FLBPR)设定,末地址则固定为$FFFF。受保护的Flash单元将无法被编程擦除或写入。以MC68HC908QY4为例,对Flash进行编程的具体操作步骤如下:

页(整体)擦除操作
①置ERASE位为1(整体擦除的同时置MASS位为1);
②读出Flash块保护寄存器;
③向被擦除的Flash页(整体擦除时为整个Flash区)内任意地址写入任意值;
④延时Tnvs≥1μs;
⑤置HVEN位为1;
⑥延时Terase≥1ms(整体擦除时为Tmerase≥4ms);
⑦清ERASE位为0;
⑧延时Tnvh≥5μs(整体擦除时为Tnvh1≥100μs);
⑨清HVEN位为0;
⑩延时Trcv≥1μs后,该Flash页(整体擦除时为整个Flash区)可以被正常读取。

(2)写入操作
QY4采用了以行为单位的写入方式,其他某些MC68HC908系列的单片机(如GP32),则采用以页为单位的写入方式。
①置PGM位为1;
②读出Flash块保护寄存器;
③向行地址范围内任意Flash单元写入任意值;
④延时Tnvs≥10μs;
⑤置HVEN位为1;
⑥延时Tpgs≥5μs;
⑦向行内目标地址写入编程数据;
⑧延时Tprog≥40μs;
⑨重复①~⑧的步骤写入编程数据,直至同一行内各字节编程完毕;
⑩清PGM位为0;
⑾延时Tnvh≥5μs;
⑿清HVEN位为0;
⒀延时Trcv≥1μs以后,该Flash页可以被正常读取。

Flash的在线编程方法

HC08系列MCU出厂时,Flash区包含了字节数不同的监控ROM程序。监控ROM程序包含了HC08系列所共有的基本子程序。在用户模式下,监控ROM程序所在的Flash空间可以很方便地读出。如果读者感兴趣编写一个读Flash的程序,再通过串口发送到计算机端,然后利用CodeWarrior中的反汇编程序将读出的代码反汇编,就可以很清楚地看出这些监控程序具体的执行过程。限于篇幅,本文对于程序本身不再一一列出,只在括号中注明各个程序的功能,并通过示例介绍如何使用ROM中的程序。下面以MC68HC908QY4为例,详细介绍如何通过ROM程序实现对Flash的在线编程。

程序中使用的变量

表1详细列出了程序所定义变量的地址和功能。


表1 程序所定义变量的地址和功能

基本的程序模块及其使用示例

例1 GETBYTE 通过一个I/O引脚接收一个字节数据。

如果该I/O引脚作为输入口,而且有上拉电阻,那么就可以调用GETBYTE。

GETBYTE: equ 2800 ;GETBYTE程序模块的入口地址
Bclr 0,DDRA ;使PTA口的第0位为输入口
Jsr GETBYTE ;调用GETBYTE子程序
Bcc FrameError ;若C=0,则调用出错;否则,
;调用成功

例2 RDVRRNG ①读取Flash指定区间的数据,并将读到的数据发送到上位机;②读取Flash指定区间的数据,并与RAM中的数据表作比较。[page]

①读取地址$F000~$F010的数据并发送。
RDVRRNG: equ 2803 ;RDVRRNG程序模块入口地址
Bclr 0,PTA ;对数据端口初始化,PTA0=0
Ldhx # $F010 ;将末地址送入寄存器LADDR
Sthx LADDR ;LADDR的地址:RAM首地
;址+#$0A、RAM首地址
;+#$0B
Ldhx # $F000 ;将首地址送入H∶X寄存器中
Clra ;A=0,选择程序功能模块1
Jsr RDVRRNG ;调用RDVRRNG子程序

②读取地址$E800~$E81F中的数据并与RAM中的数据作比较。如果相同,则标志位C置位;否则,标志位C清零。
RDVRRNG: equ 2803 ;RDVRRNG程序模块入口地址
Ldhx # $0000 ;HX初始化为零
Lda # $AA ;初始化送入数据表中的数据
Data_load: coma ;求反
Sta DATA,x ;在RAM数据表中填充数据,
;#$55,#$AA,#$55,..
Aix # 1
Cphx # $ 20 ;数据表共32字节
Bne DATA_load
Ldhx # $E81F ;将末地址送入LADDR中
Sthx LADDR
Ldhx # $E800 ;将首地址送入HX中
Lda # $55 ;A中写入非零数据,用于
;选择程序功能模块②
jsrRDVRRNG ;调用RDVRRNG子程序
bccerror ;C=0,RAM数据表和指定
;Flash区间的数据不相同

例3 ERARNGE ①页擦除;②整体擦除。

①擦除页 # $EE00~#$EE3F。
ERARNGE: equ 2806 ;ERARNGE程序模块入口地址
Mov # $ 20,CPUSPD;CPUSPD=4×fop=32,
;CPUSPD的地址为RAM
;首地址+#$09
Mov # $00,CTRLBY
;00选择页擦除,CTRLBYT的
;地址为RAM首地址+#$08
Ldhx # $EE00 ;将要擦除页的首地址写入
;H∶X寄存器中
Jsr ERARNGE ;调用ERARNGE程序

②由于是整体擦除的,因此不需要末地址。程序只须将首地址存放到H∶X寄存器中。示例将擦除#
$F000~#$FFFF。

ERARNGE: equ 2806 ;ERARNGE程序模块入口地址
Mov # $20,CPUSPD ;CPUSPD=4×fop=32,
;CPUSPD的地址为RAM
;首地址+#$09
Mov # $40,CTRLBYT ;40选择页擦除,
;CTRLBYT的地址为RAM
;首地址+#$08
Ldhx # $EE00 ;将要擦除页的首地址写入
;H∶X寄存器中
Jsr ERARNGE ;调用ERARNGE程序

JB8和JL/JKxx(E)的Flash保护寄存器(FLBPR)不在整个Flash中。由于只要系统上电复位,芯片便会根据FLBPR把某一块地址空间保护起来,因此在使用这条指令之前首先要擦除FLBPR。

例4 PRGRNGE 将RAM中的一段数据下载到指定的Flash地址区间内。

由于在下载程序到Flash之前,必须保证这一块地址空间是空的,所以PRGRNGE应该与ERARNGE结合使用;而且在调用PRGRNGE程序之前必须调用延时子程序DELNUS,用于产生适当的延时。对于几乎所有的HC08单片机,下载区间没有特定的限制,但是对于MC68HLC908QT/QYxx,下载区间必须在同一行内。

PRGRNGE: equ 2809 ;PRGRNGE程序模块入口地址
Ldhx # $0000 ;HX初始化为零
Lda # $AA ;初始化送入数据表中的数据
Data_load:coma ;求反
Sta DATA,x ;在RAM数据表中填充数据,
;#$55,#$AA,#$55,..
Aix #1
Cphx # $20 ;数据表共32字节
Bne DATA_load
Mov # $20,CPUSPD  ;CPUSPD=4×fop=32
Ldhx # $EE1F ;写满1行。如果替换为ldhx
;#$EE3F,则写满1页
Sthx LADDR ;将末地址送入LADDR中
Ldhx # $EE00 ;将行的首地址放入H∶X
;寄存器中
Jsr PRGRNGE ;调用PRGRNGE程序

例5 DELNUS 用于产生适当的延时。

DELNUS的两个参数分别存放在累加器A和X寄存器中,其中A>1,X>1。累加器A中的值为CPUSPD=4×fop。计算公式为DELNUS=3×A×X+8。示例中,已知延时为100μs,要求计算A和X的值。具体的运算过程如下:

①计算100μs的延时需要多少总线周期。Bus_cycle=100μs×8MHz=800cycles
②计算A的数值。 A=CPUSPD=4×8=32
③计算DELNUS程序运行(lda、ldx、jsr)需要的周期数N。 N=2+2+5=9
④计算X的值。由方程DELNUS_100us=800=DELNUS+9=3×32×X+8+9,可得X=8,则程序为:

DELNUS: equ 280C ;DELNUS程序模块
;入口地址
DELNUS_100us: lda # $20 ;A=#$20
Ldx # $8 ;X=8
Jsr DELNUS ;调用DELNUS程序

结语

不同类型的单片机,各程序模块的入口地址不同,开发者可以查阅Freescale的技术资料,找出这些程序模块的入口地址。这里还有一点要说明:若要用这种方法对Flash进行在线编程,则该型MCU必须具有本文第2部分所描述的程序功能模块。本文的目的就是想以MC68HC908QY4为例,为开发者提供一种对片内Flash在线编程的方法,由此获得更多、更好的应用。

关键字:MC68HC908  Flash  在线编程 引用地址:对MC68HC908内Flash在线编程的一种方法

上一篇:采用微控制器MC68HC908LB8带PFC的数控可调光电子照明镇流器
下一篇:基于MC68HC908的VoIP电话终端的设计与实现

推荐阅读最新更新时间:2024-03-16 13:16

利用Freeze技术的FPGA实现低功耗设计
由于更严格的功耗限制、规范和标准要求,系统设计师现在比什么时候都关注功耗问题。对于下一代的设计,功耗预算通常得到稳定的控制,或者降低,但却增加了更多的特性和处理能力需求。通常,尽管产品特性和性能需求不断增加,功耗预算还是很紧张,功能和性能的增加与降低功耗的目的是相矛盾的。摩尔定律效应缩小了工艺的尺寸加大了功耗问题,而且由于高的晶体管泄漏增加了静态功耗。 如数码相机、无线手持设备、智能电话和多媒体播放器这些电池供电应用的增长,推动了对低功耗半导体器件的需求。这种需求的爆发性增长加之对节能的不断提高的要求,特别是与电池寿命相关的节能要求,导致对低功耗半导体技术的全球性需求。其结果是,半导体设计师开始研究如何在不增加系统的功率条件下
[电源管理]
利用Freeze技术的FPGA实现低功耗设计
TMS320VC5509在线烧写Flash并自举启动方法研究
摘 要: 为了解决TMS320VC55X系列DSP系统程序代码的保存问题,设计了一种利用JTAG接口,在线烧写Flash并实现自举启动的方法。这种在线编程的方法利用并行外部存储器加载(EMIF)接口将TMS320VC5509和Flash芯片相连接,通过搬移程序将应用程序的已初始化段按照C55X系列DSP引导表格式烧写进外部扩展的Flash存储器中,从而实现自举启动。该方法为DSP系统的软件维护和升级带来了方便,具有实际的应用价值。 关键词: TMS320VC5509;自举启动;在线编程;Flash 随着数字信号处理技术的快速发展,DSP被广泛应用于各种数字信号处理系统中。最终开发的系统若要脱离仿真器运行,必须将程序代码存储在
[嵌入式]
TMS320VC5509<font color='red'>在线</font>烧写<font color='red'>Flash</font>并自举启动方法研究
使用IAR+Jlink开发STM32关于下载Flash的一点发现
1、使用Jlink下载程序的使用,没有进行Flasah整片擦除, 2、基于1, 出现以下这种情况, 当第一次下载一个较大程序例如30k, 第二次下载一个小程序例如10k, 那么 第二次下载后,Flash区域有20K的Flash区域不是0XFF,而且是没有意义的数据 以上两点已得到证实
[单片机]
stm32 Flash 模拟EEPROM
/* *STM32的闪存模块由:主存储器、信息块和闪存存储器接口寄存器等3部分组成。 * 对于大容量产品 每页2K字节 * 小容量和中容量产品则每页只有1K字节 * */ /* * *闪存的读取 *内置闪存模块可以在通用地址空间直接寻址, *任何32位数据的读操作都能访问闪存模块的内容并得到相应的数据。 *这里要特别留意一个闪存等待时间,因为CPU运行速度比FLASH快得多, *STM32F103的FLASH最快访问速度 24Mhz,如果CPU频率超过这个速度, *那么必须加入等待时间,比如我们一般使用72Mhz的主频,那么FLASH等待周期就必须设置为2, *该设置通过FLASH_ACR寄存器设置。
[单片机]
stm32 <font color='red'>Flash</font> 模拟EEPROM
stm32f103zet6如何识别flash大小
  在我们应用开发时,经常会有一些程序运行参数需要保存,如一些修正系数。这些数据的特点是:数量少而且不需要经常修改,但又不能定义为常量,因为每台设备可能不一样而且在以后还有修改的可能。将这类数据存在指定的位置,需要修改时直接修改存储位置的数值,需要使用时则直接读取,会是一种方便的做法。考虑到这些数据量比较少,使用专门的存储单元既不经济,也没有必要,而STM32F103内部的Flash容量较大,而且ST的库函数中还提供了基本的Flash操作函数,实现起来也比较方便。   以大容量产品STM32F103ZET为例,其Flash容量达到512K,可以将其中一部分用作数据存储。如下是大容量的Flash组织模式:     STM32的
[单片机]
stm32f103zet6如何识别<font color='red'>flash</font>大小
ARM与Flash ROM
以ARM为核心的嵌入式设备,是一种以计算机为核心的产品,必须要有存储软件的存储器。单片机中软件存储在单片机芯片内的ROM存储器中,单片机的ROM容量很小,一般都小于1MBytes,所以ROM集成在芯片内。PC机要求的ROM比较大,主板上启动计算机用的BIOS存储在主板上一片1MBytes左右的Flash ROM中,操作系统和应用程序存储在硬盘中。ARM产品因为体积的缘故,通常都不用硬盘,但软件的体积一般都在几MBytes以上,通常在芯片外扩展联接容量较大的Flash ROM存储软件。 Flash ROM分为两种:NOR Flash ROM 和 NAND Flash ROM。NOR Flash ROM 用法类似于SDRAM 内存,有地
[单片机]
读写STM32内部flash读写代码
由于老师的要求,所以写了一份读写STM32内部FLASH的代码,这样的话就可以把STM32里面没有用来保存代码段的部分用来存储数据了。 由于《stm32flash编程手册》是很久很久以前看的,现在也没心情去仔细看那份手册了。大概浏览了一下,只看到了STM32里面的flash是以16位为单位读写的。 为什么记住这个,因为之前想写一个字节老是出错,所以翻翻手册,果然看到不能写1个字节数据。而且还发现,flash写地址为奇数时也会出错。所以这份代码里面 写flash的地址只能是偶数。浏览过程中还发现,手册里面说写flash和擦除flash的时候会影响cpu的运行速度,没仔细看(真心不想看)。其他具体手册里面的资料的话没有了, 看有没有高
[单片机]
FLASH与GEM Motors合作提供模块化多相轮毂电机技术
据外媒报道,作为先进的技术供应商和电子元件制造商之一,FLASH公司与欧洲电机创新公司GEM Motors达成新技术合作,以加强其 电动汽车 竞争力和产品组合。 在新的合作伙伴关系下,双方将生产1 - 15 kW的轮毂电机,以用多个电动汽车细分市场。 凭借灵活的模块化电机设计,FLASH可以在更快的周转时间内提供定制电机,充分满足客户的要求和紧迫的项目截止日期。此外,FLASH将获得GEM Motors的20项全球专利的使用权,并成为全球制造中心。 GEM Motors的模块化多相电机技术,将电驱动系统的所有组件集成到紧凑的解决方案中,从而简化车辆 电气化 架构,充分降低车辆的重量和传动成本,提供成本效益。该产品组合拥
[汽车电子]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
  • ARM裸机篇--按键中断
    先看看GPOI的输入实验:按键电路图:GPF1管教的功能:EINT1要使用GPF1作为EINT1的功能时,只要将GPFCON的3:2位配置成10就可以了!GPF1先配 ...
  • 网上下的--ARM入门笔记
    简单的介绍打今天起菜鸟的ARM笔记算是开张了,也算给我的这些笔记找个存的地方。为什么要发布出来?也许是大家感兴趣的,其实这些笔记之所 ...
  • 学习ARM开发(23)
    三个任务准备与运行结果下来看看创建任务和任运的栈空间怎么样的,以及运行输出。Made in china by UCSDN(caijunsheng)Lichee 1 0 0 ...
  • 学习ARM开发(22)
    关闭中断与打开中断中断是一种高效的对话机制,但有时并不想程序运行的过程中中断运行,比如正在打印东西,但程序突然中断了,又让另外一个 ...
  • 学习ARM开发(21)
    先要声明任务指针,因为后面需要使用。 任务指针 volatile TASK_TCB* volatile g_pCurrentTask = NULL;volatile TASK_TCB* vol ...
  • 学习ARM开发(20)
  • 学习ARM开发(19)
  • 学习ARM开发(14)
  • 学习ARM开发(15)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved