微處理器 - NXP LPC2103 - Assembly - Timer2



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

暫存器





main.s

    .equ IODIR,        0xe0028008
    .equ IOCLR,        0xe002800c
    .equ IOSET,        0xe0028004
    .equ PINSEL0,      0xe002c000
    .equ EXTINT,       0xe01fc140
    .equ VICIntEnable, 0xfffff010
    .equ T2PR,         0xe007000c
    .equ T2MR0,        0xe0070018
    .equ T2MCR,        0xe0070014
    .equ T2TCR,        0xe0070004
    .equ T2CTCR,       0xe0070070
    .equ T2IR,         0xe0070000

    .data
blink: .dcb 1

    .text
    .align 2
    .global _start
_start:    b reset
_undef:    b .
_swi:      b .
_pabort:   b .
_dabort:   b .
_reserved: b .
_irq:      b irq_handler
_fiq:      b .
    
reset:
    mrs r0, cpsr
    bic r0, #0x80
    msr cpsr_c, r0

    ldr r0, =T2PR
    ldr r1, =0x63
    str r1, [r0]

    ldr r0, =T2MR0
    ldr r1, =5000
    str r1, [r0]

    ldr r0, =T2MCR
    ldr r1, [r0]
    orr r1, #0x03
    str r1, [r0]

    ldr r0, =T2TCR
    ldr r1, =0x02
    str r1, [r0]

    ldr r0, =T2TCR
    ldr r1, =0x01
    str r1, [r0]

    ldr r0, =VICIntEnable
    ldr r1, =(1 << 26)
    str r1, [r0]

    ldr r0, =IODIR
    ldr r1, =(1 << 22)
    str r1, [r0]

    ldr r0, =IOCLR
    ldr r1, =(1 << 22)
    str r1, [r0]

    ldr r0, =blink
    ldr r1, =0x00
    str r1, [r0]
    b .
 
irq_handler:
    ldr r0, =blink
    ldr r1, [r0]
    cmp r1, #0x00
    beq 1f
    ldr r0, =IOSET
    ldr r1, =(1 << 22)
    str r1, [r0]
    b 2f
1:
    ldr r0, =IOCLR
    ldr r1, =(1 << 22)
    str r1, [r0]
2:
    ldr r0, =blink
    ldr r1, [r0]
    eor r1, #0xff
    str r1, [r0]

    ldr r0, =T2IR
    ldr r1, =0x01
    str r1, [r0]
    subs pc, lr, #4
    .end

完成