微處理器 - NXP LPC810 - Assembly - LED



參考資訊:
https://www-users.cs.york.ac.uk/~pcc/Circuits/LPC800/data/lpc810.html
https://github.com/microbuilder/LPC810_CodeBase/blob/master/doc/LPC81x%20User%20Manual.pdf

預設PIO0_2是SWDIO


DIR


SET


CLR


main.s

    .cpu cortex-m0
    .thumb

    .equ PINENABLE0, 0x4000c1c0
    .equ GPIO_DIR0,  0xa0002000
    .equ GPIO_PIN0,  0xa0002100
    .equ GPIO_SET0,  0xa0002200
    .equ GPIO_CLR0,  0xa0002280
    .equ BIT1,       1
    .equ BIT2,       2

    .thumb_func
    .global _start
_start:
    .word 0x10000400 @ stacktop
    .word reset @ reset
    .word hang @ nmi
    .word hang @ hardfault
    .word hang @ reserved
    .word hang @ reserved
    .word hang @ reserved
    .word hang @ reserved
    .word hang @ reserved
    .word hang @ reserved
    .word hang @ reserved
    .word hang @ svcall
    .word hang @ reserved
    .word hang @ reserved
    .word hang @ pendsv
    .word hang @ systick
     
    .thumb_func
reset:
    ldr r0, =PINENABLE0
    ldr r1, =0xffffffff
    str r1, [r0]

    ldr r0, =GPIO_DIR0
    ldr r1, =(1 << BIT2)
    str r1, [r0]
 
loop:
    ldr r0, =GPIO_SET0
    ldr r1, =(1 << BIT2)
    str r1, [r0]
    bl delay
 
    ldr r0, =GPIO_CLR0
    ldr r1, =(1 << BIT2)
    str r1, [r0]
    bl delay
    b loop
 
delay:
    push {lr}
    ldr r0, =3000000
1:
    nop
    sub r0, #1
    bne 1b
    pop {pc}
 
hang:
    b .
    .end

main.ld

OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm", "elf32-littlearm")
OUTPUT_ARCH(arm)

MEMORY {
    ROM (rx) : ORIGIN = 0x00000000, LENGTH = 0x00001000
    RAM (rwx) : ORIGIN = 0x10000000, LENGTH = 0x00000400
}

SECTIONS {
    . = 0x0;
    .text : { *(.text*) } > ROM
    .rodata : { *(.rodata*) } > ROM
    .bss : { *(.bss*) } > RAM
    . = ALIGN(8);
}

接著按下按鍵(PIO0_1接地)並接上電源以及UART TX、RX,使用如下方式編譯、燒錄

$ arm-none-eabi-as -mcpu=cortex-m0 -mthumb main.s -o main.o
$ arm-none-eabi-ld -o main.elf -T main.ld main.o
$ arm-none-eabi-objcopy main.elf main.bin -O binary
$ arm-none-eabi-objcopy main.elf main.hex -O ihex
$ sudo lpc21isp -wipe -control -verify -debug2 ./main.hex /dev/ttyUSB0 9600 12000
    Verify after copy RAM to Flash.
    lpc21isp version 1.97
    File ./main.hex:
        loaded...
        converted to binary format...
        image size : 140
    Image size : 140
    Synchronizing (ESC to abort)...... OK
    Read bootcode version: 4
    13
    Read part ID: LPC810M021FN8, 4 kiB FLASH / 1 kiB SRAM (0x00008100)
    Will start programming at Sector 1 if possible, and conclude with Sector 0 to ensure that checksum is written last.
    Wiping Device. OK
    Sector 0: ..
    Download Finished and Verified correct... taking 1 seconds
    Now launching the brand new code

完成