完整版:- ;要使用的外设寄存器地址 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 ;汇编代码结束
|