📄 timeout.s
字号:
;******************************************************************************
; 文件名:TIMEOUT.S
; 功能:使用定时器0实现1秒定时,控制蜂鸣器蜂鸣。(中断方式)
; 说明:将跳线器JP9短接,JP4断开。
;******************************************************************************
INCLUDE LPC2294.INC
EXPORT MAIN
VIC_BASE EQU 0xFFFFF000
TIMER0_BASE EQU 0xE0004000
BEEPCON EQU 0x00000080 ; P0.7引脚控制B1,低电平蜂鸣
AREA TIMEOUTC,CODE,READONLY
ENTRY
CODE32
MAIN MSR CPSR_c, #0x5F ; 切换处理器工作模式,并允许IRQ中断
LDR R0,=PINSEL0
MOV R1,#0x00000000
STR R1,[R0] ; 设置管脚连接
LDR R0,=IO0DIR
LDR R1,=BEEPCON
STR R1,[R0] ; 设置BEEP控制口为输出
BL SYSCLK_INI ; 设置系统时钟
LDR R0,=MEMMAP
MOV R1,#0x03
STR R1,[R0] ; REMAP操作(若写到片内FLASH,则不需要REMAP)
TIME0_INI ; 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
STR R1,[R0,#0x18] ; T0MR0=110592,比较值(1S定时值)
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
WAIT_IRQ B WAIT_IRQ
;******************************************************************************
; 名称: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中断服务程序,取反BEEPCON控制口。
; 入口参数:无
; 出口参数:无
; 占用资源:R0、R1
;******************************************************************************
IRQ_TIME0
LDR R0,=IO0SET
LDR R1,[R0] ; 读取IO0SET的值
ANDS R1,R1,#BEEPCON
LDREQ R0,=IO0SET ; 设置R0=IO0SET
LDRNE R0,=IO0CLR ; 设置R0=IO0CLR
MOV R1,#BEEPCON
STR R1,[R0]
LDR R0,=T0IR
MOV R1,#0x01
STR R1,[R0] ; 清除中断标志
LDR R0,=VICVectAddr
MOV R1,#0
STR R1,[R0] ; VICVectAddr=0
SUBS PC,LR,#4 ; IRQ中断返回
LTORG ; 声明文字池
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -