📄 rx2iaplib.a51
字号:
$NOMOD51
NAME RX2IAPLIB
; 段定义
?DT?RX2IAPLIB SEGMENT DATA
?PR?iap_read_manufacturer_id?RX2IAPLIB SEGMENT CODE
?PR?_iap_init?RX2IAPLIB SEGMENT CODE
?PR?_iap_read_device_id?RX2IAPLIB SEGMENT CODE
?PR?iap_read_security_bits?RX2IAPLIB SEGMENT CODE
?PR?_iap_program_security_bits?RX2IAPLIB SEGMENT CODE
?PR?_iap_program_data_byte?RX2IAPLIB SEGMENT CODE
?PR?_iap_read_data_byte?RX2IAPLIB SEGMENT CODE
?PR?_iap_erase_block?RX2IAPLIB SEGMENT CODE
?PR?iap_erase_chip?RX2IAPLIB SEGMENT CODE
?PR?iap_read_boot_vector?RX2IAPLIB SEGMENT CODE
?PR?iap_read_status_byte?RX2IAPLIB SEGMENT CODE
?PR?iap_erase_boot_vector_status_byte?RX2IAPLIB SEGMENT CODE
?PR?_iap_program_status_byte?RX2IAPLIB SEGMENT CODE
?PR?_iap_program_boot_vector?RX2IAPLIB SEGMENT CODE
; 函数名及全局变量
PUBLIC iap_freq
PUBLIC iap_read_manufacturer_id
PUBLIC _iap_init
PUBLIC _iap_read_device_id
PUBLIC iap_read_security_bits
PUBLIC _iap_program_security_bits
PUBLIC _iap_program_data_byte
PUBLIC _iap_read_data_byte
PUBLIC _iap_erase_block
PUBLIC iap_erase_chip
PUBLIC iap_read_boot_vector
PUBLIC iap_read_status_byte
PUBLIC iap_erase_boot_vector_status_byte
PUBLIC _iap_program_status_byte
PUBLIC _iap_program_boot_vector
; 特殊功能寄存器定仪
DPH DATA 083H
DPL DATA 082H
AUXR1 DATA 0A2H
EA BIT 0AFH
CMOD DATA 0D9H
ACC DATA 0E0H
IE DATA 0A8H
RSEG ?DT?RX2IAPLIB
?DT?RX2IAPLIB?BASE:
iap_freq: DS 1 ; 芯片使用的晶振频率(近似整数值)
; ************************* 芯片厂商ID读取函数 ***************************
; 函数原型: unsigned char iap_read_manufacturer_id(void);
; 功 能: 返回值为厂商ID (15H = Philips)。
; **********************************************************************
RSEG ?PR?iap_read_manufacturer_id?RX2IAPLIB
iap_read_manufacturer_id:
PUSH IE ; IE保存堆栈
CLR EA ; 关中断
MOV A,CMOD ; 保存CMOD
MOV R2,A
JNB ACC.6,?IAPTAG2
ANL CMOD,#0BFH ; 禁止看门狗
?IAPTAG2:
ORL AUXR1,#020H ; 允许Boot Rom
MOV R0,iap_freq ; 晶振频率值->R0
MOV R1,#00H
MOV DPTR,#0000H
CALL 0FFF0H ; 调用IAP子程序
MOV R7,A ; 将A中的ID值->R7
ANL AUXR1,#0DFH ; 禁止Boot Rom
MOV CMOD,R2 ; 恢复CMOD(恢复看门狗状态)
POP IE ; 恢复中断状态
RET
; *************************** IAP初始化函数 ***************************
; 函数原型: void iap_init(unsigned char frequency);
; 功 能: 设置芯片晶振频率。
; 参 数:芯片所使用晶振的近似整数值。
; **********************************************************************
RSEG ?PR?_iap_init?RX2IAPLIB
_iap_init:
MOV iap_freq,R7
RET
; end of iap_init
; *************************** 芯片ID读取函数 *****************************
; 函数原型: unsigned char iap_read_device_id(unsigned char id_number);
; 功 能: 读取器件ID.
; 参 数:id_number 可为 1 或 2.
; **********************************************************************
RSEG ?PR?_iap_read_device_id?RX2IAPLIB
_iap_read_device_id:
PUSH IE ; 关中断
CLR EA
MOV A,CMOD
MOV R2,A ; 保存 CMOD
JNB ACC.6,?IAPTAG4 ; 禁止看门狗
ANL CMOD,#0BFH
?IAPTAG4:
ORL AUXR1,#020H ; 允许bootrom
MOV R0,iap_freq ; 晶振频率->R0
MOV R1,#00H
MOV DPH,#00H
MOV DPL,R7 ; 参数id_number -> DPL
CALL 0FFF0H ; 调用IAP子程序
MOV R7,A ; 将A中的ID值->R7
ANL AUXR1,#0DFH ; 禁止bootrom
MOV CMOD,R2 ; 恢复CMOD(恢复看门狗状态)
POP IE ; 恢复中断状态
RET
; *************************** 保密位读取函数 ****************************
; 函数原型: unsigned char iap_read_security_bits(void);
; 功 能: 读取保密位状态,返回字节中的第1、2、3位分别对应保密位1、2、3。
; **********************************************************************
RSEG ?PR?iap_read_security_bits?RX2IAPLIB
iap_read_security_bits:
PUSH IE ; 关中断
CLR EA
MOV A,CMOD
MOV R2,A ; 保存 CMOD
JNB ACC.6,?IAPTAG6 ; 禁止看门狗
ANL CMOD,#0BFH
?IAPTAG6:
ORL AUXR1,#020H ; 允许 bootrom
MOV R0,iap_freq ; 晶振频率->R0
MOV R1,#07H
MOV DPTR,#0000H
CALL 0FFF0H ; 调用IAP子程序
MOV R7,A ; 将A中的ID值->R7
ANL AUXR1,#0DFH ; 禁止 bootrom
MOV CMOD,R2 ; 恢复CMOD(恢复看门狗状态)
POP IE ; 恢复中断状态
RET
; *************************** 保密位编程函数 **************************
; 函数原型: void iap_program_security_bits(unsigned char bits);
; 功 能: 编程保密位,参数字节中的第1、2、3位分别对应保密位1、2、3。
; **********************************************************************
RSEG ?PR?_iap_program_security_bits?RX2IAPLIB
_iap_program_security_bits:
; prologue
PUSH IE ; 关中断
CLR EA
MOV A,CMOD
MOV R2,A ; 保存 CMOD
JNB ACC.6,?IAPTAG10 ; 禁止看门狗
ANL CMOD,#0BFH
?IAPTAG10:
ORL AUXR1,#020H ; 允许 bootrom
MOV R6,#00H ; 位计数器
MOV A,R7 ; 参数 -> A
MOV DPH,#00H
?IAPTAG7:
JNB ACC.1,?IAPTAG8 ; 检查ACC.1是否为1
MOV R0,iap_freq ; 晶振频率->R0
MOV R1,#05H
MOV DPL,R6
CALL 0FFF0H ; 调用IAP子程序
?IAPTAG8:
CLR C ; A带进位右移1位
RRC A
INC R6 ; 位计数器加1
CJNE R6,#003H,?IAPTAG9 ; 检查3位全部完成否?
?IAPTAG9:
JC ?IAPTAG7 ; 未完,返回编程下一位
; epologue
ANL AUXR1,#0DFH ; 禁止 bootrom
MOV CMOD,R2 ; 恢复CMOD(恢复看门狗状态)
POP IE ; 恢复中断状态
RET
; *************************** 数据字节编程函数 **************************
; 函数原型: unsigned char iap_program_data_byte(unsigned char val,
; unsigned int addr);
; 功 能: 编程FLASH中的1个字节。
; 参 数:val = 待编程的字节数据。
; addr = 16位FLASH地址。
; 返 回 值:编程成功返回0,编程失败返回非0值。
; **********************************************************************
RSEG ?PR?_iap_program_data_byte?RX2IAPLIB
_iap_program_data_byte:
PUSH IE ; 关中断
CLR EA
MOV A,CMOD
MOV R2,A ; 保存 CMOD
JNB ACC.6,?IAPTAG11 ; 禁止看门狗
ANL CMOD,#0BFH
?IAPTAG11:
ORL AUXR1,#020H ; 允许 bootrom
MOV R0,iap_freq ; 晶振频率 -> R0
MOV R1,#02H
MOV DPH,R4 ; 编程地址 -> DPTR
MOV DPL,R5
MOV A,R7 ; 编程数据 -> A
CALL 0FFF0H ; 调用IAP子程序
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -