📄 flashburn.asm.bak
字号:
*烧写8位Flash
.mmregs
.global CodeStart
.global BurnData
.global TotalNum
.copy "FlashBurnDef.asm"
StartAddrH .set (StartAddr & 0FFH)
StartAddrL .set StartAddr>>8
DATA_POLLING .set 1 ;1:通过检查D7的办法 0:用延时
;宏定义
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
DELAY_PRG .macro ;写数据时延时20us以上
RPT #10000;假设时钟为100M
NOP
.endm
CHECK_CHIP_ERASE .macro ;通过检查8000H的D7是否擦写完成
wait?: LD *(#8000H),A
AND #80H,A
BC wait?,AEQ
.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
.if DATA_POLLING=1
CHECK_PRG #0FFH,*(8000H)
.else
CALL DELAY_FUNC
.endif
.if BOOTTABLE=1
;写boottable的起始地址
PROG_CMD ;写地址低8位
ST #StartAddrL,*(#0FFFFH)
.if DATA_POLLING=1
CHECK_PRG #StartAddrL,*(#0FFFFH)
.else
DELAY_PRG
.endif
PROG_CMD ;写地址高8位
ST #StartAddrH,*(#0FFFEH);
.if DATA_POLLING=1
CHECK_PRG #StartAddrH,*(#0FFFEH)
.else
DELAY_PRG
.endif
.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
.if DATA_POLLING=1
CHECK_PRG B,*AR3
.else
DELAY_PRG
.endif
MAR *AR3+
PROG_CMD;写低8位
LD *AR5+,B
AND #00FFH,B
STL B,*AR3
.if DATA_POLLING=1
CHECK_PRG B,*AR3
.else
DELAY_PRG
.endif
MAR *AR3+
BANZ BURN8,*AR2-
*16位Flash烧写
.else
;chip erase or sector erase
ERASE_CMD
ST #10H,*(0D555H) ;chip erase
.if DATA_POLLING=1
CHECK_PRG #0FFFFH,*(8000H)
.else
CALL DELAY_FUNC
.endif
.if BOOTTABLE=1
;写boottable的起始地址
PROG_CMD
ST #StartAddr,*(#0FFFFH);
.if DATA_POLLING=1
CHECK_PRG #StartAddr,*(#0FFFFH)
.else
DELAY_PRG
.endif
.endif
;写Boottable
STM #StartAddr,AR3;
STM #TotalNum,AR2
STM #BurnData,AR5
BURN16: PROG_CMD;写高8位
.if DATA_POLLING=1
MVDD *AR5,*AR3
CHECK_PRG *AR3,*AR5
MAR *AR3+
MAR *AR5+
.else
MVDD *AR5+,*AR3+
DELAY_PRG
.endif
BANZ BURN16,*AR2-
.endif
.copy "AfterFlashBurn.asm"
BurnFinished: nop
END: nop
B END
*延时子程序
DELAY_FUNC:
;延时25ms以上
PSHM AR1
STM #6000,AR1
DelayLoop: rpt #5000
nop
BANZ DelayLoop,*AR1-
POPM AR1
RET
.end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -