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

P89C51RD2的Boot ROM与ISP功能的实现

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

    上述程序就是将tp对应值转换成波特率的程序,先来看一下波特率是怎样定义的。定时器2工作在波特率发生器模式,外部时钟信号由T2脚进入,波特率为

    46.jpg

    所以程序中首先将T2中的计数值进行处理,相当于右移4位,将低4位去掉,11FAH变为011FH,对应式(1)中除以16,送R1和R0保存,然后将R1和R0中的值取反,其值为FEE0H。该值恰恰与根据式(1)计算出的数值相同。将该数值送T2和RCAP2,即得2400bps对应的赋值。

   



www.55dianzi.com

    3.1.4 波特率的校验

    在波特率确定以后,首先设定TR2=1以启动波特率,并对串口控制字进行设定。然后,程序对其进行校验。方法是接收上位机的数据并以设定波特率回送该值,一方面通知上位机送出和接收的数据是否相同,如果相同,则上位机认为下位机的波特率设置正确,通信成功;另一方面程序也将接收的数据?quot;U" 的ASCII码相对照,如果相等,则往下执行,如果不等,则继续重复上述过程,直到成功为止,否则进入死循环,只有程序复位才能退出。下面是其源程序与反汇编程序(FC37H至FC40H):

    源代码 反汇编程序
FC37 D2 CA SETB TR2
FC39 75 98 52 MOV SCON,#52H ;方式1,TI=1
FC3C 91 A0 RREV0: ACALL REV_SEND0
FC3E B4 55 FB CJNE A,#55H,RREV0 ;判断A="U"?

    其中,REV_SEND0子程序的功能是接收一个数据并回传给上位机。由上述程序可以看出,实际上要通信成功,上位机至少要向下位机发送两个"U":第一个用于确定波特率,另一个用于校验波特率,并且这两个字符之间必须隔一段时间,以便于波特率计算完毕并有效。所以,有关手册中关于ISP第一步要发送一个"U"来确定波特率的说法本身没有错,但如果在编制上位机程序时,仅仅发送一个"U"是不能够通信成功的,特提醒读者注意。

    3.2 命令字的接收

    在通信成功后,就可以接收ISP的命令字了。

    3.2.1 ISP命令格式说明

    ISP编程由Boot ROM中的一系列引导子程序完成。这些子程序采用Intel-Hex记录格式接收PC主机的命令和数据。Intel-Hex记录格式上面已经有所介绍,其命令格式为
:NNAAAARRDD…DDCC<crlf>

    其中,:NNAAAA以及DDCC的含义皆与上面论述的相同,只需对"RR"作以下说明:
"RR"表示记录类型,其中
00--数据记录,即传编程数据并完成编程;
01--文件结束标志;
02--指定振荡器频率;
03--杂项编程功能,和后面的数据相配合完成擦除、加密等功能;
04--显示指定地址端FLASH的数据或做空白检查;
05--各种读功能。

    3.2.2 命令字的处理

    为了更容易看懂,将使用的通用寄存器和部分地址进行代换如下:
DATA_ADDRL EQU 30H
DATA_ADDRH EQU 31H
DATA_SUM EQU 32H
DATA_LEN EQU 33H
DATA_FOSC EQU 34H
DATA_MODE EQU 35H
DATA_BUFFER EQU 36H
REV_DAT_ADDR EQU 80H

      下面来看一下Boot ROM中的源代码与反汇编程序。

    源程序 反汇编程序

    FC41 75 32 00 MAIN: MOV DATA_SUM,#00H;校验和
