📄 flash_write_or_erase.asm
字号:
;**************************************
; FLASH ERASE AND PROGRAM
;**************************************
.title "flash.asm"
.mmregs
.def start ; ftw,inform_ch
.data
;*********************************************************************
write_word: ;待写入内容
.word 0x10AA,0x7FFF,0xF800,0x0000,0x0080,0x00EC,0x0000,0x0180,0x7718,0x3A00,0x7758,0x0000
;*********************************************************************
sector_erase_sfd:
.byte 0AAh
.byte 055h
.byte 080h
.byte 0AAh
.byte 055h
.byte 030h ;sector erase
block_erase_sfd:
.byte 0AAh
.byte 055h
.byte 080h
.byte 0AAh
.byte 055h
.byte 050h ;block erase
chip_erase_sfd:
.byte 0AAh
.byte 055h
.byte 080h
.byte 0AAh
.byte 055h
.byte 010h ;chip erase
word_prog_sfd:
.byte 0AAh
.byte 055h
.byte 0A0h
softwareid_entry_sfd:
.byte 0AAh
.byte 055h
.byte 090h
cfi_query_entry_sfd:
.byte 0AAh
.byte 055h
.byte 098h
mode_exit_sfd:
.byte 0AAh
.byte 055h
.byte 0F0h ;exit other mode
;**************************************
erase_sfd_adr:
.word 0D555h
.word 0AAAAh
.word 0D555h
.word 0D555h
.word 0AAAAh
.word 0D555h
common_adr:
.word 0D555h
.word 0AAAAh
.word 0D555h
;erase_sfd_adr .set
;common_adr .set
write_word_adr .set 4000h
;write_word_adr .set 0FFFFh
;data_tab_adr .set 2000h
;prog_tab_adr .set 2050h
;f_adr_tab_adr .set 2021h
;**************************************
size .set 64
length .set 64
stack .set 400h ;.usect"STK",size
offset .set 8000h
SPSA0 .set 38h ;McBSP子地址寄存器
SPSA1 .set 48h ;McBSP子地址寄存器
SPSD0 .set 39h ;子块数据寄存器映射位置
SPSD1 .set 49h ;子块数据寄存器映射位置
GPIOCR .set 3Ch
GPIOSR .set 3Dh
TIM1 .set 30h
PRD1 .set 31h
TCR1 .set 32h
.text
;**************************************
; dsp_init
;**************************************
start:
stm #stack+size,SP
stm #3CF0h,PMST
stm #0h,CLKMD
nop
nop
stm #4007h,CLKMD
stm #0,GPIOSR
stm #0FFh,GPIOCR ;通用I/0设为输出
;ovly=1 in PMST
;
stm #0AFFFh,SWWSR ;I/O 软等待数为#X
; stm #1101101101101101B,SWWSR
; stm #0010011011011011B,SWWSR ;I/O 软等待数为#X
; stm #SWSM,SWCR ;等待数*2
;**************************************
;
;**************************************
ld #0h,A
stm #0h,AR7
stm #0h,AR6
stm #0h,AR5
stm #0h,AR4
stm #0h,AR3
stm #0h,AR2
stm #0h,AR1
stm #write_word,AR5 ;
stm #write_word_adr,AR6 ;
main_prog:
; call #exit_mode
nop
nop
nop
call #delay_150ns
; call #erase_chip
nop
nop
nop
call #delay_100ms
nop
loop:
nop
nop
call #write_one_word
call #delay_150ns
b loop
;**************************************
exit_mode:
stm #mode_exit_sfd,AR1 ;exit any mode
stm #common_adr,AR2 ;commond address
; rpt #(3-1)
; mvdp *AR1+,*AR2+
ld #0h,A
or *AR2+,A
ld *AR1,B
writa *AR1+
ld #0h,A
or *AR2+,A
ld *AR1,B
writa *AR1+
ld #0h,A
or *AR2+,A
ld *AR1,B
writa *AR1+
ret
;**************************************
erase_chip:
stm #chip_erase_sfd,AR1 ;erase commond
stm #erase_sfd_adr,AR2 ;erase commond address
; rpt #(6-1)
; mvdp *AR1+,*AR2+
ld #0h,A
or *AR2+,A
ld *AR1,B
writa *AR1+
ld #0h,A
or *AR2+,A
ld *AR1,B
writa *AR1+
ld #0h,A
or *AR2+,A
ld *AR1,B
writa *AR1+
ld #0h,A
or *AR2+,A
ld *AR1,B
writa *AR1+
ld #0h,A
or *AR2+,A
ld *AR1,B
writa *AR1+
ld #0h,A
or *AR2+,A
ld *AR1,B
writa *AR1+
ret
;**************************************
write_one_word:
stm #word_prog_sfd,AR3 ;program one word commond
stm #common_adr,AR4 ;commond address
; stm #write_word,AR5 ;defined in AR5 before call subprogram
; stm #write_word_adr,AR6 ;defined in AR6 before call subprogram
; rpt #(3-1)
; mvdd *AR3+,*AR4+
; mvdd *AR5+,*AR6+
ld #0h,A
or *AR4+,A
ld *AR3,B
writa *AR3+
ld #0h,A
or *AR4+,A
ld *AR3,B
writa *AR3+
ld #0h,A
or *AR4+,A
ld *AR3,B
writa *AR3+
ld #0h,A ;write one word
; or *AR6+,A
ldm AR6,A
ld *AR5,B
writa *AR5+
add #1,A
stlm A,AR6
NOP
NOP
NOP
ret
;**************************************
;delay_150ns
;**************************************
delay_150ns
ld #200,B
loop_delay10
sub #1,B ;20MHz = 50*4*200ns=40us
nop
bc loop_delay10,BNEQ
nop
nop
nop
ret
;**************************************
;delay_100ms
;**************************************
delay_100ms
ld #400,A
loop_delay1
ld #5000,B
loop_delay11
sub #1,B ;20MHz = 50*4*5000ns=1ms
nop
bc loop_delay11,BNEQ
sub #1,A ;20MHz = 1ms*100=100ms
bc loop_delay1,ANEQ
nop
ret
;**************************************
;delay_20ms
;**************************************
delay_20ms
ld #20,A
loop_delay2
ld #5000,B
loop_delay21
sub #1,B ;20MHz = 50*4*5000ns=1ms
nop
bc loop_delay21,BNEQ
sub #1,A ;20MHz = 1ms*20=20ms
bc loop_delay2,ANEQ
nop
nop
nop
ret
;**************************************
.end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -