?? flash.asm
字號:
*********************************************************************************
* MEMORY.ASM v1.00 *
* 版權(c) 2003- 北京合眾達電子技術有限責任公司 *
* 設計者: 段立鋒 *
*********************************************************************************
.file "flash.asm"
.c_mode
.mmregs
.copy "vc5402.inc" ; VC5402 Memory-Mapped Register Declaration
.copy "flash.inc" ; SEED DEC5416 Memory-Mapped Register Declaration
.def _flash_erase
.def _flash_writes
.def _flash_writem
.def _flash_reads
.def _flash_readm
.text
*********************************************************************************
* FLASH的操作 *
*********************************************************************************
*********************************************************************************
* *
* 函數定義:uint _flash_erase(uint addr, uint type) *
* 功 能:Flash扇區/塊/整片擦除操作 *
* *
* 入口參數:A ---- 地址addr *
* 扇區擦除:Amsb~A11,每個扇區2K *
* 塊擦除 :Amsb~A15,每個塊32K *
* 整片擦除:5555H *
* Amsb: A16,Flash用SST39VF200時 *
* A17,Flash用SST39VF400時(缺省) *
* A18,Flash用SST39VF800時 *
* Flash定位在程序儲存空間0x4000000~401FFFFH *
* ~403FFFFH(缺省) *
* ~407FFFFH *
* 地址addr為從0開始的偏移地址,而非Flash的絕對地址 *
* (SP+n) ---- 操作類型type,如果是.far_mode模式則n為2,否則n為1 *
* 扇區擦除:30H *
* 塊擦除: 50H *
* 整片擦除:10H *
* 出口參數:A ---- 擦除標志 *
* 未擦干凈:00H *
* 已擦干凈:01H *
* 資源使用:B,AR0 *
* *
*********************************************************************************
_flash_erase:
STM #SWWSR_VALI,SWWSR ; 配置軟件等待寄存器
STM #SWCR_VALI,SWCR
STM #Flash_base,AH
PSHM AL ; 保存地址
STM #Flash_5555,AL
STM #Flash_UL1,BL
WRITA *(BL) ; AAH -> (405555H)
NOP
NOP
STM #Flash_2AAA,AL
STM #Flash_UL2,BL
WRITA *(BL) ; 55H -> (402AAAH)
NOP
NOP
STM #Flash_5555,AL
STM #Flash_ERASE,BL
WRITA *(BL) ; 80H -> (405555H)
NOP
NOP
STM #Flash_5555,AL
STM #Flash_UL1,BL
WRITA *(BL) ; AAH -> (405555H)
NOP
NOP
STM #Flash_2AAA,AL
STM #Flash_UL2,BL
WRITA *(BL) ; 55H -> (82AAAH)
NOP
NOP
STM #Flash_5555,AL
STM #10H,BL
WRITA *(BL) ; 10H -> (82AAAH)
NOP
NOP
POPM AL ; 恢復地址
.if __far_mode
WRITA 2H ; type -> (addr)
.else
WRITA 1H
.endif
erase_poll: READA *(BL)
BITF *(BL),#Polling_Bit
BC erase_poll,NTC ; 查詢擦除是否完成?
STM #00H,AH
.if __far_mode
CMPM 2H,#Flash_SE
BC verify_SE,TC ; 扇區擦除時,轉verify_SE
CMPM 2H,#Flash_BE
BC verify_BE,TC ; 塊擦除時,轉verify_BE
CMPM 2H,#Flash_CE
BC verify_CE,TC ; 整片擦除時,轉verify_CE
LD #0,A ; 不是上述3種擦除操作,則置未擦除干凈標志,返回
FRET
.else
CMPM 1H,#Flash_SE
BC verify_SE,TC ; 扇區擦除時,轉verify_SE
CMPM 1H,#Flash_BE
BC verify_BE,TC ; 塊擦除時,轉verify_BE
CMPM 1H,#Flash_CE
BC verify_CE,TC ; 整片擦除時,轉verify_CE
LD #0,A ; 不是上述3種擦除操作,則置未擦除干凈標志,返回
RET
.endif
verify_SE: SFTL A,Flash_SBIT
OR #Flash_base,16,A ; A = 被擦除扇區的起始地址
BD verify_erase
LD #Flash_SSIZE,B ; B = 扇區大小
verify_BE: SFTL A,Flash_BBIT
OR #Flash_base,16,A ; A = 被擦除塊的起始地址
BD verify_erase
LD #Flash_BSIZE,B ; B = 塊大小
verify_CE: LD #Flash_base,16,A ; A = Flash起始地址
LD #Flash_CSIZE,4,B ; B = Flash大小
verify_erase: READA *(AR0)
CMPM *(AR0),#Flash_BLANK
BCD erase_end,NTC
XC 1,NTC
LD #0,A ; 置未擦除干凈標志
ADD #ONE,A
SUB #ONE,B
BC verify_erase,BNEQ
LD #1,A ; 置擦除干凈標志,返回
erase_end: .if __far_mode
FRET
.else
RET
.endif
*********************************************************************************
* *
* 函數定義:uint _flash_writes(ulong addr, uint data) *
* 功 能:將數據data寫入addr所指定的Flash單元 *
* *
* 入口參數:A ---- 地址addr,Amsb~A0 *
* Amsb: A16,Flash用SST39VF200時 *
* A17,Flash用SST39VF400時(缺省) *
* A18,Flash用SST39VF800時 *
* Flash定位在程序儲存空間80000H~9FFFFH/BFFFFH(缺省)/FFFFFH *
* 地址addr為從0開始的偏移地址,而非Flash的絕對地址 *
* (SP+n) ---- 數據data,如果是.far_mode模式則n為2,否則n為1 *
* 出口參數:A ---- 寫入標志 *
* 未寫入:00H *
* 已寫入:01H *
* 資源使用:B *
* *
*********************************************************************************
_flash_writes: PSHM AL
PSHM AH ; 保存地址
STM #Flash_base,AH
STM #Flash_5555,AL
STM #Flash_UL1,BL
WRITA *(BL) ; AAH -> (85555H)
STM #Flash_2AAA,AL
STM #Flash_UL2,BL
WRITA *(BL) ; 55H -> (82AAAH)
STM #Flash_5555,AL
STM #Flash_PRG,BL
WRITA *(BL) ; A0H -> (85555H)
POPM AH ; 恢復地址
POPM AL
OR #Flash_base,16,A
.if __far_mode
WRITA 2H ; data -> (addr)
.else
WRITA 1H
.endif
write_poll:
nop
READA *(BL)
.if __far_mode
XOR 2H,B ; data ^ B
.else
XOR 1H,B
.endif
BITF *(BL),#Polling_Bit
BC write_poll,TC ; 查詢寫操作是否完成?
NOP
NOP
STM #ZERO,BH ; 驗證寫操作
LD #1,A ; 正確,A = 1
XC 1,BNEQ
; BD write_poll
LD #0,A ; 錯誤,A = 0
.if __far_mode
FRET
.else
RET
.endif
*********************************************************************************
* *
* 函數定義:uint _flash_writem(ulong addr, uint * ptr, uint length) *
* 功 能:將ptr所指向的數據緩沖區中的length個數據寫入addr所指定的Flash單元 *
* *
* 入口參數:A ---- 地址addr,Amsb~A0 *
* Amsb: A16,Flash用SST39VF200時 *
* A17,Flash用SST39VF400時(缺省) *
* A18,Flash用SST39VF800時 *
* Flash定位在程序儲存空間80000H~9FFFFH/BFFFFH(缺省)/FFFFFH *
* 地址addr為從0開始的偏移地址,而非Flash的絕對地址 *
* (SP+n) ---- 數據緩沖區起始地址ptr,如果是.far_mode模式則n為2,否則n為1 *
* (SP+m) ---- 數據長度lrngth,如果是.far_mode模式則m為3,否則m為2 *
* 出口參數:A ---- 寫入標志 *
* 未寫入:00H *
* 已寫入:01H *
* 資源使用:B,AR0 *
* *
*********************************************************************************
_flash_writem: .if __far_mode
LDU 2H,B
.else
LDU 1H,B
.endif
STLM B,AR0 ; AR0 ← 數據起始地址
writem_loop: PSHM AL ; 保存地址
PSHM AH
.if __far_mode
FRAME -2
LDU *AR0+,B ; 取數據
STL B,0H ; 傳遞數據
FCALL _flash_writes
RC AEQ ; 未寫入,則A = 0,返回
FRAME 2
POPM AH
POPM AL
ADD #ONE,A ; Flash地址+1
ADDM #-1,3H
CMPM 3H,#ZERO
.else
FRAME -1
LDU *AR0+,B ; 取數據
STL B,0H ; 傳遞數據
CALL _flash_writes
; RC AEQ ; 未寫入,則A = 0,返回
FRAME 1
POPM AH
POPM AL
ADD #ONE,A ; Flash地址+1
ADDM #-1,2H
CMPM 2H,#ZERO
.endif
BC writem_loop,NTC
LD #1,A ; 已寫入,則A = 1,返回
.if __far_mode
FRET
.else
RET
.endif
*********************************************************************************
* *
* 函數定義:uint _flash_reads(ulong addr) *
* 功 能:從addr指定的Flash單元中讀出一個數據 *
* *
* 入口參數:A ---- 地址addr,Amsb~A0 *
* Amsb: A16,Flash用SST39VF200時 *
* A17,Flash用SST39VF400時(缺省) *
* A18,Flash用SST39VF800時 *
* Flash定位在程序儲存空間80000H~9FFFFH/BFFFFH(缺省)/FFFFFH *
* 地址addr為從0開始的偏移地址,而非Flash的絕對地址 *
* 出口參數:A ---- 讀出數據 *
* 資源使用:A *
* *
*********************************************************************************
_flash_reads: OR #Flash_base,16,A
READA *(AL)
.if __far_mode
FRET
.else
RET
.endif
*********************************************************************************
* *
* 函數定義:void _flash_readm(ulong addr, uint * ptr, uint length) *
* 功 能:從addr指定的Flash單元中讀出length數據到ptr所指向的數據緩沖區中 *
* *
* 入口參數:A ---- 地址addr,Amsb~A0 *
* Amsb: A16,Flash用SST39VF200時 *
* A17,Flash用SST39VF400時(缺省) *
* A18,Flash用SST39VF800時 *
* Flash定位在程序儲存空間80000H~9FFFFH/BFFFFH(缺省)/FFFFFH *
* 地址addr為從0開始的偏移地址,而非Flash的絕對地址 *
* (SP+n) ---- 數據緩沖區起始地址ptr,如果是.far_mode模式則n為2,否則n為1 *
* (SP+m) ---- 數據長度length,如果是.far_mode模式則m為3,否則m為2 *
* 出口參數:A ---- 讀出數據 *
* 資源使用:B,AR0 *
* *
*********************************************************************************
_flash_readm: OR #Flash_base,16,A
.if __far_mode
LDU 2H,B
.else
LDU 1H,B
.endif
STLM B,AR0 ; AR0 ← 數據起始地址
readm_loop: READA *AR0+
ADD #ONE,A ; Flash地址+1
.if __far_mode
ADDM #-1,3H
CMPM 3H,#ZERO
.else
ADDM #-1,2H
CMPM 2H,#ZERO
.endif
BC readm_loop,NTC
.if __far_mode
FRET
.else
RET
.endif
.end
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -