?? rx2iaplib.a51
字號:
MOV R7,A ; A中返回值 -> R7
ANL AUXR1,#0DFH ; 禁止 bootrom
MOV CMOD,R2 ; 恢復(fù)CMOD(恢復(fù)看門狗狀態(tài))
POP IE ; 恢復(fù)中斷狀態(tài)
RET
; *************************** 數(shù)據(jù)字節(jié)讀取函數(shù) **************************
; 函數(shù)原型: unsigned char iap_read_data_byte(unsigned int addr);
; 功 能: 從FLASH中讀取一個字節(jié)的數(shù)據(jù)并返回給主調(diào)函數(shù)。
; 參 數(shù):addr = 16位FLASH地址。
; **********************************************************************
RSEG ?PR?_iap_read_data_byte?RX2IAPLIB
_iap_read_data_byte:
PUSH IE ; 關(guān)中斷
CLR EA
MOV A,CMOD
MOV R2,A ; 保存 CMOD
JNB ACC.6,?IAPTAG12 ; 禁止看門狗
ANL CMOD,#0BFH
?IAPTAG12:
ORL AUXR1,#020H ; 允許 bootrom
MOV R0,iap_freq ; 晶振頻率 -> R0
MOV R1,#03H
MOV DPH,R6 ; FLASH地址 -> DPTR
MOV DPL,R7
CALL 0FFF0H ; 調(diào)用IAP子程序
MOV R7,A ; A中的返回值 -> R7
ANL AUXR1,#0DFH ; 禁止 bootrom
MOV CMOD,R2 ; 恢復(fù)CMOD(恢復(fù)看門狗狀態(tài))
POP IE ; 恢復(fù)中斷狀態(tài)
RET
; ***************************** 塊擦除函數(shù) ******************************
; 函數(shù)原型: void iap_erase_block(unsigned char block);
; 功 能: 擦除FLASH中的一個塊。
; 參 數(shù):待擦除的FLASH塊地址。
; **********************************************************************
RSEG ?PR?_iap_erase_block?RX2IAPLIB
_iap_erase_block:
PUSH IE ; 關(guān)中斷
CLR EA
MOV A,CMOD
MOV R2,A ; 保存 CMOD
JNB ACC.6,?IAPTAG13 ; 禁止看門狗
ANL CMOD,#0BFH
?IAPTAG13:
ORL AUXR1,#020H ; 允許 bootrom
MOV R0,iap_freq ; 晶振頻率 -> R0
MOV R1,#01H
MOV DPH,R7 ; 塊地址參數(shù) -> DPH
MOV DPL,#00H
CALL 0FFF0H ; 調(diào)用IAP子程序
ANL AUXR1,#0DFH ; 禁止 bootrom
MOV CMOD,R2 ; 恢復(fù)CMOD(恢復(fù)看門狗狀態(tài))
POP IE ; 恢復(fù)中斷狀態(tài)
; **************************** 芯片擦除函數(shù) ****************************
; 函數(shù)原型: void iap_erase_chip(void);
; 功 能: 擦除整個FLASH。
; **********************************************************************
RSEG ?PR?iap_erase_chip?RX2IAPLIB
iap_erase_chip:
CLR EA ; 關(guān)中斷
ANL CMOD,#0BFH ; 禁止看門狗
ORL AUXR1,#020H ; 允許 bootrom
MOV R0,iap_freq ; 晶振頻率 -> R0
MOV R1,#08H
CALL 0FFF0H ; 調(diào)用IAP子程序
RET
; ************************** 引導(dǎo)向量讀取函數(shù) *****************************
; 函數(shù)原型: unsigned char iap_read_boot_vector(void);
; 功 能: 返回讀取的引導(dǎo)向量字節(jié)。
; **********************************************************************
RSEG ?PR?iap_read_boot_vector?RX2IAPLIB
iap_read_boot_vector:
PUSH IE ; 關(guān)中斷
CLR EA
MOV A,CMOD
MOV R2,A ; 保存 CMOD
JNB ACC.6,?IAPTAG14 ; 禁止看門狗
ANL CMOD,#0BFH
?IAPTAG14:
ORL AUXR1,#020H ; 允許 bootrom
MOV R0,iap_freq ; 晶振頻率 -> R0
MOV R1,#07H
MOV DPTR,#0002H
CALL 0FFF0H ; 調(diào)用IAP子程序
MOV R7,A ; 返回值 -> R7
ANL AUXR1,#0DFH ; 禁止 bootrom
MOV CMOD,R2 ; 恢復(fù)CMOD(恢復(fù)看門狗狀態(tài))
POP IE ; 恢復(fù)中斷狀態(tài)
RET
; **************************** 狀態(tài)字節(jié)讀取函數(shù) ***************************
; 函數(shù)原型: unsigned char iap_read_status_byte(void);
; 功 能: 返回讀取的狀態(tài)字節(jié)。
; **********************************************************************
RSEG ?PR?iap_read_status_byte?RX2IAPLIB
iap_read_status_byte:
PUSH IE ; 關(guān)中斷
CLR EA
MOV A,CMOD
MOV R2,A ; 保存 CMOD
JNB ACC.6,?IAPTAG15 ; 禁止看門狗
ANL CMOD,#0BFH
?IAPTAG15:
ORL AUXR1,#020H ; 允許 bootrom
MOV R0,iap_freq ; 晶振頻率 -> R0
MOV R1,#07H
MOV DPTR,#0001H
CALL 0FFF0H ; 調(diào)用IAP子程序
MOV R7,A ; 返回值 -> R7
ANL AUXR1,#0DFH ; 禁止 bootrom
MOV CMOD,R2 ; 恢復(fù)CMOD(恢復(fù)看門狗狀態(tài))
POP IE ; 恢復(fù)中斷狀態(tài)
RET
; ********************** 引導(dǎo)向量與狀態(tài)字節(jié)擦除函數(shù) ***********************
; 函數(shù)原型: void iap_erase_boot_vector_status_byte(void);
; 功 能: 擦除引導(dǎo)向量與狀態(tài)字節(jié)。
; **********************************************************************
RSEG ?PR?iap_erase_boot_vector_status_byte?RX2IAPLIB
iap_erase_boot_vector_status_byte:
PUSH IE ; 關(guān)中斷
CLR EA
MOV A,CMOD
MOV R2,A ; 保存 CMOD
JNB ACC.6,?IAPTAG16 ; 禁止看門狗
ANL CMOD,#0BFH
?IAPTAG16:
ORL AUXR1,#020H ; 允許 bootrom
MOV R0,iap_freq ; 晶振頻率 -> R0
MOV R1,#04H
MOV DPH,#00H
CALL 0FFF0H ; 調(diào)用IAP子程序
ANL AUXR1,#0DFH ; 禁止 bootrom
MOV CMOD,R2 ; 恢復(fù)CMOD(恢復(fù)看門狗狀態(tài))
POP IE ; 恢復(fù)中斷狀態(tài)
RET
; ***************************** 狀態(tài)字節(jié)編程函數(shù) **************************
; 函數(shù)原型: void iap_program_status_byte(unsigned char status_byte);
; 功 能: 編程狀態(tài)字節(jié)。
; 參 數(shù):status_byte = 待編程的狀態(tài)字節(jié)。
; **********************************************************************
RSEG ?PR?_iap_program_status_byte?RX2IAPLIB
_iap_program_status_byte:
PUSH IE ; 關(guān)中斷
CLR EA
MOV A,CMOD
MOV R2,A ; 保存 CMOD
JNB ACC.6,?IAPTAG17 ; 禁止看門狗
ANL CMOD,#0BFH
?IAPTAG17:
ORL AUXR1,#020H ; 允許 bootrom
MOV R0,iap_freq ; 晶振頻率 -> R0
MOV R1,#06H
MOV A,R7 ; 待編程的狀態(tài)字節(jié)參數(shù) -> A
MOV DPTR,#0000H
CALL 0FFF0H ; 調(diào)用IAP子程序
ANL AUXR1,#0DFH ; 禁止 bootrom
MOV CMOD,R2 ; 恢復(fù)CMOD(恢復(fù)看門狗狀態(tài))
POP IE ; 恢復(fù)中斷狀態(tài)
RET
; ***************************** 引導(dǎo)向量編程函數(shù) **************************
; 函數(shù)原型: void iap_program_boot_vector(unsigned char boot_vector);
; 功 能: 重新編程引導(dǎo)向量。
; 參 數(shù):boot_vecto = 待編程的引導(dǎo)向量字節(jié)。
; **********************************************************************
RSEG ?PR?_iap_program_boot_vector?RX2IAPLIB
_iap_program_boot_vector:
PUSH IE ; 關(guān)中斷
CLR EA
MOV A,CMOD
MOV R2,A ; 保存 CMOD
JNB ACC.6,?IAPTAG18 ; 禁止看門狗
ANL CMOD,#0BFH
?IAPTAG18:
ORL AUXR1,#020H ; 允許 bootrom
MOV R0,iap_freq ; 晶振頻率 -> R0
MOV R1,#06H
MOV A,R7 ; 待編程的引導(dǎo)向量字節(jié)參數(shù) -> A
MOV DPTR,#0001H
CALL 0FFF0H ; 調(diào)用IAP子程序
ANL AUXR1,#0DFH ; 禁止 bootrom
MOV CMOD,R2 ; 恢復(fù)CMOD(恢復(fù)看門狗狀態(tài))
POP IE ; 恢復(fù)中斷狀態(tài)
RET
END
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -