?? memory.asm
字號:
*********************************************************************************
* MEMORY.ASM v1.00 *
* 版權(c) 2003- 北京合眾達電子技術有限責任公司 *
* 設計者: 段立鋒 *
*********************************************************************************
.file "memory.asm"
.c_mode
.mmregs
.copy "vc54x.inc" ; VC5402 Memory-Mapped Register Declaration
.copy "dec5416.inc" ; SEED DEC5416 Memory-Mapped Register Declaration
.def _flash_erase
.def _flash_writes
.def _flash_writem
.def _flash_reads
.def _flash_readm
.def _progm_readm
.def _progm_writem
.def _progm_reads
.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為從A11開始的偏移地址,而非Flash的絕對地址 *
* (SP+n) ---- 操作類型type,如果是.far_mode模式則n為2,否則n為1 *
* 扇區擦除:30H *
* 塊擦除: 50H *
* 整片擦除:10H *
* 出口參數:A ---- 擦除標志 *
* 未擦干凈:00H *
* 已擦干凈:01H *
* 資源使用:B,AR0 *
* *
*********************************************************************************
_flash_erase: PSHM SWWSR ;保存當前的系統等待時間
LDM SWWSR,B
OR #03FH,B ;設置系統為14個等待
STLM B,SWWSR
PSHM AH
PSHM AL ; 保存地址
STM #Flash_base,AH
STM #Flash_5555,AL
STM #Flash_UL1,BL
WRITA *(BL) ; AAH -> (405555H)
STM #Flash_2AAA,AL
STM #Flash_UL2,BL
WRITA *(BL) ; 55H -> (402AAAH)
STM #Flash_5555,AL
STM #Flash_ERASE,BL
WRITA *(BL) ; 80H -> (405555H)
STM #Flash_5555,AL
STM #Flash_UL1,BL
WRITA *(BL) ; AAH -> (405555H)
STM #Flash_2AAA,AL
STM #Flash_UL2,BL
WRITA *(BL) ; 55H -> (82AAAH)
POPM AL ; 恢復地址
POPM AH
NOP
NOP
NOP
.if __far_mode
WRITA 3H ; type -> (addr)
.else
WRITA 2H
.endif
erase_poll: READA *(BL)
BITF *(BL),#Polling_Bit
NOP
NOP
BC erase_poll,NTC ; 查詢擦除是否完成?
;STM #00H,AH
.if __far_mode
CMPM 3H,#Flash_SE
BC verify_SE,TC ; 扇區擦除時,轉verify_SE
CMPM 3H,#Flash_BE
BC verify_BE,TC ; 塊擦除時,轉verify_BE
CMPM 3H,#Flash_CE
BC verify_CE,TC ; 整片擦除時,轉verify_CE
POPM SWWSR
LD #0,A ; 不是上述3種擦除操作,則置未擦除干凈標志,返回
FRET
.else
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
POPM SWWSR
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: POPM SWWSR
.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 SWWSR ;保存當前的系統等待時間
LDM SWWSR,B
OR #03FH,B ;設置系統為14個等待
STLM B,SWWSR
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 3H ; data -> (addr)
.else
WRITA 2H
.endif
write_poll: READA *(BL)
NOP
NOP
.if __far_mode
XOR 3H,B ; data ^ B
.else
XOR 2H,B
.endif
NOP
NOP
NOP
BITF *(BL),#Polling_Bit
BC write_poll,TC ; 查詢寫操作是否完成?
READA *(BL)
.if __far_mode
XOR 3H,B ; data ^ B
.else
XOR 2H,B
.endif
NOP
NOP
NOP
STM #ZERO,BH ; 驗證寫操作
LD #1,A ; 正確,A = 1
XC 1,BNEQ
LD #0,A ; 錯誤,A = 0
NOP
NOP
NOP
POPM SWWSR
.if __far_mode
FRET
.else
RET
.endif
*********************************************************************************
* *
* 函數定義:uint _flash_writem(ulong addr, uint * ptr, uint length) *
* 功 能:將ptr所指向的數據緩沖區中的length個數據寫入addr所指定的Flash單元 *
* *
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -