基于MDK创建第一个纯汇编语言的STM32工程并分析hex文件

一、项目创建

1、在project下选择new uVision Project…
基于MDK创建第一个纯汇编语言的STM32工程并分析hex文件
2、输入项目名称
基于MDK创建第一个纯汇编语言的STM32工程并分析hex文件
3、选择芯片,我选择的是 STM32F103VE 芯片
基于MDK创建第一个纯汇编语言的STM32工程并分析hex文件

4、CMSIS 下选择 CORE;Device 下 选择Startup,然后点击下方OK
基于MDK创建第一个纯汇编语言的STM32工程并分析hex文件

5、右击 Source Group 1 ,点击 Add New Item to Group ‘Source Group 1’…基于MDK创建第一个纯汇编语言的STM32工程并分析hex文件
6、选择Asm File,输入name
基于MDK创建第一个纯汇编语言的STM32工程并分析hex文件
7、创建完成
基于MDK创建第一个纯汇编语言的STM32工程并分析hex文件

二、代码编写并编译烧录

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、编译及调试

  • 初始设置:
    点击所示图标
    基于MDK创建第一个纯汇编语言的STM32工程并分析hex文件
    在Output中勾选Create HEX File
    基于MDK创建第一个纯汇编语言的STM32工程并分析hex文件
    在 Debug界面下,勾选 Use Simulator,因为在后面我们要进行虚拟调试,后OK 保存设置
    基于MDK创建第一个纯汇编语言的STM32工程并分析hex文件
  • 编译结果:
    基于MDK创建第一个纯汇编语言的STM32工程并分析hex文件
    没有出现错误,编译成功!
  • 程序调试:
    基于MDK创建第一个纯汇编语言的STM32工程并分析hex文件
    该设置的东西都设置好了,调试还是出现以上结果!
    基于MDK创建第一个纯汇编语言的STM32工程并分析hex文件

三、

1、Hex文件基本描述:
一般Hex文件通过记事本就可以打开。可以发现一般Hex文件的记录格式如下:
基于MDK创建第一个纯汇编语言的STM32工程并分析hex文件

  • :(冒号)每个Intel HEX 记录都由冒号开头;
  • LL 是数据长度域, 它代表记录当中数据字节 (dd) 的数量 ;
  • aaaa 是地址域,它代表记录当中数据的起始地址;
  • TT是代表 HEX 记录类型的域,它可能是以下数据当中的一 个:
    00 – 数 据 记录(Data Record)
    01 – 文件结 束 记录(End of FileRecord)
    02 – 扩展段地址 记录(ExtendedSegment Address Record)
    03 – 开始段地址记录(Start Segment Address Record)
    04 – 扩展 线 性地址记录(Extended Linear Address Record)
    05 – 开始线性地址记录(Extended Segment Address Record)
  • dd 是数 据域 , 它 代表一 个 字 节 的 数 据. 一 个记录 可以有 许 多 数 据字 节 . 记录当 中 数 据字 节 的 数 量必 须 和数 据 长 度域(ll) 中指定的 数字相符.
  • cc 是校验 和域 , 它 表示 这个记录 的校 验 和. 校 验 和的 计 算是通 过将记录当 中所有十六 进 制 编码数 字 对 的 值相加, 以256 为 模 进 行以下 补 足.
    2、用记事本打开生成的HEX文件:
    基于MDK创建第一个纯汇编语言的STM32工程并分析hex文件
    3、HEX文件分析:
  • 数据记录”00”
    Intel HEX文件由任意数量以回车换行符结束的数据记录组成数据记录外观如下:
    :100000000006002031010008390100083B0100080A
    10 是这个记录当中数据字节的数量.即0x10 ;
    0000 是数据将被下载到存储器当中的地址.即0x0000 ;
    00 是记录类型( 数据记录).即0x00 ;
    0006002031010008390100083B010008是数据.分别代表0x00,0x06… ;
    33 是这个记录的校验和即0x0A;
  • 文件结束(EOF)”01”
    Intel HEX文件必须以文件结束(EOF) 记录结束这个记录的记录类的值必须是01.EOF 记录外观总是如下:
    :00000001FF
    00 是记录当中数据字节的数量.
    0000 是数据被下载到存储器当中的地址. 在文件结束记录当中地址是没有意义被忽略的.0000h 是典型的地址;
    01 是记录类型 01( 文件 结 束 记录)
    FF 是这个记录的校验和;
  • 扩展线性地址记录(HEX386) ”04”
    扩展线性地址记录也叫作32位地址记录或HEX386记录.这些记录含数据的高16位扩展线性地址记录总是有两个数据字节,外观如下:
    ::020000040800F2
    :02 是这个记录当中数据字节的数量.
    0000 是地址域, 对于扩展性地址记录 , 这个域总是0000.
    04 是记录类型 04( 扩 展 线 性地址 记录)
    0800 是地址的高16 位.
    F2 是这个记录的校验和;

参考文章

1、Keil环境下创建STM32汇编语言工程并分析HEX文件内容
2、HEX文件格式解析

上一篇:基于MDK创建纯汇编语言的STM32工程


下一篇:嵌入式软件开发基础-基于MDK创建纯汇编语言的STM32工程