📄 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;如果不相同则重复检查
.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
;写Boottable
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
;写Boottable
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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -