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

📄 pdrun.s

📁 周立功easyarm2200平台第三章试验源码
💻 S
字号:
;****************************************************************************** 
; File:PDRUN.S
; 功能:系统进入掉电状态,并允许外部中断1唤醒。每唤醒一次,LED1--LED8显示值加1。
; 说明:将跳线器JP8短接。
;****************************************************************************** 
				INCLUDE		LPC2294.INC
				EXPORT  	MAIN

VIC_BASE		EQU		0xFFFFF000				

StackUsrSize	EQU		50				; 定义用户模式堆栈大小(单位为字)
StackIRQSize	EQU		50				; 定义IRQ模式堆栈大小(单位为字)		

; 定义SPI控制口
SPI_CS			EQU	    0x00000100		; P0.8
SPI_DATA		EQU	    0x00000040		; P0.6
SPI_CLK			EQU	    0x00000010		; P0.4

SPI_IOCON		EQU	    0x00000150		; SPI接口的I/O设置字
		

			AREA   	PDRUNC,CODE,READONLY 
		    ENTRY
		    CODE32
		    
MAIN		MSR     CPSR_c,#0xD2		; 初始化堆栈 
        	LDR     SP,=StackIRQ + (StackIRQSize-1)*4
        	MSR     CPSR_c, #0x5F
        	LDR     SP,=StackUsr + (StackUsrSize-1)*4
        	
        	LDR		R0,=MEMMAP
    		MOV		R1,#0x03
			STR		R1,[R0]				; REMAP操作(若写到片内FLASH,则不需要REMAP)
        	
			BL		INIT_PIN			; 初始化I/O
			BL		INIT_EINT1			; 初始化EINT1
						
			LDR		R0,=PCONP
			MOV		R1,#0x800
			STR		R1,[R0]				; 关闭片内外设(使用外部程序存储器,PCEMC为1)
			MOV		R7,#0
MAIN_LOOP	MVN		R2,R7
			BL		HC595_SENDDAT
			LDR		R0,=PCON
			MOV		R1,#0x01
			STR		R1,[R0]				; PCON = 0x02,进入掉电模式
			ADD		R7,R7,#1	
			B		MAIN_LOOP
			
			
			  
;******************************************************************************	            
; 名称:INIT_EINT1
; 功能:设置EINT1为向量中断,并使能中断。
; 入口参数:无
; 出口参数:无
; 占用资源:R0、R1
;******************************************************************************	            
INIT_EINT1
			LDR		R0,=VIC_BASE
			MOV		R1,#0
			STR		R1,[R0]				; VICIRQStatus = 0
			MOV		R1,#0x2F
			STR		R1,[R0,#0x200]		; VICVectCntl0 = 0x2F
			LDR		R1,=IRQ_EINT1
			STR		R1,[R0,#0x100]		; VICVectAddr0 = IRQ_EINT1
			
			LDR		R0,=EXTWAKE
			MOV		R1,#0x02
			STR		R1,[R0]				; EXTWAKE = 0x02,允许外部中断1唤醒掉电的CPU
			
			LDR		R0,=EXTINT
			MOV		R1,#0x0F
			STR		R1,[R0]				; EXTINT = 0x0F,清除中断标志
			
			LDR		R0,=VICIntEnable
			MOV		R1,#0x00008000
			STR		R1,[R0]				; VICIntEnable = 0x00008000		
			
			MOV		PC,LR
                       


;******************************************************************************	            
; 名称:INIT_PIN
; 功能:初始化I/O。P0.14设置为EINT1,SPI控制脚设置为输出。
; 入口参数:无
; 出口参数:无
; 占用资源:R0、R1
;******************************************************************************	
INIT_PIN
			LDR     R0,=PINSEL0         ; 设置I/O口连接,P0.14设置为EINT1
            MOV     R1,#0x20000000  
            STR     R1,[R0]
            MOV     R1,#0x00000000          
            STR     R1,[R0,#4]
            
            LDR		R0,=IO0DIR			; IO0DIR = SPI_IOCON
            MOV		R1,#SPI_IOCON
            STR		R1,[R0]               
            MOV		PC,LR
           
            
;******************************************************************************		
; 名称:HC595_SENDDAT
; 功能:向74HC595发送一字节数据
; 入口参数:R2		待发送的数据,低8位有效
; 出口参数:无
; 占用资源:(R0、R1、R2、R7)
;******************************************************************************
HC595_SENDDAT
		    STMFD	SP!,{R0-R12,LR}		; 寄存器入栈保护
		    LDR	    R0,=IO0CLR		    ; SPI_CS = 0
		    MOV	    R1,#SPI_CS
		    STR	    R1,[R0]
		
		    MOV	    R7,#8
HC595_SDL1	LDR	    R0,=IO0CLR		    ; SPI_CLK = 0
		    MOV	    R1,#SPI_CLK
		    STR	    R1,[R0]
		
		    ANDS	R1,R2,#0x00000080	; 判断要发送的数据位,并设置SPI_DAT
		    LDRNE	R0,=IO0SET
		    LDREQ	R0,=IO0CLR
		    MOV	    R1,#SPI_DATA
		    STR	    R1,[R0]
		    MOV	    R2,R2,LSL #1        ; 数据左移一位
		
		    LDR	    R0,=IO0SET		    ; SPI_CLK = 1
		    MOV	    R1,#SPI_CLK
		    STR	    R1,[R0]
		
		    SUBS	R7,R7,#1
		    BNE	    HC595_SDL1		    ; 若数据未发送完毕,再次发送
		
		    LDR	    R0,=IO0SET		    ; SPI_CS = 1,输出显示数据
		    MOV	    R1,#SPI_CS
		    STR	    R1,[R0]
		
		    LDMFD	SP!,{R0-R12,PC}		; 返回            
            
            
;******************************************************************************		
; 名称:IRQ_EINT1
; 功能:外部中断处理程序
; 入口参数:无
; 出口参数:无
; 占用资源:
;******************************************************************************
IRQ_EINT1
			SUB		LR,LR,#4			; 调整LR值
			STMFD	SP!,{R0-R7,LR}		; 现场保护
			LDR		R0,=EXTINT
WAIT_UP		MOV		R1,#0x02
			STR		R1,[R0]				; EXTINT = 0x02,清除EINT1中断标志
			LDR		R1,[R0]
			CMP		R1,#0
			BNE		WAIT_UP				; 若外部中断信号仍为低电平,则循环等待
			
			LDR		R0,=VICVectAddr
			MOV		R1,#0
			STR		R1,[R0]			
			LDMFD	SP!,{R0-R7,PC}^		; 中断返回
			
			LTORG						; 声明文字池	
			

			AREA    Stacks, DATA, NOINIT
; 定义用户模式堆栈
StackUsr    SPACE   StackUsrSize*4
; 定义IRQ模式堆栈
StackIRQ	SPACE   StackIRQSize*4			
		    
            END      
            
            
		    

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -