?? idlerun.s
字號:
;******************************************************************************
; File:IDLERUN.S
; 功能:系統進行空閑狀態,并使用定時器中斷喚醒。
; 說明:將跳線器JP8_LED4短接。
;******************************************************************************
INCLUDE LPC2106.INC
LEDCON EQU 0x00002000 ; P0.13引腳控制LED,低電平點亮
AREA IDLEC,CODE,READONLY
ENTRY
CODE32
MAIN LDR R0,=PINSEL0 ; 設置I/O口連接
MOV R1,#0x00000000
STR R1,[R0],#4
MOV R1,#0x00000000
STR R1,[R0]
LDR R0,=IODIR
MOV R1,#LEDCON
STR R1,[R0] ; 設置LED控制口為輸出
MSR CPSR_c,#0xD3 ; 設置各種模式下的堆棧
LDR SP,=0x40003000
MSR CPSR_c,#0xD2
LDR SP,=0x40003100
MSR CPSR_c,#0xD1
LDR SP,=0x40003200
MSR CPSR_c,#0x10
LDR SP,=0x40003300
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
REMAPS MOV R0,#0x40000000 ; 復制中斷向量代碼,設置目標地址
LDR R1,=Vectors ; 設置源地址
LDMIA R1!,{R2-R9} ; 共復制16個字
STMIA R0!,{R2-R9}
LDMIA R1!,{R2-R9}
STMIA R0!,{R2-R9}
LDR R0,=MEMMAP ; REMAP操作
MOV R1,#0x02
STR R1,[R0]
; 控制LED快速閃爍50次,以便指示系統復位
LOOP MOV R5,#50
LEDSET LDR R1,=LEDCON
LDR R0,=IOSET
STR R1,[R0] ; LED控制的I/O置位,即LED熄滅
BL DELAYUS
LEDCLR LDR R0,=IOCLR
STR R1,[R0] ; LED控制的I/O復位,即LED點亮
BL DELAYUS
SUBS R5,R5,#1
BNE LEDSET
; 初始化定時器0,實現0.5S定時
; Fcclk=Fosc=11.0592MHz
; Fpclk=Fcclk/4=11.0592MHz/4=2.7648MHz
LDR R0,=TIMER0_BASE
MOV R1,#99
STR R1,[R0,#0x0C] ; 設置定時器預分頻為100分頻,PR=99
MOV R1,#0x03
STR R1,[R0,#0x14] ; 匹配通道0匹配中斷并復位TC,MCR=0x03
MOV R1,#27648/2
STR R1,[R0,#0x18] ; 設置匹配值,MR0=27648/2
MOV R1,#0x01
STR R1,[R0,#0x04] ; 啟動定時器,TCR=0x01
; 打開IRQ中斷,允許定時器0中斷
LDR R0,=VIC_BASE_ADDR
MOV R1,#0x00000000
STR R1,[R0,#0x0C] ; 所有中斷通道設置為IRQ中斷,VICIntSelect=0x00
MOV R1,#0x00000010
STR R1,[R0,#0x10] ; 允許定時器0中斷,VICIntEnable=0x10
POWERRUN LDR R0,=PCON
MOV R1,#0x01
STR R1,[R0] ; 進入空閑模式
LDR R0,=IOSET ; 讀取當前LED控制值
LDR R1,[R0]
ANDS R1,R1,#LEDCON
LDREQ R0,=IOSET
LDRNE R0,=IOCLR
MOV R1,#LEDCON
STR R1,[R0] ; 控制LED輸出
B POWERRUN ; 喚醒后再次進入空閑狀態
; 定義中斷向量表,用于REMAP
AREA Startup,CODE,READONLY
Vectors
LDR PC, ResetAddr
LDR PC, UndefinedAddr
LDR PC, SWI_Addr
LDR PC, PrefetchAddr
LDR PC, DataAbortAddr
NOP
LDR PC, IRQ_Addr
LDR PC, FIQ_Addr
ResetAddr DCD Reset
UndefinedAddr DCD Undefined
SWI_Addr DCD SoftwareInterrupt
PrefetchAddr DCD PrefetchAbort
DataAbortAddr DCD DataAbort
Nouse DCD 0
IRQ_Addr DCD IRQ_Handler
FIQ_Addr DCD FIQ_Handler
; 中斷服務程序
Reset
Undefined
SoftwareInterrupt
PrefetchAbort
DataAbort
B .
; IRQ中斷處理
; 定時器0中斷,喚醒CPU,清除中斷標志
IRQ_Handler
STMFD SP!,{R0,R1}
LDR R0,=T0IR
MOV R1,#0x01
STR R1,[R0]
LDMFD SP!,{R0,R1}
SUBS PC,R14,#4 ; 中斷返回
; FIQ中斷服務程序
FIQ_Handler
B .
;;******************************************************************************
; 名稱:DELAYUS
; 功能:短軟件延時
; 入口參數:無
; 出口參數:無
; 占用資源:R7
;******************************************************************************
DELAYUS
MOV R7,#0xF000 ; 延時參數
DELAYUS_L1 SUBS R7,R7,#1 ; R7 = R7-1
BNE DELAYUS_L1 ; 判斷R7-1結果是否為0,若不為0則跳轉
MOV PC,LR ; 返回
ALIGN ; 數據字對齊
LTORG ; 聲明文字池
END
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -