?? idlerun.s
字號:
;******************************************************************************
; 文件名:IDLERUN.S
; 功能:系統進行空閑狀態,并使用定時器中斷喚醒。
; 說明:將跳線器JP4_LED4短接。
;******************************************************************************
INCLUDE LPC2294.INC
EXPORT MAIN
VIC_BASE EQU 0xFFFFF000
TIMER0_BASE EQU 0xE0004000
LEDCON EQU (1<<25) ; P0.25引腳控制LED4,低電平點亮
AREA IDLEC,CODE,READONLY
CODE32
MAIN MSR CPSR_c, #0x5F ; 切換處理器工作模式,并允許IRQ中斷
LDR R0,=PINSEL0 ; 設置I/O口連接
MOV R1,#0x00000000
STR R1,[R0],#4
MOV R1,#0x00000000
STR R1,[R0]
LDR R0,=IO0DIR
MOV R1,#LEDCON
STR R1,[R0] ; 設置LED控制口為輸出
BL SYSCLK_INI ; 設置系統時鐘
LDR R0,=MEMMAP
MOV R1,#0x02
STR R1,[R0] ; REMAP操作(若寫到片內FLASH,則不需要REMAP)
; 控制LED快速閃爍50次,以便指示系統復位
MOV R5,#50
LEDSET LDR R1,=LEDCON
LDR R0,=IO0SET
STR R1,[R0] ; LED4控制的I/O置位,即LED4熄滅
BL DELAYUS
LEDCLR LDR R0,=IO0CLR
STR R1,[R0] ; LED4控制的I/O復位,即LED4點亮
BL DELAYUS
SUBS R5,R5,#1
BNE LEDSET
TIME0_INI ; 初始化定時器0,實現0.5S定時
; Fcclk = Fosc*4 = 11.0592MHz*4 = 44.2368MHz
; Fpclk = Fcclk/4 = 44.2368MHz/4 = 11.0592MHz
LDR R0,=TIMER0_BASE
MOV R1,#99
STR R1,[R0,#0x0C] ; T0PR=99,設置定時器0分頻為100分頻,得110592Hz
MOV R1,#0x03
STR R1,[R0,#0x14] ; T0MCR=0x03,匹配通道0匹配中斷并復位T0TC
LDR R1,=110592/2
STR R1,[R0,#0x18] ; T0MR0=110592/2,比較值(0.5S定時值)
MOV R1,#0x01
STR R1,[R0,#0x04] ; T0TCR=0x01,啟動T0TC
; 設置定時器0中斷IRQ
LDR R0,=VIC_BASE
MOV R1,#0x00000000
STR R1,[R0,#0x0C] ; VICIntSelect=0x00000000
MOV R1,#0x24
STR R1,[R0,#0x200] ; VICVectCntl0=0x24
LDR R1,=IRQ_TIME0
STR R1,[R0,#0x100] ; VICVectAddr0=(int)IRQ_TIME0
MOV R1,#0x00000010
STR R1,[R0,#0x10] ; VICIntEnable=0x00000010
POWERRUN LDR R0,=PCON
MOV R1,#0x01
STR R1,[R0] ; 進入空閑模式
LDR R0,=IO0SET ; 讀取當前LED控制值
LDR R1,[R0]
ANDS R1,R1,#LEDCON
LDREQ R0,=IO0SET
LDRNE R0,=IO0CLR
MOV R1,#LEDCON
STR R1,[R0] ; 控制LED輸出
B POWERRUN ; 喚醒后再次進入空閑狀態
;******************************************************************************
; 名稱:SYSCLK_INI
; 功能:設置系統時鐘。(M值為4,P值為2)
; 入口參數:無
; 出口參數:無
; 占用資源:R0、R1
;******************************************************************************
SYSCLK_INI
LDR R0,=VPBDIV
MOV R1,#0x00
STR R1,[R0] ; VPBDIV=0x00
LDR R0,=PLLCFG
MOV R1,#0x23
STR R1,[R0] ; PLLCFG=0x23,設置M值為4,P值為2
LDR R0,=PLLCON
MOV R1,#0x01
STR R1,[R0] ; PLLCON=0x01
LDR R0,=PLLFEED
MOV R1,#0xAA
STR R1,[R0] ; PLLFEED=0xAA
MOV R1,#0x55
STR R1,[R0] ; PLLFEED=0x55
WAIT_OK LDR R0,=PLLSTAT
LDR R1,[R0]
ANDS R1,R1,#0x0400
BEQ WAIT_OK ; 等待PLL鎖定
LDR R0,=PLLCON
MOV R1,#0x03
STR R1,[R0]
LDR R0,=PLLFEED
MOV R1,#0xAA
STR R1,[R0]
MOV R1,#0x55
STR R1,[R0]
MOV PC,LR
;******************************************************************************
; 名稱:IRQ_TIME0
; 功能:TIME0中斷服務程序。
; 入口參數:無
; 出口參數:無
; 占用資源:R2、R2
;******************************************************************************
IRQ_TIME0
LDR R2,=T0IR
MOV R3,#0x01
STR R3,[R2] ; 清除中斷標志
LDR R2,=VICVectAddr
MOV R3,#0
STR R3,[R2] ; VICVectAddr=0
SUBS PC,LR,#4 ; IRQ中斷返回
;******************************************************************************
; 名稱:DELAYUS
; 功能:短軟件延時
; 入口參數:無
; 出口參數:無
; 占用資源:R7
;******************************************************************************
DELAYUS
MOV R7,#0x5F000 ; 延時參數
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 + -