一、基于MDK创建汇编语言STM32工程
-
打开Keil MDK
-
选择
project
-->New μVision Project...
-
选择项目工程存放的位置,并进行命名
-
点击保存
-
设置工程的目标环境,这里是基于
STM32F103ZET6
。
弹出的窗口如下图所示,既可以通过Search直接进行输入查找;也可通过小文件+号进行手中寻找。 -
选择运行环境
CMSIS
中选择CORE
;Device
中选择Startup
,其中包含了启动文件。
选择后可以发现窗格变绿。
-
在打开后的界面左侧
Project
栏,打开Target1
,鼠标右键单击Source Group1
, 选择Add New Item to Group
-
添加源文件,创建汇编项目。选择
Asm File(.s)
,设置源文件名称,并保存
通过以上步骤,即可完成汇编语言STM32工程创建。
二、测试代码
1.源代码
编译并调试如下代码
AREA MYDATA, DATA
AREA MYCODE, CODE
ENTRY
EXPORT __main
__main
MOV R0, #10
MOV R1, #11
MOV R2, #12
MOV R3, #13
;LDR R0, =func01
BL func01
;LDR R1, =func02
BL func02
BL func03
LDR LR, =func01
LDR PC, =func03
B .
func01
MOV R5, #05
BX LR
func02
MOV R6, #06
BX LR
func03
MOV R7, #07
MOV R8, #08
BX LR
2.仿真器设置(采用软件仿真)
步骤:
在Debug
选项卡中选择Use Simulator
,表示使用软件仿真;
选择Run to main()
则表示跳过汇编代码,直接跳转到main函数开始仿真;
设置下面的Dialog DLL
项为DARMSTM.DLL
和TARMSTM.DLL
;
parameter
项为-pSTM32F103C8
,用于设置支持STM32F103C8的软硬件仿真。
注意!不进行勾选的话无法进行仿真!
三、编译调试
编译工程并进入调试模式。
进入调试界面后,点击左上角step over
键,点击三次后,选择左侧的X(stop
键),可以得到预期结果。
寄存器R5,R6,R7,R8与程序设置一致,如下图所示。
四、生成HEX文件
在写好文件后,点击工具栏的魔法棒
选择Output
页,勾选Create HEX File
,点击ok
点击工具栏的编译按钮
打开项目所在文件夹(大概率在Object文件夹下)即可发现.hex文件
1、HEX文件解析
hex文件可以通过UltraEdit、Notepad++、记事本等工具打开。
上图所示,使用Notepad++打开后会不同含义的数据颜色不同
每行数据都会有一个冒号开始,后面的数据由:数据长度、地址、标识符、有效数据、校验数据等构成
以上图的第一行为例,进行解析:
第1个字节10,表示该行具有0x10个数据,即16个字节的数据;
第2、3个字节C000,表示该行的起始地址为0xC000;
第4个字节00,表示该行记录的是数据;
第5-20个字节,表示的是有效数据;
第21个字节73,表示前面数据的校验数据,校验方法:0x100-前面字节累加和;
其中,第4个字节具有5种类型:00-05,含义如下:
00 —— 表示后面记录的是数据
01 —— 表示文件结束
02 —— 表示扩展段地址
03 —— 表示开始段地址
04 —— 表示扩展线性地址
05 —— 表示开始线性地址
单片机的hex文件以00居多,都用来表示数据。hex文件的结束部分如下图所示。
最后一行的01表示文件结束了,最后的FF表示校验数据,由0x100-0x01=0xFF得来。
2、扩展地址
上面的地址都是两个字节,范围从0x000-0xFFFF,如果地址是0x17FFFF该怎么办呢?需要用到扩展字段
第一行中,第一个字节为0x02,表示只有两个字节的数据,而扩展段的标识符为0x04表示后面的数据0x0800为扩展线性地址,基地址的计算方法为:
(0x0800<<16)=0x08000000,在0x04标识段出现之前,下面的数据都是这个基地址。
第二行的地址是0x0000,那么实际地址应是0x08000000+0x0000=0x08000000;
第二行的地址是0x0010,那么实际地址应是0x08000000+0x0010=0x08000010.
五、总结
利用Keil MDK创建汇编语言stm32工程并不复杂,虽然断点调试过程中出现了一些问题,但最终得以解决。如果想要实现预期,还是需要掌握了解汇编语言,需要不断实践,在之后配合硬件学习,相信会有跟进一步的学习和掌握。
参考文献
[1] https://blog.csdn.net/Bruce_Qee/article/details/119089365