没有用汇编的经历,边学边做。写了一个CC1110改写自身FLASH的程序。为一个项目而写,觉得不错,于是把它公布在这里。请大家指点下。
程序运行后会将0x7c00之后这部分FLASH改正为0x00-0xff,周而复始,直到将这一页空间改完。一页空间指1KB。去除forver那两行,应该可以测试CC1110的FLASH可擦除次数了。
#include "ioCC1110.h"
NAME main //如果对到最左边则出错
PUBLIC main
ORG 0FFFEh
DC16 main
RSEG RCODE
ADR EQU 0x7c00;
DS 1
main NOP
;复制程序到内存,在内存中从0x0A开始放置这段程序
;dptr0 指向内存
MOV DPH, #0XF2
MOV DPL, #0X00
;dptr1 指向ROM
MOV DPH1, #HIGH(copy2FlashProcStart)
MOV DPL1, #LOW(copy2FlashProcStart)
//保存RAM中程序的首地址
MOV DPS,#0
PUSH DPH
PUSH DPL
MOV R4,#copy2FlashProcEnd-copy2FlashProcStart;
;复制@DPTR1 -> @DPTR0
copyLoop:
MOV DPS, #0x01
MOVX A, @DPTR
INC DPTR
MOV DPS, #0x00
MOVX @DPTR, A
INC DPTR
DJNZ R4,copyLoop;
//设置FWT寄存器
MOV A,CLKCON
ANL A,#0X07
MOV R4,A
INC R4
MOV A,#0X44
rotate: CLR C
RRC A
DJNZ R4,rotate
MOV FWT,A
;设置写FLASH的初始地址
MOV A, #HIGH(ADR)
RR A;
MOV FADDRH,A
MOV FADDRL,#0X00
;指定长度,然后开始写FLASH
MOV R3,#02H
MOV R4,#00H
MOV R5,#02H
;将数据指针指向RAM程序首地址
MOV DPS,#0;
POP DPL
POP DPH
LCALL indirCall;
forever:
JMP forever;
LJMP main
;复制到内存中运行的程序,用于擦除FLASH,然后向FLASH写自数然
indirCall: CLR A;
JMP @A+DPTR;
copy2FlashProcStart:
MOV FCTL, #01H;
waitEraseLoop:
MOV A,FCTL
ANL A, #80H
JNZ waitEraseLoop;
MOV R0,#00H
MOV FCTL, #02H
writeBlock:
MOV A,R0
MOV FWDATA, A
INC R0;
DJNZ R5,writeBlock
MOV R5, #02H
waitLoop:
MOV A,FCTL
ANL A, #40H
JNZ waitLoop
DJNZ R4,writeBlock
DJNZ R3,writeBlock
done: RET;
copy2FlashProcEnd:
END main
zigbee_904218839 2010-10-13 21:35
用户303040 2010-10-9 13:58