📄 progflash1.asm
字号:
.include "initdsp.inc"
.global _BurnOneFrame
.mmregs
.sect ".text" ;此段放入.text段中
.bss _FlashBuffer1,128
.global _FlashBuffer1
.bss FLASH_CMD1, 1
.bss FLASH_CMD2, 1
.bss FLASH_CMD3, 1
.bss FLASH_CMD4, 1
.bss FLASH_CMD5, 1
.bss FLASH_CMD6, 1
.bss FLASH_CMD7, 1
.bss FLASH_CMD8, 1
.bss _FLASH_START, 1;烧写的起始地址
.global _FLASH_START
.bss Device_Code, 1
.bss TestData, 1
;.bss DataToggleTmp, 1;读取数据的D6进行比较
;宏定义
Software_ID_Entry .macro ;Software ID Entry
nop
nop
stm #FLASH_CMD1,ar2 ;发送第一个命令
stm #0D555H,ar3
mvdd *ar2,*ar3
nop
nop
stm #FLASH_CMD2,ar2 ;发送第二个命令
stm #0AAAAH,ar3
mvdd *ar2,*ar3
nop
nop
stm #FLASH_CMD3,ar2 ;发送第三个命令
stm #0D555H,ar3
mvdd *ar2,*ar3
nop
nop
.endm
Software_ID_Exit .macro ;Software ID Exit
nop
nop
stm #FLASH_CMD1,ar2 ;发送第一个命令
stm #0D555H,ar3
mvdd *ar2,*ar3
nop
nop
stm #FLASH_CMD2,ar2 ;发送第二个命令
stm #0AAAAH,ar3
mvdd *ar2,*ar3
nop
nop
stm #FLASH_CMD4,ar2 ;发送第四个命令
stm #0D555H,ar3
mvdd *ar2,*ar3
nop
nop
.endm
Software_Chip_Erase .macro ;Software Chip Erase
nop
nop
stm #FLASH_CMD1,ar2 ;发送第一个命令
stm #0D555H,ar3
mvdd *ar2,*ar3
nop
nop
stm #FLASH_CMD2,ar2 ;发送第二个命令
stm #0AAAAH,ar3
mvdd *ar2,*ar3
nop
nop
stm #FLASH_CMD5,ar2 ;发送第五个命令
stm #0D555H,ar3
mvdd *ar2,*ar3
nop
nop
stm #FLASH_CMD1,ar2 ;发送第一个命令
stm #0D555H,ar3
mvdd *ar2,*ar3
nop
nop
stm #FLASH_CMD2,ar2 ;发送第二个命令
stm #0AAAAH,ar3
mvdd *ar2,*ar3
nop
nop
stm #FLASH_CMD6,ar2 ;发送第六个命令
stm #0D555H,ar3
mvdd *ar2,*ar3
nop
nop
.endm
Software_Data_Protect_Disable .macro ;Software_Data_Protect_Disable
nop
nop
stm #FLASH_CMD1,ar2 ;发送第一个命令
stm #0D555H,ar3
mvdd *ar2,*ar3
nop
nop
stm #FLASH_CMD2,ar2 ;发送第二个命令
stm #0AAAAH,ar3
mvdd *ar2,*ar3
nop
nop
stm #FLASH_CMD5,ar2 ;发送第五个命令
stm #0D555H,ar3
mvdd *ar2,*ar3
nop
nop
stm #FLASH_CMD1,ar2 ;发送第一个命令
stm #0D555H,ar3
mvdd *ar2,*ar3
nop
nop
stm #FLASH_CMD2,ar2 ;发送第二个命令
stm #0AAAAH,ar3
mvdd *ar2,*ar3
nop
nop
stm #FLASH_CMD7,ar2 ;发送第七个命令
stm #0D555H,ar3
mvdd *ar2,*ar3
nop
nop
.endm
Page_Write .macro ;Page Write
nop
nop
stm #FLASH_CMD1,ar2 ;发送第一个命令
stm #0D555H,ar3
mvdd *ar2,*ar3
nop
nop
stm #FLASH_CMD2,ar2 ;发送第二个命令
stm #0AAAAH,ar3
mvdd *ar2,*ar3
nop
nop
stm #FLASH_CMD8,ar2 ;发送第八个命令
stm #0D555H,ar3
mvdd *ar2,*ar3
nop
nop
.endm
StatusDetection:
nop
nop
;stm #DataToggleTmp,ar2;//
;//stm #0D555H,ar3
stm #23h,ar6;//这是一个任意数
nop
DataToggleLoopStart:
nop
nop
mvmm ar0,ar6;//将以前的值保存
ld *(0ffffh),a;//从任意地址读数据
nop
nop
and #40h,a;//只取D6
nop
nop
stlm a,ar0
nop
nop
cmpr EQ,ar6;//让ar6与ar0比较
nop
nop
BC DataToggleLoopEnd,TC;//两次的数据相同
nop
nop
B DataToggleLoopStart
DataToggleLoopEnd:
nop
nop
ret
_BurnOneFrame:
pshm st0 ;保护DP
ld #0,DP ;数据页空间设置为0
st #00aah,*(FLASH_CMD1);//填写命令字
st #0055h,*(FLASH_CMD2)
st #0090h,*(FLASH_CMD3)
st #00f0h,*(FLASH_CMD4)
st #0080h,*(FLASH_CMD5)
st #0010h,*(FLASH_CMD6)
st #0020h,*(FLASH_CMD7)
st #00a0h,*(FLASH_CMD8)
st #8080h,*(TestData);烧写的起始地址为8000h
nop
nop
; stm #8001h,ar2
; stm #Device_Code,ar3
; stm 100,brc
; rptb sss-1
; nop
; nop
; mvdd *ar2+,*ar3
; nop
; nop
;sss:
; Software_ID_Entry
; stm #8000h,ar2
; nop
; nop
; stm #Device_Code,ar3
; nop
; nop
; mvdd *ar2+,*ar3;读厂商代码 0xbf
; nop
; nop
; mvdd *ar2,*ar3;读器件代码 0x12
; nop
; nop
; Software_ID_Exit
; nop
; nop
; call Delay10ms
; nop
; nop
; Software_Chip_Erase
; call Delay10ms
; nop
; nop
Page_Write
mvdm *(_FLASH_START),ar5
nop
nop
stm _FlashBuffer1,ar2
nop
nop
stm #127,brc
rptb OneByteOver-1
nop
nop
; st #0cch,*(TestData)
nop
nop
;stm TestData,ar2
nop
nop
mvdd *ar2+,*ar5+;按页写
nop
nop
nop
nop
OneByteOver:
;call Delay10ms
nop
call StatusDetection
nop
;mvmd *(ar5),_FLASH_START
;mvdd *ar2,*ar3;读器件代码 0x12
nop
popm st0
nop
nop
ret
Delay10ms: stm #0100h, brc
rptb Delay1ms-1
stm #0100h,ar4 ;此时CPU速度为8MHz
Delay1us: banz Delay1us,*ar4-
nop
nop
Delay1ms:
nop
ret
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -