boot_23xx.armasm 1.21 KB
    /* ARM code to run user code */
    /* on the LPC23xx chips, the bootloader defaults to using the RC */
    /* osciallator and it activates the PLL to create 14.78 MHz, even */
    /* if there is no crystal.  However, when we use try to jump to */
    /* the user's code, their startup routine may (incorrectly) assume */
    /* the PLL is not enabled and crash if it is.  So in addition to */
    /* remapping the reset vector to flash, we have to shut off the */
    /* PLL so the user's startup code sees the same conditions as it */
    /* would following a hard reset */
begin:
    adr r0, const
    ldr r1, [r0]    /* r1 points to MEMMAP register */
    ldr r2, [r0,#4] /* r2 points to PLLCON */
    ldr r3, [r0,#8] /* r3 points to PLLFEED */
    mov r0, #1
    str r0, [r1]    /* remap interrupt vectors to flash */
    mov r4, #0xAA
    mov r5, #0x55
    str r0, [r2]    /* disconnect the PLL, PLLCON = 1 */
    str r4, [r3]
    str r5, [r3]
    mov r0, #0
    str r0, [r2]    /* disable the PLL, PLLCON = 0 */
    str r4, [r3]
    str r5, [r3]
    mov pc, #0      /* and then jump to the user's code */
const:
    .int    0xE01FC040  /* MEMMAP register */
    .int    0xE01FC080  /* PLLCON */
    .int    0xE01FC08C  /* PLLFEED */