⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sst39vf160.s

📁 周立功《ARM与嵌入式系统基础教程》第5章
💻 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 + -