2022-02-10 19:03:59 +08:00

86 lines
1.8 KiB
ArmAsm

.text
/* See https://www.codesourcery.com/archives/arm-gnu/msg01396.html
and http://www.sourceware.org/ml/binutils/2005-04/msg00902.html
This avoids unshifted register error which occurs when compiling for Thumb */
.syntax unified
.thumb
.global main
main:
/* I have to use +1 in the address abel, otherwise the processor triggers
an exception. The ARM documentation explains that thumb bx
instructions require odd addresses. The C compiler does this
automatically - I have examined the assembly generated by the C compiler,
but still don't understand how they do it without manually appending
a +1 to the address label. */
.word 0x20000800 /* stack pointer */
.word _c_entry+1 /* Entry point (reset vector) */
.rept 82 /* interrupt handlers */
.word _handler+1
.endr
_c_entry:
/* Enable clock to Port C */
movw r3, #4096
movt r3, #16386
ldr r2, [r3, #24]
orr r2, r2, #16
str r2, [r3, #24]
/* Turn LED off */
movw r3, #4096
movt r3, #16385
movw r2, #4096
str r2, [r3, #16]
ldr r2, [r3, #4] /* Change CRH pin 12 */
and r2, r2, #4293984255
orr r2, r2, #196608
str r2, [r3, #4] /* MODE = general purpose I/O, speed 50 Mhz */
ldr r2, [r3, #4] /* Get CRH */
_flash_loop:
/* Turn LED on */
movw r2, #4096
str r2, [r3, #20]
movw r4, #0
movt r4, #20
delay1:
sub.w r4, r4, #1
cmp r4, #0
bne delay1
/* Turn LED off */
movw r2, #4096
str r2, [r3, #16]
movw r4, #0
movt r4, #3
delay2:
sub.w r4, r4, #1
cmp r4, #0
bne delay2
B _flash_loop
_handler:
bx lr /* Return immediately */
nop