您当前的位置:五五电子网电子知识单片机-工控设备综合-其它P89C51RD2的Boot ROM与ISP功能的实现 正文
P89C51RD2的Boot ROM与ISP功能的实现

P89C51RD2的Boot ROM与ISP功能的实现

点击数:7558 次   录入时间:03-04 12:01:16   整理:http://www.55dianzi.com   综合-其它

     摘要:简单论述P89C51RD2的ISP和IAP功能,给出实现读取其Boot ROM源代码的硬件电路和程序;初步探讨ISP功能中的波特率的自动跟踪技术、命令字的接收格式和执行方式,给出部分源代码。

    1 引言

    P89C51RD2是PHILIPS公司内核基于8位80C51单片机的派生产品,在完全保留80C51指令系统和硬件结构的大框架下,进行了多方面的加强、扩展和创新,最大限度地利用了原有结构的方方面面。P89C51RD2将原有的对外数据和程序存储器的 16位寻址机制加以利用,把片上的RAM扩展到1KB、片上的FLASH EPROM扩展到64KB,满足当今用嵌入式高级语言对片上大存储容量的需要。

    P89C51RD2最显著的特点莫过于其ISP(In-System Programming,在系统可编程)功能和IAP(In-ApplICation Programming,在应用可编程)功能。ISP指电路板上的空白器件可以编程写入最终用户代码,而不需要从电路板上取下器件,已经编程的器件也可以用ISP方式擦除或再编程。IAP指MCU可以在系统中获取新代码并对自己重新编程,即可用程序来改变程序。ISP和IAP技术是未来仪器仪表的发展方向。PHILIPS公司为了使ISP技术和IAP技术得以推广,在芯片上免费提供了Boot ROM固件,并且巧妙地解决了固件和FLASH的地址覆盖问题及一些具体实现细节问题,使它们的实现变得简单而现成。

    对于Boot ROM中的内容,PHILIPS公司是不公开的。但很多技术人员对于Boot ROM固件中ISP(IAP)功能的实现非常感兴趣。就ISP状态而言,上位机直接跟Boot ROM固件中的程序打交道,因此,必须根据PHILIPS公司提供的流程和协议来编制上位机程序,至于Boot ROM内部是如何实现ISP功能的,则不得而知。如果能够搞明白ISP功能实现的具体方法,则对于上位机软件的编制是大有好处的。以下是对Boot ROM中有关ISP功能实现所作的一些初步探讨。

    2 Boot ROM固件代码的读出方法

    要对其 ISP功能进行分析,必须读出Boot ROM中的源代码。为此,必须弄清楚Boot ROM空间和FLASH空间的关系。P89C51RD2采用了最先进的FLASH(快闪)EPROM,其容量为64KB,并且分成8KB和16KB的存储块。我们知道,80C51系列8位单片机的最大寻址能力就是64KB,FLASH EPROM已经将全部寻址空间占据。同时,PHILIPS公司为P89C51RD2在片内提供了一个名叫引导ROM(Boot ROM)的1KB的固件。固件上有引导装载程序,可以接收主机经串口传来的命令和数据(如经PC机的RS-232C口),这个固件是放在64KB程序存储器的最高端的,与片内FLASH地址0FC00H~0FFFFH相覆盖。两者之间的切换是通过特殊功能寄存器AUXR1的ENBOOT位来进行的。

    ENBOOT=1 地址在0FC00H~0FFFFH范围,寻址到固件
ENBOOT=0 地址在0FC00H~0FFFFH范围,寻址到FLASH

    既然当ENBOOT=1时,能够寻址到固件,则利用程序就可以将固件代码读出。下面是实现代码读出时的硬件部分和软件部分。

    (1)硬件部分

    为了读出Boot ROM中的内容,必须给P89C51RD2搭一个包括复位、晶振和串口通信功能的基本硬件系统,如图1所示。ICL232为单电源串口转换芯片,可以完成TTL电平与RS-232C电平之间的转换。

    44.jpg

    (2)软件编制

    编制软件的目的,是为了从Boot ROM中读出源代码,并送往上位机显示。为了使用现成的软件(如超级终端),程序中将读出的二进制代码转换成ASCII码,并组成HEX文件格式直接传给上位机,这样,将显示的内容存盘并反汇编,就可以对Boot ROM中的内容进行分析。由于程序中涉及到二进制转换成HEX文件格式,故将有关HEX文件格式的有关内容表述如下:

    HEX文件的INTEL格式,是INTEL公司提出的按地址排列的数据信息,数据宽度为字节,所有数据使用十六进制数字表示,如Boot ROM从地址FC00H开始的前16个数据为(已经转换成ASCII码):

    75 89 02 75 C8 30 E4 F5 CD F5 CC 30 B0 FD 20 B0(十六进制)

    则转换成HEX文件格式为:
:10FC000075890275C830E4F5CDF5CC30B0FD20B073

    ":"符号表明记录的开始;后面的2个字符表明记录的长度,这里是10H,即16个十六进制数字;后面的4个字符给出调入的地址,这里是FC00H;再后面的2个字符表明记录的类型,00表示数据记录,01表示记录文件结束;再后面的16个数据即为真正的数据记录;最后的2位73是校验和,它加上前面所有的数据和为0。

    所有HEX格式文件的最后一行为结尾行,它比较特殊,总是如下所示:
:00000001FF
读Boot ROM代码的主程序编制如下:
AUXR1 EQU 0A2H ;特殊功能寄存器
BOOT_ROM EQU 0FC00H ;Boot ROM的起始地址
DAT_BUFFER EQU 30H ;数据暂存器
DAT_SUM EQU 31H ;校验和
ORG 0000H
AJMP START
ORG 0030H
START:
MOV SP,#50H
MOV SCON,#50H
MOV T2CON,#30H ;以T2作为波特率发生器
MOV TL2,#0E0H ;波特率为2400 bps
MOV TH2,#0FEH
MOV RCAP2L,#0E0H
MOV RCAP2H,#0FEH
SETB TR2 ;启动T2
MAIN: LCALL READ_ROM ;Boot ROM内容读出子程序
LCALL SEND_END ;结尾行送出子程序
AJMP $

    主程序中用到了两个子程序:READ_ROM和SEND_END。

    READ_ROM子程序功能:从FC00H开始将代码读出,将其转变成ASCII码并拼凑成HEX文件记录的形式传给上位机。

    读Boot ROM代码所调用的子程序见本刊网站发表的全文。

    3 Boot ROM固件的功能分析

    通过对Boot ROM中的程序进行分析,可以对ISP的有关指令进行更深入的理解,在一些编程方法上也可以向国外学习。下面对ISP的有关知识点进行阐述。

    3.1 关于自动确定波特率

    PHILIPS给出的ISP功能的第一个步骤为:上位机向下位机发送一个大写的英文字符"U",供下位机确定波特率。

    3.1.1 工作原理

    大写的英文字符"U"有它的特殊性,它的ASCII码为55H,转换成二进制为"01010101B",也就是说它是一个"0"、"1"相间的数据,如图2所示。如果能够算出其一个位的传输时间tp,则对应的波特率就可以计算出来。

    45.jpg

   



www.55dianzi.com

    3.1.2 tp对应的计数值

    首先看一下在Boot ROM中是如何计算一个位所对应的计数值的。以下为Boot ROM从地址FC00H ~FC17H之间的源代码及反汇编程序:

    源代码 反汇编程序
FC00 75 89 02 MOV TMOD,#02H ;T1工作模式2,定时器
FC03 75 C8 30 MOV T2CON,#30H ;T2工作为串行口波特
;率发生器
FC06 E4 CLR A
FC07 F5 CD MOV TH2,A
FC09 F5 CC MOV TL2,A ;T2=0000H
FC0B 30 B0 FD JNB P3.0,$ ;若P3.0=0,则等待,
;直到其变为1
FC0E 20 B0 FD JB P3.0,$ ;若P3.0=1,则等待,
;直到下降沿到来
FC11 D2 CA SETB TR2 ;启动T2定时器
FC13 30 B0 FD JNB P3.0,$ ;若P3.0=0,则等待,
;直到上升沿到来
FC16 C2 CA CLR TR2 ;关闭T2定时器,此时
;T2中的数值为tp

    首先将T2清0,然后测下降沿,测到下降沿后,开始置TR2=1,T2开始计数,等测到上升沿后,置TR2=0,停止计数,则此时T2中为传送 1bit(低电平)的计数值。以波特率2400 bps为例,则传送1bit所用的时间为1/2400 s,即416.67μs。P89C51RD2主频为11.0592 MHz,再由PHILIPS公司的数据手册可知,当T2工作于波特率发生器模式时,OSC未经分频直接进入T2计数器,由此可得在tp时间内T2的理论计数值为:(T2)=0.000 416 67×110 592 00= 4608(十进制)=1200H。在这里,特别要强调的是:该数只是一个理论值。对波特率为2400 bps时的实际值进行测试,发现实测值为11FAH左右。不管怎样测,实测值总是小于理论值6个数左右。这个数据为下面的波特率计算提供了重要依据。

    3.1.3 波特率的计算

    程序中对波特率的计算颇有特色,下面是地址FC18H~FC36H之间的源代码和反汇编程序:

    源代码 反汇编程序
FC18 E5 CC MOV A,TL2
FC1A C4 SWAP A
FC1B 54 0F ANL A,#0FH ;取TL2高4位
FC1D F8 MOV R0,A
FC1E E5 CD MOV A,TH2
FC20 C4 SWAP A
FC21 54 F0 ANL A,#0F0H;取TH2低4位
FC23 48 ORL A,R0
FC24 F8 MOV R0,A ;组合后送入R0
FC25 E5 CD MOV A,TH2
FC27 C4 SWAP A
FC28 54 0F ANL A,#0FH ;取TH2高4位
FC2A F9 MOV R1,A
FC2B E8 MOV A,R0 ;以上程序实现T2中数据除以
;16,送R1和R0保存
FC2C F4 CPL A ;低位取反
FC2D F5 CC MOV TL2,A
FC2F F5 CA MOV RCAP2L,A
FC31 E9 MOV A,R1
FC32 F4 CPL A ;高位取反
FC33 F5 CD MOV TH2,A
FC35 F5 CB MOV RCAP2H,A

[1] [2]  下一页


本文关键字:暂无联系方式综合-其它单片机-工控设备 - 综合-其它