配置Keil嵌入式开发环境并基于MDK完成一个STM32汇编程序的编写

本文基于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文件有了新的认识,当然如果想要学习更加透彻还需要网上多多查找资料。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cleveryoga

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值