P89C51RD2的Boot ROM與ISP功能的實(shí)現(xiàn)
1 概 述
本文引用地址:http://www.ex-cimer.com/article/171672.htmP89C51RD2是PHILIPS公司內(nèi)核基于8位80C51單片機(jī)的派生產(chǎn)品,在完全保留80C51指令系統(tǒng)和硬件結(jié)構(gòu)的大框架下,進(jìn)行了多方面的加強(qiáng)、擴(kuò)展和創(chuàng)新,最大限度地利用了原有結(jié)構(gòu)的方方面面。P89C51RD2將原有的對(duì)外數(shù)據(jù)和程序存儲(chǔ)器的 16位尋址機(jī)制加以利用,把片上的RAM擴(kuò)展到1KB、片上的FLASH EPROM擴(kuò)展到64KB,滿足當(dāng)今用嵌入式高級(jí)語(yǔ)言對(duì)片上大存儲(chǔ)容量的需要。
P89C51RD2最顯著的特點(diǎn)莫過(guò)于其ISP(In-System Programming,在系統(tǒng)可編程)功能和IAP(In-Application Programming,在應(yīng)用可編程)功能。ISP指電路板上的空白器件可以編程寫(xiě)入最終用戶代碼,而不需要從電路板上取下器件,已經(jīng)編程的器件也可以用ISP方式擦除或再編程。IAP指MCU可以在系統(tǒng)中獲取新代碼并對(duì)自己重新編程,即可用程序來(lái)改變程序。ISP和IAP技術(shù)是未來(lái)儀器儀表的發(fā)展方向。PHILIPS公司為了使ISP技術(shù)和IAP技術(shù)得以推廣,在芯片上免費(fèi)提供了Boot ROM固件,并且巧妙地解決了固件和FLASH的地址覆蓋問(wèn)題及一些具體實(shí)現(xiàn)細(xì)節(jié)問(wèn)題,使它們的實(shí)現(xiàn)變得簡(jiǎn)單而現(xiàn)成。
對(duì)于Boot ROM中的內(nèi)容,PHILIPS公司是不公開(kāi)的。但很多技術(shù)人員對(duì)于Boot ROM固件中ISP(IAP)功能的實(shí)現(xiàn)非常感興趣。就ISP狀態(tài)而言,上位機(jī)直接跟Boot ROM固件中的程序打交道,因此,必須根據(jù)PHILIPS公司提供的流程和協(xié)議來(lái)編制上位機(jī)程序,至于Boot ROM內(nèi)部是如何實(shí)現(xiàn)ISP功能的,則不得而知。如果能夠搞明白ISP功能實(shí)現(xiàn)的具體方法,則對(duì)于上位機(jī)軟件的編制是大有好處的。以下是對(duì)Boot ROM中有關(guān)ISP功能實(shí)現(xiàn)所作的一些初步探討。
2 Boot ROM固件代碼的讀出方法
要對(duì)其 ISP功能進(jìn)行分析,必須讀出Boot ROM中的源代碼。為此,必須弄清楚Boot ROM空間和FLASH空間的關(guān)系。P89C51RD2采用了最先進(jìn)的FLASH(快閃)EPROM,其容量為64KB,并且分成8KB和16KB的存儲(chǔ)塊。我們知道,80C51系列8位單片機(jī)的最大尋址能力就是64KB,F(xiàn)LASH EPROM已經(jīng)將全部尋址空間占據(jù)。同時(shí),PHILIPS公司為P89C51RD2在片內(nèi)提供了一個(gè)名叫引導(dǎo)ROM(Boot ROM)的1KB的固件。固件上有引導(dǎo)裝載程序,可以接收主機(jī)經(jīng)串口傳來(lái)的命令和數(shù)據(jù)(如經(jīng)PC機(jī)的RS-232C口),這個(gè)固件是放在64KB程序存儲(chǔ)器的最高端的,與片內(nèi)FLASH地址0FC00H~0FFFFH相覆蓋。兩者之間的切換是通過(guò)特殊功能寄存器AUXR1的ENBOOT位來(lái)進(jìn)行的。
ENBOOT=1 地址在0FC00H~0FFFFH范圍,尋址到固件
ENBOOT=0 地址在0FC00H~0FFFFH范圍,尋址到FLASH
既然當(dāng)ENBOOT=1時(shí),能夠?qū)ぶ返焦碳?,則利用程序就可以將固件代碼讀出。下面是實(shí)現(xiàn)代碼讀出時(shí)的硬件部分和軟件部分。
(1)硬件部分
為了讀出Boot ROM中的內(nèi)容,必須給P89C51RD2搭一個(gè)包括復(fù)位、晶振和串口通信功能的基本硬件系統(tǒng),如圖1所示。ICL232為單電源串口轉(zhuǎn)換芯片,可以完成TTL電平與RS-232C電平之間的轉(zhuǎn)換。
(2)軟件編制
編制軟件的目的,是為了從Boot ROM中讀出源代碼,并送往上位機(jī)顯示。為了使用現(xiàn)成的軟件(如超級(jí)終端),程序中將讀出的二進(jìn)制代碼轉(zhuǎn)換成ASCII碼,并組成HEX文件格式直接傳給上位機(jī),這樣,將顯示的內(nèi)容存盤(pán)并反匯編,就可以對(duì)Boot ROM中的內(nèi)容進(jìn)行分析。由于程序中涉及到二進(jìn)制轉(zhuǎn)換成HEX文件格式,故將有關(guān)HEX文件格式的有關(guān)內(nèi)容表述如下:
HEX文件的INTEL格式,是INTEL公司提出的按地址排列的數(shù)據(jù)信息,數(shù)據(jù)寬度為字節(jié),所有數(shù)據(jù)使用十六進(jìn)制數(shù)字表示,如Boot ROM從地址FC00H開(kāi)始的前16個(gè)數(shù)據(jù)為(已經(jīng)轉(zhuǎn)換成ASCII碼):
75 89 02 75 C8 30 E4 F5 CD F5 CC 30 B0 FD 20 B0(十六進(jìn)制)
則轉(zhuǎn)換成HEX文件格式為:
:10FC000075890275C830E4F5CDF5CC30B0FD20B073
:符號(hào)表明記錄的開(kāi)始;后面的2個(gè)字符表明記錄的長(zhǎng)度,這里是10H,即16個(gè)十六進(jìn)制數(shù)字;后面的4個(gè)字符給出調(diào)入的地址,這里是FC00H;再后面的2個(gè)字符表明記錄的類(lèi)型,00表示數(shù)據(jù)記錄,01表示記錄文件結(jié)束;再后面的16個(gè)數(shù)據(jù)即為真正的數(shù)據(jù)記錄;最后的2位73是校驗(yàn)和,它加上前面所有的數(shù)據(jù)和為0。
所有HEX格式文件的最后一行為結(jié)尾行,它比較特殊,總是如下所示:
:00000001FF
讀Boot ROM代碼的主程序編制如下:
AUXR1 EQU 0A2H ;特殊功能寄存器
BOOT_ROM EQU 0FC00H ;Boot ROM的起始地址
DAT_BUFFER EQU 30H ;數(shù)據(jù)暫存器
DAT_SUM EQU 31H ;校驗(yàn)和
ORG 0000H
AJMP START
ORG 0030H
START:
MOV SP,#50H
MOV SCON,#50H
MOV T2CON,#30H ;以T2作為波特率發(fā)生器
MOV TL2,#0E0H ;波特率為2400 bps
MOV TH2,#0FEH
MOV RCAP2L,#0E0H
MOV RCAP2H,#0FEH
SETB TR2 ;啟動(dòng)T2
MAIN: LCALL READ_ROM ;Boot ROM內(nèi)容讀出子程序
LCALL SEND_END ;結(jié)尾行送出子程序
AJMP $
主程序中用到了兩個(gè)子程序:READ_ROM和SEND_END。
READ_ROM子程序功能:從FC00H開(kāi)始將代碼讀出,將其轉(zhuǎn)變成ASCII碼并拼湊成HEX文件記錄的形式傳給上位機(jī)。
讀Boot ROM代碼所調(diào)用的子程序見(jiàn)本刊網(wǎng)站發(fā)表的全文。
3 Boot ROM固件的功能分析
通過(guò)對(duì)Boot ROM中的程序進(jìn)行分析,可以對(duì)ISP的有關(guān)指令進(jìn)行更深入的理解,在一些編程方法上也可以向國(guó)外學(xué)習(xí)。下面對(duì)ISP的有關(guān)知識(shí)點(diǎn)進(jìn)行闡述。
3.1 關(guān)于自動(dòng)確定波特率
PHILIPS給出的ISP功能的第一個(gè)步驟為:上位機(jī)向下位機(jī)發(fā)送一個(gè)大寫(xiě)的英文字符U,供下位機(jī)確定波特率。
3.1.1 工作原理
大寫(xiě)的英文字符U有它的特殊性,它的ASCII碼為55H,轉(zhuǎn)換成二進(jìn)制為01010101B,也就是說(shuō)它是一個(gè)0、1相間的數(shù)據(jù),如圖2所示。如果能夠算出其一個(gè)位的傳輸時(shí)間tp,則對(duì)應(yīng)的波特率就可以計(jì)算出來(lái)。
評(píng)論