📄 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 + -