?? flashburn.asm
字號:
*通用Flash燒寫程序
.mmregs
.global CodeStart
.global BurnData
.global TotalNum
.copy "FlashBurnDef.asm"
StartAddrL .set (StartAddr & 0FFH)
StartAddrH .set StartAddr>>8
;宏定義
PROG_CMD .macro ;編程命令的前導指令
ST #00AAH,*(0D555H)
ST #0055H,*(0AAAAH)
ST #00A0H,*(0D555H)
.endm
ERASE_CMD .macro ;擦寫命令的前導指令
ST #00AAH,*(0D555H)
ST #0055H,*(0AAAAH)
ST #0080H,*(0D555H)
ST #00AAH,*(0D555H)
ST #0055H,*(0AAAAH)
.endm
ERASE_CHIP_CMD .macro ;擦寫整個chip
ERASE_CMD
ST #0010H,*(0D555H)
.endm
CHECK_PRG .macro DataWrite,DataRead ;通過檢查寫入地址的D7看是否寫入完成
rpt #9
nop
CheckAgain?:LD :DataRead:,A
XOR :DataWrite:,A
.if FlashWidth=8
AND #0FFH,A ;如果是8位Flash,屏蔽掉高8位
.else
AND #0FFFFH,A ;16位也有可能因為符號位擴展導致高位16不為0
.endif
BC CheckAgain?,ANEQ;如果不相同則重復(fù)檢查
.endm
.text
CodeStart:
STACK_SIZE .set 20H
STACK: .usect "STACK",STACK_SIZE
STM #STACK+STACK_SIZE,SP
.copy "BeforeFlashBurn.asm"
*8位Flash燒寫
.if FlashWidth=8
;chip erase or sector erase
ERASE_CHIP_CMD
CHECK_PRG #0FFH,*(8000H)
.if BOOTTABLE=1
;寫boottable的起始地址
PROG_CMD ;寫地址低8位
ST #StartAddrL,*(#0FFFFH)
CHECK_PRG #StartAddrL,*(#0FFFFH)
PROG_CMD ;寫地址高8位
ST #StartAddrH,*(#0FFFEH);
CHECK_PRG #StartAddrH,*(#0FFFEH)
.endif
;寫B(tài)oottable
STM #StartAddr,AR3;
STM #TotalNum,AR2
STM #BurnData,AR5
BURN8: PROG_CMD;寫高8位
LD *AR5,B
SFTL B,-8,B
STL B,*AR3
CHECK_PRG B,*AR3
MAR *AR3+
PROG_CMD;寫低8位
LD *AR5+,B
AND #00FFH,B
STL B,*AR3
CHECK_PRG B,*AR3
MAR *AR3+
BANZ BURN8,*AR2-
*16位Flash燒寫
.else
;chip erase or sector erase
ERASE_CMD
ST #10H,*(0D555H) ;chip erase
CHECK_PRG #0FFFFH,*(8000H)
.if BOOTTABLE=1
;寫boottable的起始地址
PROG_CMD
ST #StartAddr,*(#0FFFFH);
CHECK_PRG #StartAddr,*(#0FFFFH)
.endif
;寫B(tài)oottable
STM #StartAddr,AR3;
STM #TotalNum,AR2
STM #BurnData,AR5
BURN16: PROG_CMD;寫高8位
MVDD *AR5,*AR3
CHECK_PRG *AR3,*AR5
MAR *AR3+
MAR *AR5+
BANZ BURN16,*AR2-
.endif
.copy "AfterFlashBurn.asm"
BurnFinished: nop
END: nop
B END
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -