打印
[ZLG-MCU]

P89C669 IAP的实现

[复制链接]
1994|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hawktca|  楼主 | 2007-7-6 18:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
TE, ov, AD, se, BLE
嵌入的IAP汇编代码如下:
$MOD_MX51

NAME    IAP

?PR?_EraseBootLoader?IAP                 SEGMENT ECODE INSEG 
?DT?_EraseBootLoader?IAP                 SEGMENT DATA OVERLAYABLE
?PR?_WriteBootLoader?IAP                 SEGMENT ECODE INSEG 
?DT?_WriteBootLoader?IAP                 SEGMENT DATA OVERLAYABLE
?PR?_ReadBootLoader?IAP                  SEGMENT ECODE INSEG 
?DT?_ReadBootLoader?IAP                  SEGMENT DATA OVERLAYABLE
?PR?_DelFlashByte?IAP                    SEGMENT ECODE INSEG 
?DT?_DelFlashByte?IAP                    SEGMENT DATA OVERLAYABLE
?PR?_WriteFlashByte?IAP                  SEGMENT ECODE INSEG 
?DT?_WriteFlashByte?IAP                  SEGMENT DATA OVERLAYABLE
?PR?_ReadFlashByte?IAP                   SEGMENT ECODE INSEG 
?DT?_ReadFlashByte?IAP                   SEGMENT DATA OVERLAYABLE

    PUBLIC    _ReadFlashByte
    PUBLIC    _WriteFlashByte
    PUBLIC    _DelFlashByte
    PUBLIC    _ReadBootLoader
    PUBLIC    _WriteBootLoader
    PUBLIC    _EraseBootLoader

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    DPH    DATA 083H 
    DPL    DATA 082H 
    AUXR1  DATA 0A2H 
    EA     BIT  0AFH 
    CMOD   DATA 0D9H 
    ACC    DATA 0E0H 
    IE     DATA 0A8H 
    ESFR EPL = 01FCH;
      ESFR EPM = 01FDH;
      ESFR EPH = 01FEH;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
XTAL_MHZ        EQU     11            ; Chip runs at 11.0592MHz,no use ?
PGM_MTP         EQU     00FFF0H        ; PGM-MTP routine enrty  
WriteDatByte    EQU     02H           ; program data byte ,function code
ReadDatByte     EQU     03H           ; read device data of pointed address,function code
EraseBlock      EQU     0CH           ; erase one of 11 blocks,function code
EraseBL         EQU     04H          ; erase status or boot vector,function code
ProgramBL       EQU     06H          ; program status byte or boot vector,function code
FetchBL         EQU    07H           ; read status or boot vector,function code    
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

; #define uINT8  unsigned char 
; #define uINT16 unsigned int  
; /***************************************************
; **** unsigned char EraseBootLoader(uINT8 nDatAll);
; **** unsigned char DelFlashByte(uINT8 BlockHi, uINT8 FlashBlock); 
; **** unsigned char WriteFlashByte(uINT8 FlashData, uINT16 FlashAddress); 
; **** unsigned char ReadFlashByte(uINT16 FlashAddress); 
; **** unsigned char WriteBootLoader(uINT8 nBL,uINT8 nDat);  //nBL={0---StatusByte,1-----BootVectorMiddle,2----BootVectorHigh}
; ****                               //R7----uBL;R5------nDat    
; **** unsigned char ReadBootLoader(uINT8 nBL);           //nBL={0---SecERETByte,1-----StatusByte,2-----BootVector}
; ****                                //nBL=0/1/2/3/4/5
; *****************************************************************/                                                             
; void WaiteHere(uINT16 Delayus);

; /****************************************************************
; *FUNCTION DESCRIBATION:
; * uINT8 nDatAll: dump variable
; *
; *
; *
; *
; ****************************************************************/
; uINT8 EraseBootLoader(uINT8 nDatAll)

    RSEG  ?PR?_EraseBootLoader?IAP
_EraseBootLoader:
    USING    0
    PUSH    IE
    CLR     EA;  //disable interrupt          
    MOV     A,CMOD 
    MOV     R2,A ; store copy of CMOD 
    JNB     ACC.6,?IAPTAG0 ; if watchdog enabled then disable 
    ANL     CMOD,#0BFH 
    ?IAPTAG0:
    ORL     AUXR1,#020H ; enable bootrom 
    MOV     R0,XTAL_MHZ ; osc frequency 11.0592MHz 
    MOV     R1,EraseBL ; function code    
        ECALL   PGM_MTP 
    ;ECALL    L?0014      ;  WaiteHere(20);
    MOV     R7,ACC      ;
    ANL     AUXR1,#0DFH ;disable boot-rom function
    MOV     CMOD,R2;    ;recover COMD register
    SETB    EA;        ; enable interrupt 
    POP     IE; 
    ERET     
; END OF _EraseBootLoader

; /****************************************************************
; *FUNCTION DESCRIBATION:  WriteBootLoader
; * uINT8 nBL :
; * uINT8 nDat:
; *
; *
; *
; ****************************************************************/
; uINT8 WriteBootLoader(uINT8 nBL,uINT8 nDat)

    RSEG  ?PR?_WriteBootLoader?IAP
_WriteBootLoader:
    USING    0      
    PUSH    IE
    CLR     EA;  //disable interrupt          
    MOV     A,CMOD 
    MOV     R2,A ; store copy of CMOD 
    JNB     ACC.6,?IAPTAG1 ; if watchdog enabled then disable 
    ANL     CMOD,#0BFH 
    ?IAPTAG1:
    ORL     AUXR1,#020H ; enable bootrom 
    MOV     R0,XTAL_MHZ ; osc frequency 11.0592MHz 
    MOV     R1,ProgramBL ; function code
        MOV     EPL, R7; which cell to be written
    MOV     ACC, R5; data to be written
        ECALL   PGM_MTP;   
    ;ECALL    L?0014      ; waite here for ready
    MOV     R7,ACC; copy Flag of operation
    ANL     AUXR1,#0DFH ;disable boot-rom function
    MOV     CMOD,R2     ; recover COMD
    SETB    EA;        ; enable interrupt 
    POP     IE
    ERET     
; END OF _WriteBootLoader

; /****************************************************************
; *FUNCTION DESCRIBATION:  ReadBootLoader
; * uINT8 nBL:
; *
; *
; *
; *
; ****************************************************************/
; uINT8 ReadBootLoader(uINT8 nBL)

    RSEG  ?PR?_ReadBootLoader?IAP
_ReadBootLoader:
    USING    0
    PUSH    IE
    CLR     EA;  //disable interrupt          
    MOV     A,CMOD 
    MOV     R2,A ; store copy of CMOD 
    JNB     ACC.6,?IAPTAG2 ; if watchdog enabled then disable 
    ANL     CMOD,#0BFH 
    ?IAPTAG2:
    ORL     AUXR1,#020H ; enable bootrom 
    MOV     R0,XTAL_MHZ ; osc frequency 11.0592MHz 
    MOV     R1,FetchBL  ; function code
    MOV     EPL, R7     ;
        ECALL   PGM_MTP     ;             
    ;ECALL    L?0014      ; waite for end of operation
        MOV     R7,ACC;
    ANL     AUXR1,#0DFH ;disable boot-rom function
    MOV     CMOD,R2     ; recover COMD
    SETB    EA;        ; enable interrupt 
    POP     IE
    ERET     
; END OF _ReadBootLoader

; /****************************************************************
; *FUNCTION DESCRIBATION:  DelFlashByte
; * uINT16 FlashBlock:
; *
; *
; *
; *
; ****************************************************************/
; uINT8 DelFlashByte(uINT8 BlockHi, uINT8 FlashBlock)

    RSEG  ?PR?_DelFlashByte?IAP
_DelFlashByte:
    USING    0
    PUSH    IE
    CLR     EA;  //disable interrupt          
    MOV     A,CMOD 
    MOV     R2,A ; store copy of CMOD 
    JNB     ACC.6,?IAPTAG3 ; if watchdog enabled then disable 
    ANL     CMOD,#0BFH 
    ?IAPTAG3:
    ORL     AUXR1,#020H ; enable bootrom 
    MOV     R0,XTAL_MHZ ; osc frequency 11.0592MHz 
    MOV     R1,EraseBlock  ; function code
    MOV     EPH, R7;
    MOV     EPM, R5;
        ECALL   PGM_MTP     ;                 
    ;;;;;;;;;;;;;;;;;;Delay here for about 1 second
    ;
    ;;;;;;;;;End of waiting here ;;;;;;;;;;;;;;;;;;
    MOV      R7,ACC;
    ANL     AUXR1,#0DFH ;disable boot-rom function
    MOV     CMOD,R2     ; recover COMD
    SETB    EA;        ; enable interrupt 
    POP     IE
    ERET     
; END OF _DelFlashByte

; /****************************************************************
; *FUNCTION DESCRIBATION:  DelFlashByte
; * uINT16 FlashBlock:
; *
; *
; *
; *
; ****************************************************************/
; uINT8 WriteFlashByte(uINT8 FlashData, uINT16 FlashAddress)

    RSEG  ?PR?_WriteFlashByte?IAP
_WriteFlashByte:
    USING    0
    PUSH    IE
    CLR     EA;  //disable interrupt          
    MOV     A,CMOD 
    MOV     R2,A ; store copy of CMOD 
    JNB     ACC.6,?IAPTAG4 ; if watchdog enabled then disable 
    ANL     CMOD,#0BFH 
    ?IAPTAG4:
    ORL     AUXR1,#020H ; enable bootrom 
    MOV     R0,XTAL_MHZ ; osc frequency 11.0592MHz 
    MOV     R1,WriteDatByte  ; function code    
    MOV     ACC, R7         ;data to be written 
      MOV    EPH,#00  ;
    MOV     EPM,R4   ;
    MOV     EPL,R5   ;which cell to be written
    ECALL   PGM_MTP  ; 
    ;ECALL    L?0014   ; waite for ready
        MOV     R7,ACC     ; 
    ANL     AUXR1,#0DFH ;disable boot-rom function
    MOV     CMOD,R2     ; recover COMD
    SETB    EA;        ; enable interrupt 
    POP     IE
    ERET     
