?? 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 + -