基于MDK的STM32汇编语言编写及小灯闪烁的汇编程序实现
- 一、新建工程
- 二、配置环境
-
- 三、测试代码
-
- 四、HEX文件解读
- 五、闪烁LED的程序
- 六、总结
-
一、新建工程
1、打开KEIL5,新建一个工程
2、在弹出的窗口选择保存位置,文件名称设置为TEST,点击保存
二、配置环境
1、选择设备
新工程建立好后,弹出设备选择窗口,因为我的开发板版本为STM32F103VET6,因此选择相应的开发板,点击保存
2、选择运行环境
CMSIS下选择CORE;Device下Startup,其中包含了启动文件;
3、添加源文件
1、选中Source Group 1,右键,选择Add New Item to Group
2、添加源文件,因为创建汇编项目,选择 Asm File (.s) ,设置文件名称为TEST,点击保存
3、出现一个空白文本,显示如下
三、测试代码
1、源码
1、把下列代码粘贴到TEST.s中
AREA MYDATA, DATA
AREA MYCODE, CODE
ENTRY
EXPORT __main
__main
MOV R0,
MOV R1,
MOV R2,
MOV R3,
;LDR R0, =func01
BL func01
;LDR R1, =func02
BL func02
BL func03
LDR LR, =func01
LDR PC, =func03
B .
func01
MOV R5,
BX LR
func02
MOV R6,
BX LR
func03
MOV R7,
MOV R8,
BX LR
2、仿真器设置
1、点击魔术棒进行设置,仿真器的选择根据自己的实际情况进行选择,我这里选择DAP仿真器,如下图所示;
进行设置时要将电脑与开发板连接,接通电源,否则无法查看到开发板信息。
2、点击Setting后,按照如下设置,能在3处看到相应设备信息,设置好后一直点OK
3、编译调试
1、先编译程序,无误后进入仿真调试:
2、由仿真结果可以看到,寄存器的值与程序设定一致
3、在仿真调试模式下,可以点击以下按钮进行调试
4、可以看到,动态调试时,变量地址有改变
四、HEX文件解读
1、生成HEX文件
打开魔术棒,点击Output,勾选生成HEX文件,确定,然后可以在这个工程保存的目录下找到。
2、HEX文件格式
开始符号+字节数+地址+类型+数据+校验
冒号 | ll | aaaa | tt | [dd…] | cc |
---|
| 1字节 | 2字节 | 1字节 | n字节 | 1字节 |
3、HEX文件解读:
由上图HEX文本第一行为例——:020000040800F2
按照HEX文件格式,它可以这样分——:+02+0000+04+0800+F2
“:”是开始符号;
02是字节数,代表这个记录当中数据字节的数量;
0000代表当中数据的开始地址;
04是数据类型,它可能是以下数据类型当中的一个:
00 | 数据记录 |
---|
01 | 文件结束 |
02 | 扩展的段地址 |
03 | 开始段地址 |
04 | 扩展线性地址 |
05 | 开始线性地址 |
0800是数据;
F2是校验和域。
校验值计算方法:0x100 - (该行数据所有的数据的累加和%256)
如:020000040800F2
0x100-((0x02+0x00+0x00+0x04+0x08+0x00)%256)=0xF2
五、闪烁LED的程序
1、按照以上方式建立新的工程,不需要配置环境
2、把以下程序写入
LED0 EQU 0x42218194
RCC_APB2ENR EQU 0x40021018
;GPIOA_CRH EQU 0x40010804
GPIOB_CRL EQU 0x40010C00
Stack_Size EQU 0x00000400
AREA STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem SPACE Stack_Size
__initial_sp
AREA RESET, DATA, READONLY
__Vectors DCD __initial_sp
DCD Reset_Handler
AREA |.text|, CODE, READONLY
THUMB
REQUIRE8
PRESERVE8
ENTRY
Reset_Handler
BL LED_Init
MainLoop BL LED_ON
BL Delay
BL LED_OFF
BL Delay
B MainLoop
LED_Init
PUSH {R0,R1, LR}
LDR R0,=RCC_APB2ENR
ORR R0,R0,
LDR R1,=RCC_APB2ENR
STR R0,[R1]
LDR R0,=GPIOB_CRL
BIC R0,R0,
LDR R1,=GPIOB_CRL
STR R0,[R1]
LDR R0,=GPIOB_CRL
ORR R0,R0,
LDR R1,=GPIOB_CRL
STR R0,[R1]
MOV R0,
LDR R1,=LED0
STR R0,[R1]
POP {R0,R1,PC}
LED_ON
PUSH {R0,R1, LR}
MOV R0,
LDR R1,=LED0
STR R0,[R1]
POP {R0,R1,PC}
LED_OFF
PUSH {R0,R1, LR}
MOV R0,
LDR R1,=LED0
STR R0,[R1]
POP {R0,R1,PC}
Delay
PUSH {R0,R1, LR}
MOVS R0,
MOVS R1,
MOVS R2,
DelayLoop0
ADDS R0,R0,
CMP R0,
BCC DelayLoop0
MOVS R0,
ADDS R1,R1,
CMP R1,
BCC DelayLoop0
MOVS R0,
MOVS R1,
ADDS R2,R2,
CMP R2,
BCC DelayLoop0
POP {R0,R1,PC}
END
3、编译好后烧录到开发板,最终结果:
六、总结
以上就是基于MDK的一个汇编语言的简单编写和动态调试、HEX文件的简单解读,还有令小灯闪烁的汇编程序。
参考
1、ARM汇编基础之基于MDK创建纯汇编语言的STM32工程.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)