;******************************************************************************
; 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