Assembly Directives

        AREA    |.text|, CODE, READONLY, ALIGN=2
        THUMB
        EXPORT   __main

__main
        BL      GPIO_Init

Blink
        MOVW    R1, #LED_GREEN
        STR     R1, [R2]
        LDR     R3, =ONESEC
        BL      Delay

        MOVW    R1, #LED_BLUE
        STR     R1, [R2]
        LDR     R3, =HSEC
        BL      Delay

        MOVW    R1, #LED_RED
        STR     R1, [R2]
        LDR     R3, =HSEC
        BL      Delay

        MOVW    R1, #LED_ORANGE
        STR     R1, [R2]
        LDR     R3, =FSEC
        BL      Delay

        B       Blink

GPIO_Init
        LDR     R0, =RCC_AHB1ENR         ; R0 points to peripheral clock register
        LDR     R1, [R0]                 ; Load Peripheral clock register into R1
        ORR     R1, R1, GPIOIDEN         ; Enable GPIO port D clock
        STR     R1, [R0]                 ; Store result back

        LDR     R0, =GPIOD_MODER         ; R0 points to PORTD configuration register
        LDR     R1, =(MODER15_OUT | MODER14_OUT | MODER13_OUT | MODER12_OUT)
        STR     R1, [R0]                 ; Set pins 15,14,13,12 as output

        MOV     R1, #0
        LDR     R2, =GPIOD_ODR           ; GPIO output data register

        BX      LR

Delay
        SUBS    R3, R3, #1
        BNE     Delay
        BX      LR

        ALIGN

;-------------------------------
; Constants and Equates
;-------------------------------
RCC_BASE        EQU     0x40023800
RCC_AHB1ENR     EQU     0x40023830
GPIOD_BASE      EQU     0x40020C00
GPIOD_MODER     EQU     0x40020C00
GPIOD_ODR       EQU     0x40020C14

GPIOIDEN        EQU     1 << 3

MODER15_OUT     EQU     1 << 30
MODER14_OUT     EQU     1 << 28
MODER13_OUT     EQU     1 << 26
MODER12_OUT     EQU     1 << 24

LED_BLUE        EQU     1 << 15
LED_RED         EQU     1 << 14
LED_ORANGE      EQU     1 << 13
LED_GREEN       EQU     1 << 12

DELAY           EQU     0x000F
ONESEC          EQU     5333333
HSEC            EQU     266667
FSEC            EQU     106667

        END

MOV Instruction: