⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 iaptest.s

📁 LPC2104的IAP编程示例代码
💻 S
字号:
;******************************************************************************	 
; File:IAPTEST.S 
; 功能:LPC210x的IAP功能测试。 
;      1. 选择扇区,命令代码50 
;      2. 复制RAM数据到FLASH,即FLASH编程,命令代码51 
;      3. 擦除扇区,命令代码52 
;      4. 查空扇区,命令代码53 
;      5. 读取器件ID,命令代码54 
;      6. 读取boot代码版本号,命令代码55 
;      7. 校验数据,命令代码56 
; 说明:使用JTAG调试,观察操作返回值及操作结果。 
;******************************************************************************	 
                INCLUDE     LPC2106.INC 
                 
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指令(切换处理器状态)。 
                 
Start           LDR     R1,=0x40003F00      
                MOV     SP,R1                   ; 设置堆栈指针 
                 
                ; 读取器件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 
                 
                B       . 
                 
                 
;******************************************************************************	 
; 名称: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 + -