微處理器 - NXP LPC2103 - Assembly - EINT1(Non-vectored IRQ)



參考資料:
https://www.keil.com/dd/docs/datashts/philips/user_manual_lpc2101_2102_2103.pdf

暫存器




main.s

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
    .equ IODIR,          0xe0028008
    .equ IOCLR,          0xe002800c
    .equ IOSET,          0xe0028004
    .equ PINSEL0,        0xe002c000
    .equ EXTINT,         0xe01fc140
    .equ VICIntEnable,   0xfffff010
    .equ VICDefVectAddr, 0xfffff034
    .equ VICVectAddr0,   0xfffff100
    .equ VICVectCntl0,   0xfffff200
 
    .text
    .align 2
    .global _start
_start:    b reset
_undef:    b .
_swi:      b .
_pabort:   b .
_dabort:   b .
_reserved: b .
_irq:      ldr pc, [pc, #-0xff0]
_fiq:      b .
    
reset:
    mrs r0, cpsr
    bic r0, #0x80
    msr cpsr_c, r0
 
    ldr r0, =PINSEL0
    ldr r1, =(1 << 28)
    str r1, [r0]
 
    ldr r0, =VICIntEnable
    ldr r1, =(1 << 15)
    str r1, [r0]
 
    ldr r0, =VICDefVectAddr
    ldr r1, =irq_handler
    str r1, [r0]
 
    ldr r0, =VICVectCntl0
    ldr r1, =0x0f
    str r1, [r0]
 
    ldr r0, =IODIR
    ldr r1, =(1 << 22)
    str r1, [r0]
 
    ldr r0, =IOCLR
    ldr r1, =(1 << 22)
    str r1, [r0]
    b .
 
irq_handler:
    ldr r0, =IOSET
    ldr r1, =(1 << 22)
    str r1, [r0]
    ldr r0, =EXTINT
    ldr r1, =0x02
    str r1, [r0]
    subs pc, lr, #4
    .end

P.S. ldr pc, [pc, #-0xff0] = 0x18(irq address) + 8(fetch、decode) - 0xff0 = VICVectAddr(0xfffff030)

完成