; END OF _WriteFlashByte

; /****************************************************************
; *FUNCTION DESCRIBATION:  ReadFlashByte
; * uINT16 FlashAddress:
; *
; *
; *
; *
; ****************************************************************/
; uINT8 ReadFlashByte(uINT16 FlashAddress)

    RSEG  ?PR?_ReadFlashByte?IAP
_ReadFlashByte:
    USING    0
    PUSH    IE
    CLR     EA;  //disable interrupt          
    MOV     A,CMOD 
    MOV     R2,A ; store copy of CMOD 
    JNB     ACC.6,?IAPTAG5 ; if watchdog enabled then disable 
    ANL     CMOD,#0BFH 
    ?IAPTAG5:
    ORL     AUXR1,#020H ; enable bootrom 
    MOV     R0,XTAL_MHZ ; osc frequency 11.0592MHz 
    MOV     R1,ReadDatByte ; function code    
    MOV     EPH,#00
    MOV     EPM,R6;
    MOV     EPL,R7;
    ECALL   PGM_MTP  ; 
    ;ECALL    L?0014   ; waite for ready
    MOV     R7,ACC;
    ANL     AUXR1,#0DFH ;disable boot-rom function
    MOV     CMOD,R2     ; recover COMD
    SETB    EA;        ; enable interrupt 
    POP     IE;
    ERET     
; END OF _ReadFlashByte

; /****************************************************************
; *FUNCTION DESCRIBATION:  WaiteHere
; * uINT16 Delayus:
; *
; *
; *
; *
; ****************************************************************/
; void WaiteHere(uINT16 Delayus)


    END

相关帖子

沙发
chirk| | 2007-7-10 13:54 | 只看该作者

调试通过了吗?

使用特权

评论回复
板凳
mcu123ad| | 2007-7-10 15:31 | 只看该作者

顶一下...看了眼花了.

使用特权

评论回复
地板
hawktca|  楼主 | 2007-7-10 22:37 | 只看该作者

Flash读写通过

如题,Flash的读写测试通过.如果只用到了64K的空间则在以上汇编接口代码中将ECALL/ERET分别修改伟LCALL与RET.
不过我现在遇到新问题:如何实现在将一部分功能代码制定分配到指定地址段中?比如我希望我的Boot代码位于0xC000以上的地址处,如何在Keil C开环境中设置.
如果简单修改startup文件中的起始地址和目标文件选项中中断矢量偏移地址好像不行,编译厚的代码不能在目标板上运行.

急盼,高手指导!!
谢谢!!!!
1

使用特权

评论回复
5
zlgmcu| | 2007-7-11 10:07 | 只看该作者

re

keil/help 目录中,有c51.pdf, a51.pdf
就各个程序段,或者各个文件的定位问题有详细描述,
推荐欣赏.

使用特权

评论回复
6
hawktca|  楼主 | 2007-7-19 14:07 | 只看该作者

IAP已经通过

如题,我已经调测通过IAP功能。思路如下:
在用户代码运行中如果遇到IAP请求,则设置statusByte以及BootVector,然后使系统远程复位,系统再次重启后进入IAP代码部分。在该部分根据用户下载的烧写文件将从0x0000开始的位置开始写入,完成后再次修改状态字和引导矢量字,再次重启。系统自动开始运行升级后的程序。
我随后有尝试将IAP代码写入到64K空间以上的部分,但是没有成功。主要的问题还是代码定位的实现?C51、A51的手册中对此没有详细的说明。再摸索看看。
不过我觉得这种方法试验还行实用的话可能需要改进,比如一旦下载失败后则MCU陷入到错误码中不能回复到IAP状态或者将原先代码恢复,各位大侠有无高招?

使用特权

评论回复
7
mn14174| | 2008-5-11 17:56 | 只看该作者

IAP还有问题就是下载的源代码格式,不能是HEX格式的

我也在做IAP,程序一个月前写好的,发现iap能够下载HEX,中间没有任何转换,直接使用超级终端下载的,但是,在lpc芯片FLASH中表现的就是ASCII码,是纯字符,而不是能被运行的机器代码,后来看了这个论坛的一些评论IAP的,说是把HEX转成BIN文件再下载,这样也不行!
最后终于发现,可以用ADS1.2在线调试的ADX软件,可以IAP flash 不过这个不是使用IAP功能IAP hex的,所以IAP还是不成功,希望有成功人士给个明确的正确的方法,IAP 通过超级终端等串口工具直接下载的源代码是什么格式的才行呢?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

18

帖子

1

粉丝