📄 sst39vf160.s
字号:
;******************************************************************************
; 文件名:SST39VF160.S
; 功能:对SST39VF160进行全片擦除,然后写两字节数据到芯片0地址,再读出来校验,
; 若校验通过则蜂鸣器响一声,否则不断地蜂鸣报警。
; 说明:将跳线器JP9短接,JP4断开。
;******************************************************************************
INCLUDE LPC2294.INC
EXPORT MAIN
BEEPCON EQU 0x00000080 ; P0.7引脚控制B1,低电平蜂鸣
FLASH_ADDR EQU 0x81000000 ; FLASH的起始地址(分配为Bank1块)
ADDR_5555H EQU (FLASH_ADDR|0xAAAA) ; 由于SST39VF160的A0是与LPC2210的A1相连,所以0x5555要左移1位。
ADDR_2AAAH EQU (FLASH_ADDR|0x5554) ; 由于SST39VF160的A0是与LPC2210的A1相连,所以0x2AAA要左移1位。
AREA SST39VF160C,CODE,READONLY ; 声明程序代码块
ENTRY ; 程序入口
MAIN LDR R0,=PINSEL0 ; 装载寄存器地址,PINSEL0
MOV R1,#0x00000000 ; 设置数据,即设置管脚连接GPIO
STR R1,[R0] ; R1 -> [R0]
LDR R0,=PINSEL1
STR R1,[R0]
LDR R0,=IO0DIR
LDR R1,=BEEPCON
STR R1,[R0] ; 设置BEEP控制口为输出
BL FLASH_ERASE
CMP R0,#1
BNE OP_ERR
LDR R0,=0
LDR R1,=0x55AA
BL FLASH_WRITE
CMP R0,#1
BNE OP_ERR
LDR R1,=BEEPCON ; 设置GPIO控制参数
BEEPCLR LDR R0,=IO0CLR
STR R1,[R0] ; BEEP控制I/O复位
BL DELAYS
BL DELAYS
BL DELAYS
BL DELAYS
BEEPSET LDR R0,=IO0SET
STR R1,[R0] ; BEEP控制I/O置位
BL DELAYS
B .
OP_ERR LDR R1,=BEEPCON ; 设置GPIO控制参数
LDR R0,=IO0CLR
STR R1,[R0] ; BEEP控制I/O复位
BL DELAYS
LDR R0,=IO0SET
STR R1,[R0] ; BEEP控制I/O置位
BL DELAYS
B OP_ERR
;******************************************************************************
; 名称:FLASH_WRITE
; 功能:半字(16位)数据编程。
; 入口参数:R 0 编程地址(SST39VF160内部地址)
; R1 编程数据(低16位有效)
; 出口参数:R0 为1时表示操作成功,为0时表示操作失败
; 占用资源:R0、R1、R2、R3
;******************************************************************************
FLASH_WRITE
MOV R2,R0,LSL #1 ; 将编程地址进行转换,然后复制到R2
MOV R3,R1 ; 将编程数据复制到R3
LDR R0,=ADDR_5555H
MOV R1,#0xAA
STRH R1,[R0] ; 第一个写周期,地址0x5555,数据0xAA
LDR R0,=ADDR_2AAAH
MOV R1,#0x55
STRH R1,[R0] ; 第二个写周期,地址0x2AAA,数据0x55
LDR R0,=ADDR_5555H
MOV R1,#0xA0
STRH R1,[R0] ; 第三个写周期,地址0x5555,数据0xA0
LDR R0,=FLASH_ADDR
ADD R0,R0,R2
STRH R3,[R0] ; 第四个写周期,地址Addr,数据Data
WAIT_WRITE LDRH R1,[R0] ; 等待操作完成 (若编程操作没有完成,每次读操作DQ6会跳变)
LDRH R2,[R0]
CMP R1,R2
BNE WAIT_WRITE
CMP R1,R3
MOVEQ R0,#1
MOVNE R0,#0
MOV PC,LR
;******************************************************************************
; 名称:FLASH_ERASE
; 功能:芯片全片擦除。
; 入口参数:无
; 出口参数:R0 为1时表示操作成功,为0时表示操作失败
; 占用资源:R0、R1、R2
;******************************************************************************
FLASH_ERASE
LDR R0,=ADDR_5555H
MOV R1,#0xAA
STRH R1,[R0] ; 第一个写周期,地址0x5555,数据0xAA
LDR R0,=ADDR_2AAAH
MOV R1,#0x55
STRH R1,[R0] ; 第二个写周期,地址0x2AAA,数据0x55
LDR R0,=ADDR_5555H
MOV R1,#0x80
STRH R1,[R0] ; 第三个写周期,地址0x5555,数据0x80
MOV R1,#0xAA
STRH R1,[R0] ; 第四个写周期,地址0x5555,数据0xAA
LDR R0,=ADDR_2AAAH
MOV R1,#0x55
STRH R1,[R0] ; 第五个写周期,地址0x2AAA,数据0x55
LDR R0,=ADDR_5555H
MOV R1,#0x10
STRH R1,[R0] ; 第六个写周期,地址0x5555,数据0x10
WAIT_ERASE LDRH R1,[R0] ; 等待操作完成 (若擦除操作没有完成,每次读操作DQ6会跳变)
LDRH R2,[R0]
CMP R1,R2
BNE WAIT_ERASE
LDR R2,=0xFFFF
CMP R1,R2
MOVEQ R0,#1
MOVNE R0,#0
MOV PC,LR
;******************************************************************************
; 名称:DELAYS
; 功能:软件延时
; 入口参数:无
; 出口参数:无
; 占用资源:R7
;******************************************************************************
DELAYS
MOV R7,#0x00005F00 ; 延时参数
DELAYS_L1 SUBS R7,R7,#1 ; R7 = R7-1
BNE DELAYS_L1 ; 判断R7-1结果是否为0,若不为0则跳转
MOV PC,LR ; 返回
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -