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

📄 idlerun.s

📁 基于ARM7的LPC21XX系列的部分汇编源码
💻 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 + -