📄 flash.asm
字号:
**********************************************************************************
* flash.asm v1.00 烧写程序 *
* 版权(c) 2004- 北京百科融创科技有限公司 *
* 设计者: 赵治心 *
* 邮箱: ourui.wl@263.net *
**********************************************************************************/
.def _c_int00
.mmregs
SWCR .set 2BH
Flash_a1 .set 0d555h
Flash_a2 .set 0aaaah
Flash_page .set 0h
Polling_Bit .set 0080h
Flash_block .set 8000h
Code_addr .set 2000h
Code_length .set 2d00h
Flash_addr .set 8000h
STACK .usect "STK",100
.bss Temp,1
.text
_c_int00:
SSBX CPL
RSBX SXM
STM #7FFFH,SWWSR
STM #0ffe3H,PMST
STM #0FFFEH,SWCR
STM #STACK+100h,sp ;设置堆栈指针
LD #00h,dp
STM #0b, CLKMD ;switch to DIV mode
TstStatu:
LDM CLKMD, A
AND #01b, A ;poll STATUS bit
BC TstStatu, ANEQ
STM #1111001111101111b, CLKMD ;switch to PLL
RPT #1000
NOP
STM #0000h,imr ;屏蔽所有中断
;初始化cpu完毕
CALL Flash_erasechip
STM #15H,AR2
DELAY
RPT #0FFFFH
NOP
BANZ DELAY,*AR2-
START_PROG: ;开始烧写FLASH
ST #0, *(Temp)
STM #Flash_addr,AR4 ;设置FLASH的开始烧写的地址
STM #Code_addr,AR3 ;被烧写的源程序起始地址
STM #Code_length-1,BRC ;写入的字节数
RPTB LOOP1
CALL Flash_writes ;烧写FLASH
NOP
NOP
LOOP1: NOP
STM #0FFFFH,AR4 ;向数据空间的FFFF地址写入自举表的首地址8000H
CALL Flash_writeword
NOP ;烧写结束
NOP
STM #Flash_addr,AR3
LD #0,B
STM #Code_length-1,BRC ;校验
RPTB LOOP2
ADD *AR3+, B
NOP
LOOP2:
NOP
STL B,*(AR2)
LD *(AR2),B
NOP
NOP
SUB *(Temp),B
BC ERROR,BNEQ
RIGHT
B $
ERROR
B START_PROG
*********************************************************************************
*********************************************************************************
* FLASH的操作 *
*********************************************************************************
Flash_erasechip:
STM #Flash_a1,AR2
ST #00AAH,*AR2 ; AAH -> (X5555H)
NOP
NOP
STM #Flash_a2,AR2
ST #0055H,*AR2 ; 55H -> (X2AAAH)
NOP
NOP
STM #Flash_a1,AR2
ST #0080H,*AR2 ; 80H -> (X5555H)
NOP
NOP
STM #Flash_a1,AR2
ST #00AAH,*AR2 ; AAH -> (X5555H)
NOP
NOP
STM #Flash_a2,AR2
ST #0055H,*AR2 ; 55H -> (X2AAAH)
NOP
NOP
STM #Flash_a1,AR2
ST #0010H,*AR2 ; 10H -> (X5555H)
NOP
NOP
RET
Flash_eraseblock:
STM #Flash_a1,AR2
ST #00AAH,*AR2
NOP ; AAH -> (X5555H)
NOP
STM #Flash_a2,AR2
ST #0055H,*AR2
NOP ; 55H -> (X2AAAH)
NOP
STM #Flash_a1,AR2
ST #0080H,*AR2
NOP ; 80H -> (X5555H)
NOP
STM #Flash_a1,AR2
ST #00AAH,*AR2
NOP ; AAH -> (X5555H)
NOP
STM #Flash_a2,AR2
ST #0055H,*AR2
NOP ; 55H -> (X2AAAH)
NOP
STM #Flash_a1,AR2
ST #0050H,*AR2
NOP ; 10H -> (X5555H)
NOP
NOP
RPT #0A200H
NOP
RET
Flash_writes:
STM #Flash_a1,AR2
ST #0AAAAh,*AR2 ; AAH -> (X5555H)
NOP
NOP
STM #Flash_a2,AR2
ST #05555H,*AR2 ; 55H -> (X2AAAH)
NOP
NOP
STM #Flash_a1,AR2
ST #0A0A0h,*AR2 ; A0H -> (X5555H)
NOP
NOP
LD *AR3, A
STL A, *AR4
NOP
NOP
RPT #01200h
NOP
CALL Check_Toggle_Ready
LD *(Temp),A
ADD *AR3+,A
STL A,*(Temp)
RET
Check_Toggle_Ready: ;need A has been stored the destination address
LD *AR4, A
AND #0x4040,A
LoopTog:
NOP
NOP
LD *AR4+,B
AND #0x4040,B
SUB A,B
BC LoopTog,BNEQ
NOP
NOP
RET
Flash_writeword:
STM #Flash_a1,AR2
ST #00AAh,*AR2 ; AAH -> (X5555H)
NOP
NOP
STM #Flash_a2,AR2
ST #0055H,*AR2 ; 55H -> (X2AAAH)
NOP
NOP
STM #Flash_a1,AR2
ST #00A0h,*AR2 ; A0H -> (X5555H)
NOP
NOP
LD #8000H, A
STL A, *AR4
NOP
NOP
RPT #01200h
NOP
CALL Check_Toggle_Ready
NOP
NOP
RET
.end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -