?? iaptest.s
字號:
;******************************************************************************
; 文件名:IAPTEST.S
; 功能:LPC2200的IAP功能測試。
; 1. 選擇扇區,命令代碼50
; 2. 復制RAM數據到FLASH,即FLASH編程,命令代碼51
; 3. 擦除扇區,命令代碼52
; 4. 查空扇區,命令代碼53
; 5. 讀取器件ID,命令代碼54
; 6. 讀取boot代碼版本號,命令代碼55
; 7. 校驗數據,命令代碼56
; 說明:使用JTAG調試,觀察操作返回值及操作結果。
;******************************************************************************
INCLUDE LPC2294.INC
EXPORT MAIN
IAP_Enter EQU 0x7FFFFFF0 ; IAP入口地址定義
IAP_ParIn EQU 0x40003E00 ; 定義IAP入口參數地址(緩沖區0x40003E00-0x40003E10)
IAP_ParOut EQU 0x40003D00 ; 定義IAP出口參數地址(緩沖區0x40003D00-0x40003D10)
; 定義IAP命令字
IAP_SELSECTOR EQU 50
IAP_RAMTOFLASH EQU 51
IAP_ERASESECTOR EQU 52
IAP_BLANKCHK EQU 53
IAP_READPARTID EQU 54
IAP_BOOTCODEID EQU 55
IAP_COMPARE EQU 56
; 定義CCLK值大小,單位為KHz
IAP_FCCLK EQU 11059
AREA IAPTESTC, CODE, READONLY
ENTRY
; 使用IAP功能時,RAM的頂端的32字節保留給IAP操作使用;
; IAP入口為THUMB狀態,所以調用時使用BX指令(切換處理器狀態)。
MAIN LDR SP,=0x40003F00 ; 設置堆棧指針
LDR R0,=MAMCR
MOV R1,#0x00 ; 關閉MAM
STR R1,[R0]
LDR R0,=PLLCON
MOV R1,#0x00 ; 關閉PLL
STR R1,[R0]
LDR R0,=PLLFEED
MOV R1,#0xAA
STR R1,[R0]
MOV R1,#0x55
STR R1,[R0]
; 讀取器件ID
BL ReadParID
; 讀取boot代碼版本號
BL BootCodeID
; 選擇扇區1
MOV R2,#1 ; 設置入口參數,起始扇區號
MOV R3,#1 ; 終止扇區號(要大于等于起始扇區)
BL SelSector ; 選擇操作扇區
; 擦除扇區1
MOV R2,#1
MOV R3,#1
BL EraseSector
; 查空扇區1
MOV R2,#1
MOV R3,#1
BL BlankCHK
; 選擇扇區1
MOV R2,#1 ; 設置入口參數,起始扇區號
MOV R3,#1 ; 終止扇區號(要大于等于起始扇區)
BL SelSector ; 選擇操作扇區
; 寫數據到扇區1
MOV R2,#0x00002000
MOV R3,#0x40000000
MOV R4,#512
BL RamToFlash
; 選擇扇區1
MOV R2,#1 ; 設置入口參數,起始扇區號
MOV R3,#1 ; 終止扇區號(要大于等于起始扇區)
BL SelSector ; 選擇操作扇區
; 查空扇區1
MOV R2,#1
MOV R3,#1
BL BlankCHK
; 比較數據
MOV R2,#0x00002000
MOV R3,#0x40000000
MOV R4,#512
BL Compare
HALT B HALT
;******************************************************************************
; 名稱:SelSector
; 功能:IAP操作扇區選擇,命令代碼50
; 入口參數:R2 起始扇區
; R3 終止扇區
; 出口參數:IAP返回值
; 說明:使用了R0、R1指向的緩沖區作為IAP參數傳送緩沖區。
;******************************************************************************
SelSector
STMFD SP!,{R0-R7,LR}
LDR R0,=IAP_ParIn
LDR R1,=IAP_ParOut
MOV R4,#IAP_SELSECTOR ; 設置命令字
STR R4,[R0]
STR R2,[R0,#4] ; 參數設置,起始扇區
STR R3,[R0,#8] ; 終止扇區
ADR LR,SelSrExt
LDR R5,=IAP_Enter+1
BX R5
SelSrExt LDMFD SP!,{R0-R7,PC}
;******************************************************************************
; 名稱:RamToFlash
; 功能:復制RAM的數據到FLASH,命令代碼51
; 入口參數:R2 目標地址,即FLASH起始地址。以512字節為分界
; R3 源地址,即RAM地址。地址必須字對齊
; R4 復制字節個數,為512/1024/4096/8192
; 出口參數:IAP返回值
; 說明:使用了R0、R1指向的緩沖區作為IAP參數傳送緩沖區。
; 在使用此程序前,要先選擇操作扇區。
;******************************************************************************
RamToFlash
STMFD SP!,{R0-R7,LR}
LDR R0,=IAP_ParIn
LDR R1,=IAP_ParOut
MOV R5,#IAP_RAMTOFLASH ; 設置命令字
STR R5,[R0]
STR R2,[R0,#4] ; 參數設置,目標地址
STR R3,[R0,#8] ; 源地址
STR R4,[R0,#12] ; 操作字節數
LDR R4,=IAP_FCCLK
STR R4,[R0,#16] ; CCLK頻率
ADR LR,RamTFExt
LDR R5,=IAP_Enter+1
BX R5
RamTFExt LDMFD SP!,{R0-R7,PC}
;******************************************************************************
; 名稱:EraseSector
; 功能:扇區擦除,命令代碼52
; 入口參數:R2 起始扇區
; R3 終止扇區
; 出口參數:IAP返回值
; 說明:使用了R0、R1指向的緩沖區作為IAP參數傳送緩沖區。
; 在使用此程序前,要先選擇操作扇區。
;******************************************************************************
EraseSector
STMFD SP!,{R0-R7,LR}
LDR R0,=IAP_ParIn
LDR R1,=IAP_ParOut
MOV R4,#IAP_ERASESECTOR ; 設置命令字
STR R4,[R0]
STR R2,[R0,#4] ; 參數設置,起始扇區
STR R3,[R0,#8] ; 終止扇區
LDR R4,=IAP_FCCLK
STR R4,[R0,#12] ; CCLK頻率
ADR LR,EraseSrExt
LDR R5,=IAP_Enter+1
BX R5
EraseSrExt LDMFD SP!,{R0-R7,PC}
;******************************************************************************
; 名稱:BlankCHK
; 功能:扇區查空,命令代碼53
; 入口參數:R2 起始扇區
; R3 終止扇區
; 出口參數:IAP返回值
; 說明:使用了R0、R1指向的緩沖區作為IAP參數傳送緩沖區。
;******************************************************************************
BlankCHK
STMFD SP!,{R0-R7,LR}
LDR R0,=IAP_ParIn
LDR R1,=IAP_ParOut
MOV R4,#IAP_BLANKCHK ; 設置命令字
STR R4,[R0]
STR R2,[R0,#4] ; 參數設置,起始扇區
STR R3,[R0,#8] ; 終止扇區
ADR LR,BlankCKExt
LDR R5,=IAP_Enter+1
BX R5
BlankCKExt LDMFD SP!,{R0-R7,PC}
;******************************************************************************
; 名稱:ReadParID
; 功能:讀取器件ID,命令代碼54
; 入口參數:無
; 出口參數:IAP返回值
; 說明:使用了R0、R1指向的緩沖區作為IAP參數傳送緩沖區。
;******************************************************************************
ReadParID
STMFD SP!,{R0-R7,LR}
LDR R0,=IAP_ParIn
LDR R1,=IAP_ParOut
MOV R4,#IAP_READPARTID ; 設置命令字
STR R4,[R0]
ADR LR,ReadPDExt
LDR R5,=IAP_Enter+1
BX R5
ReadPDExt LDMFD SP!,{R0-R7,PC}
;******************************************************************************
; 名稱:BootCodeID
; 功能:讀取boot代碼版本號,命令代碼55
; 入口參數:無
; 出口參數:IAP返回值
; 說明:使用了R0、R1指向的緩沖區作為IAP參數傳送緩沖區。
;******************************************************************************
BootCodeID
STMFD SP!,{R0-R7,LR}
LDR R0,=IAP_ParIn
LDR R1,=IAP_ParOut
MOV R4,#IAP_BOOTCODEID ; 設置命令字
STR R4,[R0]
ADR LR,BootCDExt
LDR R5,=IAP_Enter+1
BX R5
BootCDExt LDMFD SP!,{R0-R7,PC}
;******************************************************************************
; 名稱:Compare
; 功能:校驗數據,命令代碼56
; 入口參數:R2 目標地址,即RAM/FLASH起始地址。地址必須字對齊
; R3 源地址,即FLASH/RAM地址。地址必須字對齊
; R4 復制字節個數,必須能被4整除
; 出口參數:IAP返回值
; 說明:使用了R0、R1指向的緩沖區作為IAP參數傳送緩沖區。
;******************************************************************************
Compare
STMFD SP!,{R0-R7,LR}
LDR R0,=IAP_ParIn
LDR R1,=IAP_ParOut
MOV R5,#IAP_COMPARE ; 設置命令字
STR R5,[R0]
STR R2,[R0,#4] ; 參數設置,目標地址
STR R3,[R0,#8] ; 源地址
STR R4,[R0,#12] ; 操作字節數
ADR LR,CompareExt
LDR R5,=IAP_Enter+1
BX R5
CompareExt LDMFD SP!,{R0-R7,PC}
END
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -