基于MDK创建存汇编语言的STM32工程及hex文件的分析

目录

一、新建项目

二、编写代码并编译

​三、生成hex文件并分析hex文件

四、调试

 ​

五、总结

六、参考文献



一、新建项目

1.  创建project

基于MDK创建存汇编语言的STM32工程及hex文件的分析_第1张图片

2.  输入所创建的工程名并保存

基于MDK创建存汇编语言的STM32工程及hex文件的分析_第2张图片 3.我选择的是STM32F103ZE芯片       

基于MDK创建存汇编语言的STM32工程及hex文件的分析_第3张图片基于MDK创建存汇编语言的STM32工程及hex文件的分析_第4张图片 

4.  ARM 的 CMSIS 已经把开发所需要的软件组件都封装好了,因此直接选择即可—— CMSIS 下选择 COREDevice 下 Startup(其中包含了启动文件),然后点击ok

 基于MDK创建存汇编语言的STM32工程及hex文件的分析_第5张图片

5.  在所建立的工程下找到Source Group 1 鼠标单击右键选择Add New Item to Group 'Source Group 1'...

 基于MDK创建存汇编语言的STM32工程及hex文件的分析_第6张图片

 基于MDK创建存汇编语言的STM32工程及hex文件的分析_第7张图片

 6.点击 Asm Files (.s) 添加汇编文件,然后输入文件名,并点击 Add基于MDK创建存汇编语言的STM32工程及hex文件的分析_第8张图片

二、编写代码并编译

7.编写代码

 基于MDK创建存汇编语言的STM32工程及hex文件的分析_第9张图片

 编写如下代码:

 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

 8.仿真器设置

在 Output 界面下,勾选 Create HEX File ,才能生成 hex 文件

基于MDK创建存汇编语言的STM32工程及hex文件的分析_第10张图片

 在 Debug 界面下,选择 Use Simulator(没有硬件只能做仿真),具体根据自己的实际情况进行选择

基于MDK创建存汇编语言的STM32工程及hex文件的分析_第11张图片

 9.  仿真

基于MDK创建存汇编语言的STM32工程及hex文件的分析_第12张图片
三、生成hex文件并分析hex文件

10. 生成hex文件

基于MDK创建存汇编语言的STM32工程及hex文件的分析_第13张图片

11.用记事本打开hex文件

 基于MDK创建存汇编语言的STM32工程及hex文件的分析_第14张图片

 11.1分析hex文件

Hex文件可以按照如下的方式进行拆分来分析其中的内容:

例如:

:020000040000FA , 我把它看做 0x02 0x00 0x00 0x04 0x00 0x00 0xFA

第一个 0x02 为数据长度。

紧跟着后面的0x00 0x00 为地址。

再后面的0x04为数据类型,类型共分以下几类:

'00' Data Record//数据记录

'01' End of File Record//文件结束记录

'02' Extended Segment Address Record//扩展段地址记录

'03' Start Segment Address Record//开始段地址记录

'04' Extended Linear Address Record//扩展线性地址记录

'05' Start Linear Address Record//开始线性地址记录

然后,接着0x04后面的两个 0x00 0x00就是数据。最后一个0xFA是校验码。

11.2hex文件中的数据部分

Intel HEX 由任意数量的十六进制记录组成。每个记录包含 5 个域,它们按一定格式排列::llaaaatt[dd...]cc
每一组字母对应一个不同的域,每一个字母对应一个十六进制编码的数字
每一个域由至少两个十六进制编码数字组成,它们构成一个字节,就像以下描述的那样:

内容 描述
:llaaaatt[dd…]cc
: 每个Intel HEX记录都由冒号开头
ll 数据长度域,它代表记录当中数据字节(dd)的数量
aaaa 地址域,它代表记录当中数据的起始地址
tt 代表HEX记录类型的域,它可能是以下数据当中的一个:00(数据记录)01(文件结束记录)02(扩展段地址记录)04(扩展线性地址记录)
dd 数据域,它代表一个字节的数据。一个记录可以有许多数据字节.记录当中数据字节的数量必须和数据长度域(ll)中指定的数字相符
cc 校验和域,它表示这个记录的校验和(校验和的计算是通过将记录当中所有十六进制编码数字对的值相加,以256为模进行以下补足)


Intel HEX文件由任意数量以回车换行符结束的数据记录组成
这里我们随便拿一条数据记录分析,比如第二条吧

内容 描述
:100000000006002031010008390100083B0100080A
10 这个记录当中数据字节的数量
0000 数据将被下载到存储器当中的地址
00 记录类型(数据记录)
0006…0008 数据
0A 这个记录的校验和

11.3  文件尾  

文件尾在文件的最后一排具有标志性的结束方式::00000001FF

内容 描述
00 记录的长度为 0
0000 LOAD OFFSET为0000
01 TYPE = 01
FF 校验和为FF

四、调试

12.   进行调试前的相关设置

点击魔法棒,调出Options for Target 'Target 1'界面,在其中点击Debug;

选中Use Simulator,选中Run to main(); 在下面的Dialog DLL:空白处填入DARMSTM.DLL,在Parameter:空白处填入-pSTM32F103VE(此处芯片名称与上述工程选择的芯片名称必须一致);

最后点击OK,准备完成
 

基于MDK创建存汇编语言的STM32工程及hex文件的分析_第15张图片

13.  CTRL+F5进入调试页面

 基于MDK创建存汇编语言的STM32工程及hex文件的分析_第16张图片

 可以看到此时的值跟我们程序中设置的值不一样。

进行断点调试,最后结果正确。

基于MDK创建存汇编语言的STM32工程及hex文件的分析_第17张图片

五、总结

 由于硬件设备没有到位,仅仅建立起了环境和基本的调试,期待接下来将程序烧到硬件板上。

六、参考文献

一:https://blog.csdn.net/m0_58892312/article/details/120437289

二、基于 MDK 创建 STM32 汇编语言工程并分析 HEX 文件内容_ssj925319的博客-CSDN博客

你可能感兴趣的:(stm32,html5,html)