搭建并配置Keil嵌入式开发环境,并完成一个STM32汇编程序的编写,记录build生成的hex文件各段大小,了解hex文件格式及其前8个字节内容含义
目录
一、新建工程
点击菜单栏的project,在弹出的窗口点击New uVision Project
创建一个新工程
二、搭建环境
选择设备,这里我选择的是STM32F103ZET6
选择运行环境
添加源文件
鼠标右键单击Source Group 1,选择Add New Ttem to Group
选择Asm File (.s),创建汇编文件,并设置源文件的名称,点击保存
三、编写程序并运行
程序源代码如下
点击rebuild运行结果如下
四、仿真
仿真设置:在Debug选项中选择Use Simulator,表示使用软件仿真,设置下面的Dialog DLL为DARMSTM.DLL和TARMSTM.DLL,parameter下设置为-pSTM32F103C8,用于设置支持软件硬件仿真
仿真结果
五、分析生成的hex文件
用记事本打开 hex 文件,都是一连串的十六进制
1.扩展线性地址记录
扩展线性地址记录(hex 文件的第一排十六进制)也叫作 32 位地址记录或 HEX386 记录
这些记录包含数据地址的高 16 位
扩展线性地址记录总是有两个数据字节
内容 | 描述 |
020000040800F2 | |
02 | 这个记录当中数据字节的数量 |
0000 | 地址域,对于扩展线性地址记录,这个域总是 0000 |
04 | 记录类型 04 (扩展线性地址记录) |
0800 | 是地址的高 16 位 |
F2 | 是这个记录的校验和,计算方法:01h + NOT(02h + 00h + 00h + 04h + 08h + 00h) |
- 当一个扩展线性地址记录被读取,存储于数据域的扩展线性地址被保存,它被应用于从 Intel HEX 文件读取来的随后的记录
- 线性地址保持有效,直到它被另外一个扩展地址记录所改变
- 通过把记录当中的地址域与被移位的来自扩展线性地址记录的地址数据相加获得数据记录的绝对存储器地址
2.数据部分
- Intel HEX 由任意数量的十六进制记录组成。每个记录包含 5 个域,它们按一定格式排列:
:llaaaatt[dd...]cc
- 每一组字母对应一个不同的域,每一个字母对应一个十六进制编码的数字
- 每一个域由至少两个十六进制编码数字组成,它们构成一个字节,就像以下描述的那样:
:llaaaatt[dd…]cc | |
: | 每个Intel HEX记录都由冒号开头 |
ll | 数据长度域,它代表记录当中数据字节(dd)的数量 |
aaaa | 地址域,它代表记录当中数据的起始地址 |
tt | 代表HEX记录类型的域,它可能是以下数据当中的一个:00(数据记录) 、01(文件结束记录) 、02(扩展段地址记录) 、04(扩展线性地址记录) |
dd | 数据域,它代表一个字节的数据。一个记录可以有许多数据字节.记录当中数据字节的数量必须和数据长度域(ll)中指定的数字相符 |
cc | 校验和域,它表示这个记录的校验和 |
3.文件尾
- 在文件的最后一排,是一个文件的结束标志
内容 | 描述 |
:00000001FF | |
00 | 记录的长度为 0 |
0000 | LOAD OFFSET为0000 |
01 | TYPE = 01 |
FF | 校验和为FF |
六、总结
用keil创建了STM32汇编语言程序并运行成功,用keil进行了STM32的仿真,加深了对STM32的了解已及对hex文件的理解