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

📄 irq_pio.s

📁 嵌入式系统开发用源代码 包含At91C arm芯片相关各种例程 包括整数性能测试,浮点测试,硬件驱动等
💻 S
字号:
;-----------------------------------------------------------------------------
;-    ATMEL Microcontroller Software Support  -   ROUSSET -
;-----------------------------------------------------------------------------
; The software is delivered "AS IS" without warranty or condition of any
; kind, either express, implied or statutory. This includes without
; limitation any warranty or condition with respect to merchantability or
; fitness for any particular purpose, or against the infringements of
; intellectual property rights of others.
;-----------------------------------------------------------------------------
;- File source          : irq_pio.s
;- Object               : Assembler PIO Interrupt Handler.
;- Translator           : ARM Software Development Toolkit V2.11a
;-
;- Imported Resources   :
;-      PIOHandlerTable
;-      PtPIOBase
;- Exported Resources   :
;-      pio_interrupt_handler
;-
;- 1.0 JCZ 03/11/97     : Creation
;- 1.1 JCZ 24/04/98     : Add END at the end of file
;- 1.2 JCZ 15/09/98     : See irq.mac 1.1
;- 2.0 JCZ 21/10/98     : Clean up and add interworking capabilities
;------------------------------------------------------------------------------
; The handlers for each PIO are stored in the table <PIOHandlerTable>.
; When an interrupt occurs, the core branchs here. After management of the
; system each PIO lines interrupt is tested. If present the corresponding
; handler is called with as argument the PIO Controller base address and a mask
; identifying the PIO line.
; The PIO lines are looked for byte by byte to decrease latency time on
; highest bits.
;------------------------------------------------------------------------------

            AREA        AT91Lib, CODE, READONLY, INTERWORK

; -------------------------- List of Included Files ---------------------------

            INCLUDE     Include/arm.inc
            INCLUDE     Include/pio.inc
            INCLUDE     Include/aic.inc
            INCLUDE     Include/irq.mac

; ------------------------ List of constants and types ------------------------
; None

; ------------------------ List of Imported resources -------------------------

            IMPORT      PIOHandlerTable

; ------------------------ List of Internal resources -------------------------
PtPIOBase
            DCD         PIO_BASE

; ------------------------- List of Exported resources -------------------------

;------------------------------------------------------------------------------
;- Function             : pio_interrupt_handler
;- Treatments           : Parallel IO Controller Interrupt Handler.
;- Input Parameters     : None
;- Output Parameters    :
;-      When the handler is called :
;-          r0 = PIO Controller Base Address
;-          r1 = Current Bit mask (to identify the pin)
;- Registers lost       : None
;- Called Functions     : The corresponding handler, when an interrupt is found.
;- Called Macros        :
;-      IRQ_ENTRY, IRQ_EXIT
;------------------------------------------------------------------------------
            EXPORT      pio_interrupt_handler

pio_interrupt_handler

;- Manage Exception Entry
            IRQ_ENTRY   r4-r7

;- Load the Address of the PIO Controller Base address
            ldr         r4, PtPIOBase

; Load the address of the PIO Handler Table
            ldr         r5, =PIOHandlerTable

look_for_interrupt
;- Read the interrupt status register and clear it
            ldr         r0, [r4, #PIO_ISR]

;- Read the Interrupt Mask Register
            ldr         r1, [r4, #PIO_IMR]

;- Clear disabled status bits
            and         r6, r1, r0

;- Initialize bit mask
            mov         r7, #1

;- Byte 0
;--------
;- If byte 0 == 0x00
            ands        r0, r6, #0xFF
;- | Shift left mask 8 times
            moveq       r7, r7, lsl #8
;- | Update the Handler Pointer
            addeq       r5, r5, #8*4
            beq         TestByte1

;- Else
;- | While mask differs from 1<<8
Loop0
            ands        r0, r7, #1:SHL:8
            bne         TestByte1

;- | | If current bit is 1
            ands        r0, r6, r7

;- | | | Load parameters
            movne       r0, r4
            movne       r1, r7

;- | | | Update the Return Address and Branch on handler
            ldrne       r2, [r5]
            movne       r14, pc
            bxne        r2
;- | | EndIf

;- | | Update the handler pointer
            add         r5, r5, #4
;- | | Left Shift the bit mask
            mov         r7, r7, lsl #1
;- | EndWhile
            b           Loop0
;- EndIf

;- Byte 1
;--------
TestByte1
;- If byte 1 == 0x00
            ands        r0, r6, #0xFF00
;- | Shift left mask 8 times
            moveq       r7, r7, lsl #8
;- | Update the Handler Pointer
            addeq       r5, r5, #8*4
            beq         TestByte2

;- Else
;- | While mask differs from 1<<16
Loop1
            ands        r0, r7, #1:SHL:16
            bne         TestByte2

;- | | If current bit is 1
            ands        r0, r6, r7

;- | | | Load parameters
            movne       r0, r4
            movne       r1, r7

;- | | | Update the Return Address and Branch on handler
            ldrne       r2, [r5]
            movne       r14, pc
            bxne        r2
;- | | EndIf

;- | | Update the handler pointer
            add         r5, r5, #4
;- | | Left Shift the bit mask
            mov         r7, r7, lsl #1
;- | EndWhile
            b           Loop1
;- EndIf

;- Byte 2
;--------
TestByte2
;- If byte 2 == 0x00
            ands        r0, r6, #0xFF0000
;- | Shift left mask 8 times
            moveq       r7, r7, lsl #8
;- | Update the Handler Pointer
            addeq       r5, r5, #8*4
            beq         TestByte3

;- Else
;- | While mask differs from 1<<24
Loop2
            ands        r0, r7, #1:SHL:24
            bne         TestByte3

;- | | If current bit is 1
            ands        r0, r6, r7

;- | | | Load parameters
            movne       r0, r4
            movne       r1, r7

;- | | | Update the Return Address and Branch on handler
            ldrne       r2, [r5]
            movne       r14, pc
            bxne        r2
;- | | EndIf

;- | | Update the handler pointer
            add         r5, r5, #4
;- | | Left Shift the bit mask
            mov         r7, r7, lsl #1
;- | EndWhile
            b           Loop2
;- EndIf

;- Byte 3
;--------
TestByte3
;- If byte 3 != 0x00
            ands        r0, r6, #0xFF000000
            beq         EndTest

;- | While mask differs from 0
Loop3
            cmp         r7, #0
            beq         EndTest

;- | | If current bit is 1
            ands        r0, r6, r7

;- | | | Load parameters
            movne       r0, r4
            movne       r1, r7

;- | | | Update the Return Address and Branch on handler
            ldrne       r2, [r5]
            movne       r14, pc
            bxne        r2
;- | | EndIf

;- | | Update the handler pointer
            add         r5, r5, #4
;- | | Left Shift the bit mask
            mov         r7, r7, lsl #1
;- | EndWhile
            b           Loop3
;- EndIf

EndTest
;- Manage Exception exit
            IRQ_EXIT    r4-r7

            END

⌨️ 快捷键说明

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