本文基于MDK5.25版本,完成对于STM32程序的编写
一、新建项目
1.选择开发环境
本次实验使用到的开发环境为MDK5.25,需要读者自行提前安装MDK相关版本并添加STM32固件库。
MDK2.5打开界面如图所示
2.新建工程
- 打开MDK后将光标放在project上并点击新建工程。
- 命名工程名并选择保存路径,这里注意保存路径不要有中文否则接下来可能会报错。
- 在弹出的界面选择要使用的芯片类型为STM32F103C8
- 选择运行环境
- 在CMSIS中找到CORE并在后面的选项中勾选
- 在Device中找到Startup并在后面的选项中勾选
- 创建好工程右键点击Source Group1选择Add New Item
- 选择==Asm File (.s)==创建汇编文件,并命名文件名,选择保存路径。
- 点击魔术棒图标,在Output选项中勾选Create HEX File;在Debug选项中勾选Use Simulator表示使用仿真。
二、编译调试
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.调试程序
- 点击上面工具栏中放大镜中有红色d的图标进行调试
可以看到仿真结果与预期相符。
三、HEX文件说明
1.hex文件
- hex文件各段的大小
- 用记事本打开hex文件如图所示
可以看到显示的是一连串的十六进制代码。
2.hex文件格式
Hex文件如果用特殊的程序来查看(一般记事本就可以实现)。打开后可发现,整个文件以行为单位,每行以冒号开头,内容全部为16进制码(以ASCII码形式显示)。
Intel HEX 由任意数量的十六进制记录组成。每个记录包含5个域,每一组字母 对应一个不同的域,每一个字母对应一个十六进制编码的数字。每一个域由至少两个十六进制编码数字组成,它们构成一个字节。
-
:(冒号) 每个Intel HEX 记录都由冒号开头;
-
LL 是数据长度域, 它代表记录当中数据字节 (D…D) 的数量;
-
aaaa 是地址域, 它代表记录当中数据的起始地址;
-
TT是代表HEX 记录类型的域 , 它可能是以下数据当中的一 个;
-
D…D是数据域,它代表一个字节的数据。一个记录可以有许多数据字节。记录当中数据字节的数量必须和数据长度域(LL)中指定的数字相符。
-
CC是校验和域,它表示这个记录的校验和。校验和的计算是通过将记录当中所有十六进制编码数字对的值相加,以256为模进行以下补足。
00: 数据记录(Data Record),用来记录数据,HEX文件的大部分记录都是数据记录。
01: 文件结束记录(End of FileRecord),用来标识文件结束,放在文件的最后,标识HEX文件的结尾。
02: 扩展段地址记录(ExtendedSegment Address Record),用来标识扩展段地址的记录,扩展段地址记录(HEX86),它包含4~19位数据地址段。由于普通的Intel的HEX记录文件只能记录64K的地址范围,所以大于64K的地址数据要靠扩展段地址记录。
03: 开始段地址记录(Start Segment Address Record)
04: 扩展线性地址记录(Extended Linear Address Record),用来标识扩展线性地址的记录,扩展线性地址记录也叫32位地址记录或者HEX386记录,这些记录包含了数据在存储器里真实地址的高16位。 当一个扩展线性地址记录被读取后,将一直保持有效,直到它被另一个扩展地址记录改变。因为它记录的是后面数据在存储器里存放的真实起始地址,所以它的起始地址偏移量(Load offset)总是0000。
05: 开始线性地址记录(Start Linear Address Record),32位机(80386或更高的CPU)的EIP寄存器里存放的地址(main函数的入口地址)。
3.举例分析
按照上图中得到的代码
第一行:020000040800F2
可以看做是0x02 0x00 0x00 0x04 0x08 0x00 0xf2
第一个0×02表示这个记录当中数据的个数,这里是02表示有两个数据
第二个,第三个0x00 0x00表示本行数据的起始地址位,地址域,对于扩展线性地址记录,这个地方总是0000,因为是起始地址位。
第四个字节 0x04 表示扩展线性地址记录,对应上述的TT域,这里的记录类型是04。
第五个、第六个 0x08 0x00表示数据字节,与数据长度域(LL)中对应,即第一个 0x02,是地址的高16位。
最后一个字节0xf2为校验和。校验和= 0x100 - 累加和,或01h + NOT(02h + 00h + 00h + 04h + 08h + 00h)。
四、总结
本次实践操作主要对MDK的操作使用进行了熟悉,从构建文件到配置相关环境和之前所学的C51单片机还是有一定不同的。调试过程因为有以前的学习经验所以操作起来较为流畅。本次实验操作还主要分析观察了HEX文件,从他的格式规则到具体实例的分析让我对hex文件有了新的认识,当然如果想要学习更加透彻还需要网上多多查找资料。