P89C51RD2的Boot ROM与ISP功能的实现
并且这两个字符之间必须隔一段时间,以便于波特率计算完毕并有效。所以,有关手册中关于ISP第一步要发送一个U来确定波特率的说法本身没有错,但如果在编制上位机程序时,仅仅发送一个U是不能够通信成功的,特提醒读者注意。
3.2 命令字的接收
在通信成功后,就可以接收ISP的命令字了。
3.2.1 ISP命令格式说明
ISP编程由Boot ROM中的一系列引导子程序完成。这些子程序采用Intel-Hex记录格式接收PC主机的命令和数据。Intel-Hex记录格式上面已经有所介绍,其命令格式为
:NNAAAARRDD…DDCCcrlf>
其中,: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:该地址解释并执行命令字。
对上段程序分析如下:首先,将校验和单元清零,开始接收第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中反汇编得来的,并且大部分是连续的。这一点可以从地址分布上看出来,读者可以将其合并在一起看,相信可以加强理解。有兴趣的读者也可以参照以上给出的方法将全部代码读出,电路图和源程序几乎都不必重编了。
②
功能 实现 ISP ROM Boot P89C51RD2 相关文章:
- 基于DSP数字多功能板的实现(09-08)
- 基于DSP2407的多功能电源控制系统设计(09-08)
- DVR操作系统分析(07-23)
- 基于PROTEUS技术的ARM7显示系统设计与仿真实现(11-22)
- 一种大型软件测试方法(08-01)
- 嵌入式软件三大潜在问题及其测试技术(01-13)