📄 rx2iaplib.a51
字号:
MOV R7,A ; A中返回值 -> R7
ANL AUXR1,#0DFH ; 禁止 bootrom
MOV CMOD,R2 ; 恢复CMOD(恢复看门狗状态)
POP IE ; 恢复中断状态
RET
; *************************** 数据字节读取函数 **************************
; 函数原型: unsigned char iap_read_data_byte(unsigned int addr);
; 功 能: 从FLASH中读取一个字节的数据并返回给主调函数。
; 参 数:addr = 16位FLASH地址。
; **********************************************************************
RSEG ?PR?_iap_read_data_byte?RX2IAPLIB
_iap_read_data_byte:
PUSH IE ; 关中断
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 ; 调用IAP子程序
MOV R7,A ; A中的返回值 -> R7
ANL AUXR1,#0DFH ; 禁止 bootrom
MOV CMOD,R2 ; 恢复CMOD(恢复看门狗状态)
POP IE ; 恢复中断状态
RET
; ***************************** 块擦除函数 ******************************
; 函数原型: void iap_erase_block(unsigned char block);
; 功 能: 擦除FLASH中的一个块。
; 参 数:待擦除的FLASH块地址。
; **********************************************************************
RSEG ?PR?_iap_erase_block?RX2IAPLIB
_iap_erase_block:
PUSH IE ; 关中断
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 ; 块地址参数 -> DPH
MOV DPL,#00H
CALL 0FFF0H ; 调用IAP子程序
ANL AUXR1,#0DFH ; 禁止 bootrom
MOV CMOD,R2 ; 恢复CMOD(恢复看门狗状态)
POP IE ; 恢复中断状态
; **************************** 芯片擦除函数 ****************************
; 函数原型: void iap_erase_chip(void);
; 功 能: 擦除整个FLASH。
; **********************************************************************
RSEG ?PR?iap_erase_chip?RX2IAPLIB
iap_erase_chip:
CLR EA ; 关中断
ANL CMOD,#0BFH ; 禁止看门狗
ORL AUXR1,#020H ; 允许 bootrom
MOV R0,iap_freq ; 晶振频率 -> R0
MOV R1,#08H
CALL 0FFF0H ; 调用IAP子程序
RET
; ************************** 引导向量读取函数 *****************************
; 函数原型: unsigned char iap_read_boot_vector(void);
; 功 能: 返回读取的引导向量字节。
; **********************************************************************
RSEG ?PR?iap_read_boot_vector?RX2IAPLIB
iap_read_boot_vector:
PUSH IE ; 关中断
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 ; 调用IAP子程序
MOV R7,A ; 返回值 -> R7
ANL AUXR1,#0DFH ; 禁止 bootrom
MOV CMOD,R2 ; 恢复CMOD(恢复看门狗状态)
POP IE ; 恢复中断状态
RET
; **************************** 状态字节读取函数 ***************************
; 函数原型: unsigned char iap_read_status_byte(void);
; 功 能: 返回读取的状态字节。
; **********************************************************************
RSEG ?PR?iap_read_status_byte?RX2IAPLIB
iap_read_status_byte:
PUSH IE ; 关中断
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 ; 调用IAP子程序
MOV R7,A ; 返回值 -> R7
ANL AUXR1,#0DFH ; 禁止 bootrom
MOV CMOD,R2 ; 恢复CMOD(恢复看门狗状态)
POP IE ; 恢复中断状态
RET
; ********************** 引导向量与状态字节擦除函数 ***********************
; 函数原型: void iap_erase_boot_vector_status_byte(void);
; 功 能: 擦除引导向量与状态字节。
; **********************************************************************
RSEG ?PR?iap_erase_boot_vector_status_byte?RX2IAPLIB
iap_erase_boot_vector_status_byte:
PUSH IE ; 关中断
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 ; 调用IAP子程序
ANL AUXR1,#0DFH ; 禁止 bootrom
MOV CMOD,R2 ; 恢复CMOD(恢复看门狗状态)
POP IE ; 恢复中断状态
RET
; ***************************** 状态字节编程函数 **************************
; 函数原型: void iap_program_status_byte(unsigned char status_byte);
; 功 能: 编程状态字节。
; 参 数:status_byte = 待编程的状态字节。
; **********************************************************************
RSEG ?PR?_iap_program_status_byte?RX2IAPLIB
_iap_program_status_byte:
PUSH IE ; 关中断
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 ; 待编程的状态字节参数 -> A
MOV DPTR,#0000H
CALL 0FFF0H ; 调用IAP子程序
ANL AUXR1,#0DFH ; 禁止 bootrom
MOV CMOD,R2 ; 恢复CMOD(恢复看门狗状态)
POP IE ; 恢复中断状态
RET
; ***************************** 引导向量编程函数 **************************
; 函数原型: void iap_program_boot_vector(unsigned char boot_vector);
; 功 能: 重新编程引导向量。
; 参 数:boot_vecto = 待编程的引导向量字节。
; **********************************************************************
RSEG ?PR?_iap_program_boot_vector?RX2IAPLIB
_iap_program_boot_vector:
PUSH IE ; 关中断
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 ; 待编程的引导向量字节参数 -> A
MOV DPTR,#0001H
CALL 0FFF0H ; 调用IAP子程序
ANL AUXR1,#0DFH ; 禁止 bootrom
MOV CMOD,R2 ; 恢复CMOD(恢复看门狗状态)
POP IE ; 恢复中断状态
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -