.data
.equ RCC_BASE, 0x40021000
.equ RCC_AHB2ENR, 0x4C
.equ RCC_APB2ENR, 0x60
.equ GPIOAEN_Pos, 0
.equ GPIOAEN_Msk, (1 << GPIOAEN_Pos)
.equ GPIOCEN_Pos, 2
.equ GPIOCEN_Msk, (1 << GPIOCEN_Pos)
.equ GPIOA_BASE, 0x48000000
.equ GPIOC_BASE, 0x48000800
.equ GPIO_MODER, 0x00
.equ GPIO_PUPDR, 0x0C
.equ GPIO_IDR, 0x10
.equ GPIO_ODR, 0x14
.equ GPIO_MODE_Len, 2
.equ GPIO_MODE0_Pos, 0
.equ GPIO_MODE13_Pos, 26
.equ GPIO_PUPD0_Pos, 0
.equ GPIO_PUPD13_Pos, 26
.equ GPIO_PULL_DOWN, 2
.equ GPIO_ODR_OD0_Pos, 0
.equ GPIO_IDR13_Pos, 13
.equ GPIO_IDR13_Msk, (1 << GPIO_IDR13_Pos)
.equ GPIO_OUTPUT_MODE, 0x1
.equ GPIO_INPUT_MODE, 0x00
.equ GPIO_SET, 1
.equ DELAY_MS, 1000
.text
.global main
.syntax unified
main:
BL clock_init
// GPIOA
LDR r0, =RCC_BASE
LDR r1, =GPIOAEN_Msk
STR r1, [r0, RCC_AHB2ENR]
// GPIOA PIN0
LDR r0, =GPIOA_BASE
LDR r1, [r0, GPIO_MODER]
MOV r2, (GPIO_OUTPUT_MODE << GPIO_MODE0_Pos)
BFI r1, r2, GPIO_MODE0_Pos, GPIO_MODE_Len
STR r1, [r0, GPIO_MODER]
LDR r1, [r0, GPIO_PUPDR]
ORR r1, r1, (GPIO_PULL_DOWN << GPIO_PUPD0_Pos)
STR r1, [r0, GPIO_PUPDR]
// GPIOC
LDR r0, =RCC_BASE
LDR r1, [r0, RCC_AHB2ENR]
ORR r1, r1, GPIOCEN_Msk
STR r1, [r0, RCC_AHB2ENR]
// GPIOC PIN13
LDR r0, =GPIOC_BASE
LDR r1, [r0, GPIO_MODER]
MOV r2, (GPIO_INPUT_MODE << GPIO_MODE13_Pos)
BFI r1, r2, GPIO_MODE13_Pos, GPIO_MODE_Len
STR r1, [r0, GPIO_MODER]
LDR r1, [r0, GPIO_PUPDR]
ORR r1, r1, (GPIO_PULL_DOWN << GPIO_PUPD13_Pos)
STR r1, [r0, GPIO_PUPDR]
//ZADATAK 2
/*
loop:
BL turn_led_on
B loop
*/
//ZADATAK 3
loop:
BL blink_led
B loop
turn_led_on:
PUSH {lr}
LDR r0, =GPIOC_BASE
LDR r1, [r0, GPIO_IDR]
LDR r0, =GPIOA_BASE
LDR r2, [r0, GPIO_ODR]
TST r1, GPIO_IDR13_Msk
IT EQ
ORREQ r2, (GPIO_SET << GPIO_ODR_OD0_Pos)
STR r2, [r0, GPIO_ODR]
POP {lr}
BX lr
blink_led:
PUSH {lr}
LDR r0, =GPIOA_BASE
LDR r1, [r0, GPIO_ODR]
EOR r1, r1, (GPIO_SET << GPIO_ODR_OD0_Pos)
STR r1, [r0, GPIO_ODR]
LDR r0, =DELAY_MS
BL delay_function
POP {lr}
BX lr
Loading
st-nucleo-c031c6
st-nucleo-c031c6