【嵌入式02】基于MDK创建纯汇编语言STM32工程


一、基于MDK创建汇编语言STM32工程

  1. 打开Keil MDK

  2. 选择project --> New μVision Project...
    在这里插入图片描述

  3. 选择项目工程存放的位置,并进行命名

  4. 点击保存

  5. 设置工程的目标环境,这里是基于STM32F103ZET6
    弹出的窗口如下图所示,既可以通过Search直接进行输入查找;也可通过小文件+号进行手中寻找。在这里插入图片描述

  6. 选择运行环境
    CMSIS中选择COREDevice中选择Startup,其中包含了启动文件。
    选择后可以发现窗格变绿。
    在这里插入图片描述

  7. 在打开后的界面左侧Project栏,打开Target1,鼠标右键单击Source Group1, 选择Add New Item to Group
    在这里插入图片描述

  8. 添加源文件,创建汇编项目。选择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.DLLTARMSTM.DLL

parameter项为-pSTM32F103C8,用于设置支持STM32F103C8的软硬件仿真。

注意!不进行勾选的话无法进行仿真!

三、编译调试

在这里插入图片描述
编译工程并进入调试模式。

进入调试界面后,点击左上角step over键,点击三次后,选择左侧的X(stop键),可以得到预期结果。

寄存器R5R6R7R8与程序设置一致,如下图所示。

四、生成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

猜你喜欢

转载自blog.csdn.net/qq_46467126/article/details/120444165