⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 timeout.s

📁 周立功《ARM与嵌入式系统基础教程》第5章
💻 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 + -