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

📄 asm_isr.s

📁 基于AT91RM9200中断例程
💻 S
字号:
;---------------------------------------------------------------------------------------------------------
;- File source          : irq_handler.s
;- Object               : Assembler timer Interrupt Handler
;- Author               : weian
;----------------------------------------------------------------------------------------------------------



;-----------------------------------------------------------------------------------------------------------

                      ;Area Defination

;-----------------------------------------------------------------------------------------------------------


 AREA  TIMER_ASM_HANDLER,CODE,READONLY

AT91C_BASE_AIC        EQU  0xFFFFF000     
AT91C_AIC_IVR         EQU  0xFFFFF100
AT91C_AIC_EOICR       EQU  0xFFFFF130



ARM_MODE_USER         EQU  0x10
ARM_MODE_FIQ          EQU  0x11
ARM_MODE_IRQ          EQU  0x12
ARM_MODE_SVC          EQU  0x13
ARM_MODE_ABORT        EQU  0x17
ARM_MODE_UNDEF        EQU  0x1B
ARM_MODE_SYS          EQU  0x1F
ARM_MODE_MASK         EQU  0x1F

I_BIT                 EQU  0x80
F_BIT                 EQU  0x40
T_BIT                 EQU  0x20


AT91C_TC1_RC          EQU  0xFFFA005C
AT91C_TC1_CCR         EQU  0xFFFA0040

SAVED_LR_SVC	      DCD   0x00000000        ; some variables for temparal use
SAVED_LR_IRQ	      DCD   0x00000000
SAVED_SPSR	          DCD   0x00000000

 
     MACRO
     IRQ_ENTRY    $reg
  ;***************************************************************
;- Adjust and save LR_irq in IRQ stack
 	sub         r14, r14, #4
	stmfd       sp!, {r14}

;- Write in the IVR to support Protect Mode
;- No effect in Normal Mode
;- De-assert the NIRQ and clear the source in Protect Mode
	ldr         r14, =AT91C_BASE_AIC
	str         r14, [r14, #AT91C_AIC_IVR]

;- Save SPSR and r0 in IRQ stack
	mrs         r14, SPSR
	stmfd       sp!, {r0, r14}

;- Enable Interrupt and Switch in SYS Mode
	mrs         r0, CPSR
    bic         r0, r0,#I_BIT        
	orr         r0, r0, #ARM_MODE_SYS
	msr         CPSR_c, r0

;- Save scratch/used registers and LR in User Stack
	IF "$reg"=""
    stmfd       sp!, { r1-r11, r12, r14}
    ELSE
    stmfd       sp!, {r1-r11,$reg,r12,r14}
    ENDIF
    
    
    MEND
    
    MACRO
    IRQ_EXIT   $reg
 
 ;-Restore scratch/used registers and LR in User Stack
   IF "$reg"=""
   ldmia       sp!, { r1-r11, r12, r14}
   ELSE
   ldmia       sp!, {r1-r11,$reg,r12,r14}
   ENDIF
;- Disable Interrupt and switch back in IRQ mode
	mrs         r0, CPSR
    bic         r0, r0, #ARM_MODE_SYS
    bic         r0, r0, #I_BIT
	orr         r0, r0, #(ARM_MODE_IRQ)
	msr         CPSR_c,r0 

;- Mark the End of Interrupt on the AIC
	ldr         r0, =AT91C_BASE_AIC
	str         r0, [r0, #AT91C_AIC_EOICR]

;- Restore SPSR_irq and r0 from IRQ stack
	ldmia       sp!, {r0, r14}
	msr         SPSR_cxsf, r14
;- Restore adjusted  LR_irq from IRQ stack directly in the PC
	ldmia       sp!, {pc}^
    
    MEND
;-----------------------------------------------------------------------------------------------------------
;Function               ;timer1_asm_irq_handler
;Treatments             ;Timer 1 interrupt handler
;Called Fuctions        ;timer1_c_irq_handler
;Called Macros          ;IRQ_ENTRY, IRQ_EXIT
;------------------------------------------------------------------------------------------------------------
                     EXPORT         us0_asm_irq_handler
                     IMPORT         AT91F_US0_HANDLER
 
us0_asm_irq_handler
;Manage Exception Entry
                      IRQ_ENTRY
                      
;Call the timer Interrupt C handler
                      ldr      r1,=AT91F_US0_HANDLER
                      bx       r1
                       
;Manage Exception Exit
                      IRQ_EXIT                      
                      END                                                               

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -