嵌入的IAP汇编代码如下:<br />$MOD_MX51<br /><br />NAME IAP<br /><br />?PR?_EraseBootLoader?IAP SEGMENT ECODE INSEG <br />?DT?_EraseBootLoader?IAP SEGMENT DATA OVERLAYABLE<br />?PR?_WriteBootLoader?IAP SEGMENT ECODE INSEG <br />?DT?_WriteBootLoader?IAP SEGMENT DATA OVERLAYABLE<br />?PR?_ReadBootLoader?IAP SEGMENT ECODE INSEG <br />?DT?_ReadBootLoader?IAP SEGMENT DATA OVERLAYABLE<br />?PR?_DelFlashByte?IAP SEGMENT ECODE INSEG <br />?DT?_DelFlashByte?IAP SEGMENT DATA OVERLAYABLE<br />?PR?_WriteFlashByte?IAP SEGMENT ECODE INSEG <br />?DT?_WriteFlashByte?IAP SEGMENT DATA OVERLAYABLE<br />?PR?_ReadFlashByte?IAP SEGMENT ECODE INSEG <br />?DT?_ReadFlashByte?IAP SEGMENT DATA OVERLAYABLE<br /><br /> PUBLIC _ReadFlashByte<br /> PUBLIC _WriteFlashByte<br /> PUBLIC _DelFlashByte<br /> PUBLIC _ReadBootLoader<br /> PUBLIC _WriteBootLoader<br /> PUBLIC _EraseBootLoader<br /><br />;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;<br /> DPH DATA 083H <br /> DPL DATA 082H <br /> AUXR1 DATA 0A2H <br /> EA BIT 0AFH <br /> CMOD DATA 0D9H <br /> ACC DATA 0E0H <br /> IE DATA 0A8H <br /> ESFR EPL = 01FCH;<br /> ESFR EPM = 01FDH;<br /> ESFR EPH = 01FEH;<br />;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;<br /><br />;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;<br />XTAL_MHZ EQU 11 ; Chip runs at 11.0592MHz,no use ?<br />PGM_MTP EQU 00FFF0H ; PGM-MTP routine enrty <br />WriteDatByte EQU 02H ; program data byte ,function code<br />ReadDatByte EQU 03H ; read device data of pointed address,function code<br />EraseBlock EQU 0CH ; erase one of 11 blocks,function code<br />EraseBL EQU 04H ; erase status or boot vector,function code<br />ProgramBL EQU 06H ; program status byte or boot vector,function code<br />FetchBL EQU 07H ; read status or boot vector,function code <br />;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;<br /><br />; #define uINT8 unsigned char <br />; #define uINT16 unsigned int <br />; /***************************************************<br />; **** unsigned char EraseBootLoader(uINT8 nDatAll);<br />; **** unsigned char DelFlashByte(uINT8 BlockHi, uINT8 FlashBlock); <br />; **** unsigned char WriteFlashByte(uINT8 FlashData, uINT16 FlashAddress); <br />; **** unsigned char ReadFlashByte(uINT16 FlashAddress); <br />; **** unsigned char WriteBootLoader(uINT8 nBL,uINT8 nDat); //nBL={0---StatusByte,1-----BootVectorMiddle,2----BootVectorHigh}<br />; **** //R7----uBL;R5------nDat <br />; **** unsigned char ReadBootLoader(uINT8 nBL); //nBL={0---SecERETByte,1-----StatusByte,2-----BootVector}<br />; **** //nBL=0/1/2/3/4/5<br />; *****************************************************************/ <br />; void WaiteHere(uINT16 Delayus);<br />; <br />; /****************************************************************<br />; *FUNCTION DESCRIBATION:<br />; * uINT8 nDatAll: dump variable<br />; *<br />; *<br />; *<br />; *<br />; ****************************************************************/<br />; uINT8 EraseBootLoader(uINT8 nDatAll)<br /><br /> RSEG ?PR?_EraseBootLoader?IAP<br />_EraseBootLoader:<br /> USING 0<br /> PUSH IE<br /> CLR EA; //disable interrupt <br /> MOV A,CMOD <br /> MOV R2,A ; store copy of CMOD <br /> JNB ACC.6,?IAPTAG0 ; if watchdog enabled then disable <br /> ANL CMOD,#0BFH <br /> ?IAPTAG0:<br /> ORL AUXR1,#020H ; enable bootrom <br /> MOV R0,XTAL_MHZ ; osc frequency 11.0592MHz <br /> MOV R1,EraseBL ; function code <br /> ECALL PGM_MTP <br /> ;ECALL L?0014 ; WaiteHere(20);<br /> MOV R7,ACC ;<br /> ANL AUXR1,#0DFH ;disable boot-rom function<br /> MOV CMOD,R2; ;recover COMD register<br /> SETB EA; ; enable interrupt <br /> POP IE; <br /> ERET <br />; END OF _EraseBootLoader<br /><br />; /****************************************************************<br />; *FUNCTION DESCRIBATION: WriteBootLoader<br />; * uINT8 nBL :<br />; * uINT8 nDat:<br />; *<br />; *<br />; *<br />; ****************************************************************/<br />; uINT8 WriteBootLoader(uINT8 nBL,uINT8 nDat)<br /><br /> RSEG ?PR?_WriteBootLoader?IAP<br />_WriteBootLoader:<br /> USING 0 <br /> PUSH IE<br /> CLR EA; //disable interrupt <br /> MOV A,CMOD <br /> MOV R2,A ; store copy of CMOD <br /> JNB ACC.6,?IAPTAG1 ; if watchdog enabled then disable <br /> ANL CMOD,#0BFH <br /> ?IAPTAG1:<br /> ORL AUXR1,#020H ; enable bootrom <br /> MOV R0,XTAL_MHZ ; osc frequency 11.0592MHz <br /> MOV R1,ProgramBL ; function code<br /> MOV EPL, R7; which cell to be written<br /> MOV ACC, R5; data to be written<br /> ECALL PGM_MTP; <br /> ;ECALL L?0014 ; waite here for ready<br /> MOV R7,ACC; copy Flag of operation<br /> ANL AUXR1,#0DFH ;disable boot-rom function<br /> MOV CMOD,R2 ; recover COMD<br /> SETB EA; ; enable interrupt <br /> POP IE<br /> ERET <br />; END OF _WriteBootLoader<br /><br />; /****************************************************************<br />; *FUNCTION DESCRIBATION: ReadBootLoader<br />; * uINT8 nBL:<br />; *<br />; *<br />; *<br />; *<br />; ****************************************************************/<br />; uINT8 ReadBootLoader(uINT8 nBL)<br /><br /> RSEG ?PR?_ReadBootLoader?IAP<br />_ReadBootLoader:<br /> USING 0<br /> PUSH IE<br /> CLR EA; //disable interrupt <br /> MOV A,CMOD <br /> MOV R2,A ; store copy of CMOD <br /> JNB ACC.6,?IAPTAG2 ; if watchdog enabled then disable <br /> ANL CMOD,#0BFH <br /> ?IAPTAG2:<br /> ORL AUXR1,#020H ; enable bootrom <br /> MOV R0,XTAL_MHZ ; osc frequency 11.0592MHz <br /> MOV R1,FetchBL ; function code<br /> MOV EPL, R7 ;<br /> ECALL PGM_MTP ; <br /> ;ECALL L?0014 ; waite for end of operation<br /> MOV R7,ACC;<br /> ANL AUXR1,#0DFH ;disable boot-rom function<br /> MOV CMOD,R2 ; recover COMD<br /> SETB EA; ; enable interrupt <br /> POP IE<br /> ERET <br />; END OF _ReadBootLoader<br /><br />; /****************************************************************<br />; *FUNCTION DESCRIBATION: DelFlashByte<br />; * uINT16 FlashBlock:<br />; *<br />; *<br />; *<br />; *<br />; ****************************************************************/<br />; uINT8 DelFlashByte(uINT8 BlockHi, uINT8 FlashBlock)<br /><br /> RSEG ?PR?_DelFlashByte?IAP<br />_DelFlashByte:<br /> USING 0<br /> PUSH IE<br /> CLR EA; //disable interrupt <br /> MOV A,CMOD <br /> MOV R2,A ; store copy of CMOD <br /> JNB ACC.6,?IAPTAG3 ; if watchdog enabled then disable <br /> ANL CMOD,#0BFH <br /> ?IAPTAG3:<br /> ORL AUXR1,#020H ; enable bootrom <br /> MOV R0,XTAL_MHZ ; osc frequency 11.0592MHz <br /> MOV R1,EraseBlock ; function code<br /> MOV EPH, R7;<br /> MOV EPM, R5;<br /> ECALL PGM_MTP ; <br /> ;;;;;;;;;;;;;;;;;;Delay here for about 1 second<br /> ;<br /> ;;;;;;;;;End of waiting here ;;;;;;;;;;;;;;;;;;<br /> MOV R7,ACC;<br /> ANL AUXR1,#0DFH ;disable boot-rom function<br /> MOV CMOD,R2 ; recover COMD<br /> SETB EA; ; enable interrupt <br /> POP IE<br /> ERET <br />; END OF _DelFlashByte<br /><br />; /****************************************************************<br />; *FUNCTION DESCRIBATION: DelFlashByte<br />; * uINT16 FlashBlock:<br />; *<br />; *<br />; *<br />; *<br />; ****************************************************************/<br />; uINT8 WriteFlashByte(uINT8 FlashData, uINT16 FlashAddress)<br /><br /> RSEG ?PR?_WriteFlashByte?IAP<br />_WriteFlashByte:<br /> USING 0<br /> PUSH IE<br /> CLR EA; //disable interrupt <br /> MOV A,CMOD <br /> MOV R2,A ; store copy of CMOD <br /> JNB ACC.6,?IAPTAG4 ; if watchdog enabled then disable <br /> ANL CMOD,#0BFH <br /> ?IAPTAG4:<br /> ORL AUXR1,#020H ; enable bootrom <br /> MOV R0,XTAL_MHZ ; osc frequency 11.0592MHz <br /> MOV R1,WriteDatByte ; function code <br /> MOV ACC, R7 ;data to be written <br /> MOV EPH,#00 ;<br /> MOV EPM,R4 ;<br /> MOV EPL,R5 ;which cell to be written<br /> ECALL PGM_MTP ; <br /> ;ECALL L?0014 ; waite for ready<br /> MOV R7,ACC ; <br /> ANL AUXR1,#0DFH ;disable boot-rom function<br /> MOV CMOD,R2 ; recover COMD<br /> SETB EA; ; enable interrupt <br /> POP IE<br /> ERET <br />; END OF _WriteFlashByte<br /><br />; /****************************************************************<br />; *FUNCTION DESCRIBATION: ReadFlashByte<br />; * uINT16 FlashAddress:<br />; *<br />; *<br />; *<br />; *<br />; ****************************************************************/<br />; uINT8 ReadFlashByte(uINT16 FlashAddress)<br /><br /> RSEG ?PR?_ReadFlashByte?IAP<br />_ReadFlashByte:<br /> USING 0<br /> PUSH IE<br /> CLR EA; //disable interrupt <br /> MOV A,CMOD <br /> MOV R2,A ; store copy of CMOD <br /> JNB ACC.6,?IAPTAG5 ; if watchdog enabled then disable <br /> ANL CMOD,#0BFH <br /> ?IAPTAG5:<br /> ORL AUXR1,#020H ; enable bootrom <br /> MOV R0,XTAL_MHZ ; osc frequency 11.0592MHz <br /> MOV R1,ReadDatByte ; function code <br /> MOV EPH,#00<br /> MOV EPM,R6;<br /> MOV EPL,R7;<br /> ECALL PGM_MTP ; <br /> ;ECALL L?0014 ; waite for ready<br /> MOV R7,ACC;<br /> ANL AUXR1,#0DFH ;disable boot-rom function<br /> MOV CMOD,R2 ; recover COMD<br /> SETB EA; ; enable interrupt <br /> POP IE;<br /> ERET <br />; END OF _ReadFlashByte<br /><br />; /****************************************************************<br />; *FUNCTION DESCRIBATION: WaiteHere<br />; * uINT16 Delayus:<br />; *<br />; *<br />; *<br />; *<br />; ****************************************************************/<br />; void WaiteHere(uINT16 Delayus)<br /><br /><br /> END |
|