完整版:;要使用的外设寄存器地址 GPIOC_13
RCC_APB2ENR equ 0x40021018
GPIOC_CRH equ 0x40011004
GPIOC_ODR equ 0x4001100C
;①.栈
area stack,noinit,readwrite,align=3 ;noinit:指定不初始化
Stack_Start
space 0x400 ;1024Byte
Stack_End
;②.堆(暂未用到)
area heap,noinit,readwrite,align=3
Heap_Start
space 0x200 ;512Byte
Heap_End
;③.数据段(只读的属性)
area Reset,data,readonly,align=3
dcd Stack_End ;开辟4个字节空间,MCU一上电将自动将此地址传给SP(R13)指针,等同于dcd 0x20000400
dcd reset__ ;开辟4个字节空间,地址传递给PC(R15),程序开始运行的地方。
;④.代码段
area |.text|,code,readonly,align=3
entry ;只有出现bl指令时,才能写entry
reset__ proc
bl LED_Init ;bl指令将自动把当前pc值赋给lr寄存器
endp
loop proc
bl LED_ON
ldr r0,=0xffff1 ;使用寄存器传递delay的参数
bl delay
bl LED_OFF
ldr r0,=0xffff1 ;使用寄存器传递delay的参数
bl delay
b loop ;无条件转移
endp
LED_Init proc
push{lr}
;RCC
ldr r0,=RCC_APB2ENR
ldr r1,=0x00000010
str r1,[r0]
;GPIOC_IO
ldr r0,=GPIOC_CRH
ldr r1,=0x00300000 ;推挽输出
str r1,[r0]
;LED ON
bl LED_ON
pop{pc}
endp
LED_ON proc
push{lr}
ldr r0,=GPIOC_ODR
ldr r1,=0xdfff
str r1,[r0]
pop{pc}
endp
LED_OFF proc
push{lr}
ldr r0,=GPIOC_ODR
ldr r1,=0x2000
str r1,[r0]
pop{pc}
endp
delay proc
sub r0,r0,#1
cmp r0,#0
bgt delay ;满足r0>=0这个条件时,跳转
mov pc,lr ;其实和push,pop实现的功能是一样的,将lr的值赋给pc,完成子函数的返回。
endp
end ;汇编代码结束
|