FC44 91 A0 ACALL REV_SEND0
FC46 B4 3A F8 CJNE A,#3AH,MAIN;判断A=":"?
FC49 91 79 ACALL REV_DAT1_SUM
FC4B 85 36 33 MOV DATA_LEN,DATA_BUFFER ;33H字节数
FC4E 91 79 ACALL REV_DAT1_SUM
FC50 85 36 31 MOV DATA_ADDRH,DATA_ BUFFER ;31H数据首地址高8位
FC53 91 79 ACALL REV_DAT1_SUM
FC55 85 36 30 MOV DATA_ADDRL,DATA_ BUFFER ;30H数据首地址低8位
FC58 91 79 ACALL REV_DAT1_SUM
FC5A 85 36 35 MOV DATA_MODE,DATA_ BUFFER ;35H数据操作类型
FC5D E5 33 MOV A,DATA_LEN
FC5F FA MOV R2,A ;循环接收数据指针
FC60 60 09 JZ RREV3 ;字节数=0 转RREV3
FC62 79 80 MOV R1,#REV_DAT_ADDR
FC64 91 79 RREV2: ACALL REV_DAT1_SUM
FC66 A7 36 MOV @R1,DATA_MODE
FC68 09 INC R1
FC69 DA F9 DJNZ R2,RREV2
FC6B AC 32 RREV3: MOV R4,DATA_SUM ;校验和
FC6D 91 79 ACALL REV_DAT1_SUM
FC6F EC MOV A,R4
FC70 B5 36 02 CJNE A,DATA_BUFFER,RREV4
;校验和不等转
FC73 81 BF AJMP RUN_MODE
FC75 74 58 RREV4:MOV A,#58H ; A="X"
FC77 81 FA AJMP SEND_DT

      首先,对程序中用到的子程序作如下的说明。
REV_SEND0子程序:接收1个数据并回传给上位机;
REV_DAT1_SUM子程序:接收2个ASCII字符并回传,将2个ASCII码合成1字节二进制数并计算校验和;
SEND_DT:该地址执行送字符"X"给上位机;
RUN_MODE:该地址解释并执行命令字。

    

www.55dianzi.com

    对上段程序分析如下:首先,将校验和单元清零,开始接收第1个ASCII码,并判断是否为":"。如果是,则说明是一个命令字的开始,下面便依次接收字节数DATA_LEN、数据首地址高8位DATA_ ADDRH、数据首地址低8位DATA_ADDRL和数据操作类型DATA_MODE。这跟其命令字格式是完全对应的。然后,程序根据接收数据字节数 DATA_ LEN来决定下面的数据接收,并将接收的数据存储在从80H开始的内部数据存储器中,以备下一步的处理。最后,进入校验和的接收,将程序计算所得的校验和与上位机传输的校验和作比较,如果不等,回传"X"字符,通知上位机进行异常处理;如果相等,则转入相应的命令执行。

    3.3 命令的执行

      命令解释和执行的源代码和反汇编程序如下:

    源程序 反汇编程序

    FCBF E5 35 RUN_MODE: MOV A,DATA_MODE
;35H数据操作类型
FCC1 23 RL A ;A=A*2
FCC2 90 FC C6 MOV DPTR,#BASE_ADDR ;程序散转
FCC5 73 JMP @A+DPTR
FCC6 81 D4 BASE_ADDR: AJMP PRO_DATA
;00=传送编程数据并完成编程
FCC8 81 F8 AJMP SEND_CHAR_OK
;01=传文件结束符
FCCA 81 FE AJMP SETUP_FOSC
;02=指定振荡器频率
FCCC A1 70 AJMP MPRO_DAT
;03=杂项编程功能
FCCE A1 04 AJMP READ_CHECK
;04=显示指定地址段FLASH数据或查空
FCD0 A1 9F AJMP READ_DATA
;05=各种读功能
FCD2 A1 B3 AJMP SETUP_BPS
;06=直接装载波特率

      在正确地接收命令后,通过DATA_MODE项(即命令格式中的RR)来判断功能并转入相应的程序。程序中对每一个跳转地址都作出了相应的注释。

    4 几点说明

      ① 上述带源代码的程序均是Boot ROM中反汇编得来的,并且大部分是连续的。这一点可以从地址分布上看出来,读者可以将其合并在一起看,相信可以加强理解。有兴趣的读者也可以参照以上给出的方法将全部代码读出,电路图和源程序几乎都不必重编了。

      ② Boot ROM中既包括了ISP的程序,也包括了IAP的程序。限于篇幅,只给出了ISP的部分源程序,部分子程序只作了说明而未列出源程序。

    参考文献
1 广州周立功单片机发展有限公司. P89C51Rx+/Rx2/66x系列单片机的在线编程
2 P89C51RB2/P89C51RC2/P89C51RD2 DATA SHEET. Philips SEMIconductors, 2001 Jun 27
3 何立民. MCS-51系列单片机应用系统设计. 北京:北京航空航天大学出版社,1990
 



上一页  [1] [2] 


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