在Keil嵌入式开发环境,完成一个基于STM32汇编程序的编写,并了解Hex文件格式及其前8个字节内容含义



一、keil的安装

这里笔者以前安装过了,但可以跟着链接https://blog.csdn.net/qq_45659777/article/details/120496577来

  • 百度网盘分享下载

mdk531安装
链接:https://pan.baidu.com/s/1ttrDhv6kXgAvPiYINf9iGw
提取码:1234

  • 注册器

链接:https://pan.baidu.com/s/1T11pBKpD6xc-cNmXBskcaw
提取码:1234

  • 支持包

链接:https://pan.baidu.com/s/1a7UDSVeLC4ktHNN9lV9oIA
提取码:1234

  • keil安装

通过以上链接下载mdk和注册器,点击安装mdk,根据提示自行更改软件路径和支持包路径,填写完注册信息后NEXT,等待安装。安装完成,点击Finish。

  • 注册

1.点击运行注册器程序。
2.在桌面找到keil软件图标,点击右键,以管理员身份运行。
3.点击File–>Lincense Management–>Single-User Lincense,找到CID,复制CID中的内容填写到注册器的CID空白处,将注册器中Target选择为ARM,点击Generate,得到注册码。
4.将生成的注册码复制粘贴到Keil的New Lincense ID Code空白处,点击Add LIC,点击Close。

  • 支持包安装

点击运行下载的支持包,NEXT开始安装,安装完成,点击Finish。

二、一个基于STM32汇编程序的编写

1.创建工程及配置环境

  1. 打开keil5,在project中选择new uvison project

在这里插入图片描述
2. 填写文件名,这里读者命名为LED

在这里插入图片描述
3. 配置环境,选择使用的stm32芯片

在这里插入图片描述
4. 选择运行环境,勾选CMSIS下的CORE和DEVICE下的STARTUP

在这里插入图片描述

2.添加文件

1.在project的Target 1文件下右键单击Source Group 1选择
Add New Item to Group.

在这里插入图片描述
2.选择Asm File (.s),填入源文件名称,然后点击Add

在这里插入图片描述
然后就可以看见文件被创建成功,可以编入代码

在这里插入图片描述

3.代码编写

输入如下代码

 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


在这里插入图片描述

  • 条件设置
    先点开晶振图标,点击Output,勾选Creat Hex File

在这里插入图片描述
然后点击Debug,勾选Use Simulator,然后将Dialog DLL改成DARMSTM.DLL,将Parameter改成之前选择的-pSTM32F103ZE

在这里插入图片描述

4.编译调试

第一步,点击rubuild图标进行编译

在这里插入图片描述

编译完成后发现并没有错误,可以进行下一步开始调试

第二步,点击Debug图标进行调试

在这里插入图片描述
最后,点击step over逐步,发现R5,R6,R7,R8与程序设置一致

在这里插入图片描述

三、分析Hex文件

1.打开Hex文件

在之前文件的路径下找到Hex文件,选择打开,我们这里打开方式用的记事本

  • 在前面我们做的需要在晶振图标下勾选creat hex file的步骤,将会生成hex文件

在这里插入图片描述

2.扩展线性地址记录

hex文件的第一排字符称之为扩展线性地址记录,也称为32位地址记录或HEX386记录
在第一行数据:020000040800F2中,其实际表达为0x02 0x00 0x00 0x04 0x08 0x00 0xf2

  • 第一个字节 0x02表示本行数据的长度;
  • 第二、三字节 0x00 0x00表示本行数据的起始地址;
  • 第四字节 0x04表示数据类型,用来标识扩展线性地址的记录,数据类型有:0x00、0x01、0x02、0x03、0x04、0x05
'00' Data Rrecord:用来记录数据,HEX文件的大部分记录都是数据记录
'01' End of File Record: 用来标识文件结束,放在文件的最后,标识HEX文件的结尾
'02' Extended Segment Address Record: 用来标识扩展段地址的记录
'03' Start Segment Address Record:开始段地址记录
'04' Extended Linear Address Record: 用来标识扩展线性地址的记录
'05' Start Linear Address Record:开始线性地址记录
  • 然后是数据,0x08 0x00是地址的高16位
  • 最后一个字节 0xf2为校验和,计算方法为: 01h + NOT (02h+ 00h+ 00h +04h +08h+00h)
当一个扩展线性地址记录被读取,存储于数据域的扩展线性地址被保存,它被应用于从 Intel HEX 文件读取来的随后的记录
线性地址保持有效,直到它被另外一个扩展地址记录所改变
通过把记录当中的地址域与被移位的来自扩展线性地址记录的地址数据相加获得数据记录的绝对存储器地址

3.数据部分

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

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

4.文件尾

在文件最后一排,是一个文件结束的标志 :00000001FF

这是一个END OF FILE RECORD,标识文件的结尾

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

总结

本文简单介绍了keil的安装注册,在keil环境下编译调试了一个基于stm32汇编程序的编写,了解了Hex文件格式及其前8个字节内容含义。在这过程中遇到了许多困难,幸好在参考资料和询问同学下,慢慢解决了。期待更进一步!

参考资料:https://blog.csdn.net/qq_45659777/article/details/120496577
https://blog.csdn.net/qq_43279579/article/details/108880667?utm_source=app
https://blog.csdn.net/ssj925319/article/details/108919862

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值