📄 flash.asm
字号:
************************************************************************************
* *
* Flash testing for Vc5402 dsk demo *
* *
************************************************************************************
.copy "flash.h"
.copy "VC5402.h"
.global _main
.text
__STACK_SIZE .set 400H
__stack .set 3C00H
_main:
STM #(__stack+__STACK_SIZE-1),SP ; set to beginning of stack memory
; add size to get to top
ANDM #0fffeh,*(SP) ; make sure it is an even address
SSBX SXM
RSBX XF
NOP
NOP
NOP
NOP
SSBX XF ; turn on SXM for LD #cinit,A
ANDM #0000H,*(IMR) ; 屏蔽所有的可屏蔽中断
ANDM #OVLY_0,*(PMST) ; OVLY = 0
ORM #MP_1,*(PMST) ; MP/MC = 1
RSBX CPL ; make the DP is ok
STM #SWWSR_VAL,SWWSR ; 配置软件等待寄存器
STM #SWCR_VAL,SWCR
* RSBX FRCT
LD #04H,DP
LD 1H,-1,A ; the page address is 0x0000H
nop
nop
nop
* PORTW *(AL),04H
* PORTW 14H, 1H ; make flash is at the program memory
PORTR 4H,1H
NOP
NOP
NOP
nop
* B $-7
flash_rst: LD 0,A
STM #Flash_base,AH
STM #Flash_555,AL
ST #Flash_rst,1H
nop
nop
nop
nop
WRITA 1H
nop
nop
nop
nop ; Flash reset
* b $-7
CALL flash_erase
ST #0cH,4H ; The length of the flash that you want to be write
STM #Flash_base,BH ;the entrance for write flash is B
STM #0,BL
ST #5555H,3H ; the data which write to flash is 0x203H
CALL bwrite
CALL flash_erase
ST #0cH,4H
STM #Flash_base,BH
STM #0,BL
ST #0aaaaH,3H
CALL bwrite
b $
flash_erase: STM #Flash_base,AH ; High address of the flash is 0x80000H
STM #Flash_555,AL
ST #Flash_UL1,1H
WRITA 1H ;AAH --> (80555H)
STM #Flash_2AA,AL
ST #Flash_UL2,1H
WRITA 1H ;55H --> (802AAH)
STM #Flash_555,AL
ST #Flash_ERASE,1H
WRITA 1H ;80H --> (80555H)
STM #Flash_555,AL
ST #Flash_UL1,1H
WRITA 1H ;AAH --> (80555H)
STM #Flash_2AA,AL
ST #Flash_UL2,1H
WRITA 1H ;55H --> (802AAH)
STM #Flash_555,AL
ST #Flash_CE,1H
WRITA 1H
nop
nop
nop
nop
nop ;AAH --> (80555H)
erase_poll: STM #0H,AL
READA 1H
BITF 1H,#Polling_Bit
BC erase_poll,NTC ; Is the action for erase "ok"?
STM #0H,AL
STM #03H,BH
STM #0FFFFH,BL
erase_check: READA 1H
CMPM 1H,#Flash_BLANK
BCD erase_err,NTC
ADD #1,A
SUB #1,B
BCD erase_check,BNEQ
NOP
NOP
NOP
NOP
LD #1,A
NOP
NOP
BD erase_end
erase_err: LD #0H,A
erase_end: NOP
RET
; the block for flash write
bwrite: CALL flash_write
ADD #1,B
STL B,-16,0H
LDU 0H,A
XOR 4H,A
STM #0,AH
BC bwrite,ANEQ
NOP
NOP
NOP
RET
B $
flash_write: STM #Flash_base,AH
STM #Flash_555,AL ; The start address of the flash is 0x80000H
ST #Flash_UL1,1H
WRITA 1H ;AAH --> (80555H)
STM #Flash_2AA,AL
ST #Flash_UL2,1H
WRITA 1H ;55H --> (802AAH)
STM #Flash_555,AL
ST #Flash_PRG,1H
WRITA 1H ;A0H --> (80555H)
NOP
NOP
NOP
LD B,A
WRITA 3H ;AAH --> (80555H)
program_poll: READA 2H
READA 5H
LDU 2H,A
XOR 3H,A
STL A,2H
BITF 2H,#Polling_Bit
BC program_poll,TC ; Is the action for erase "ok"?
LDU 5H,A
XOR 3H,A
STM #0,AH
LD #1,A
XC 1,ANEQ
LD #0,A
RET
.end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -