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

📄 idlerun.s

📁 周立功单片机ARM学习板easyARM2104的测试程序等
💻 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 + -