【嵌入式基础】Keil下编译代码并生成HEX文件

目录

一、Keil环境搭建

1、百度网盘分享下载

2、Keil安装

3、注册

4、支持包安装

二、 在Keil环境下创建新项目

1、创建新项目

 2、命名新文件​编辑

 3、芯片选择和环境配置

 4、添加源文件

三、代码编写,编译与调试

1、代码编写

 2、程序编译

3、程序调试

 四、分析生成的HEX文件

 1、拓展线性地址记录

 2、数据部分

 3、文件尾

五、总结

六、参考文献


一、Keil环境搭建

1、百度网盘分享下载

mdk531安装

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

注册器

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

支持包

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

2、Keil安装

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

3、注册

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。

4、支持包安装

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

二、 在Keil环境下创建新项目

1、创建新项目

点击【project】,选择【new uvision project】创建新项目。

 2、命名新文件

 3、芯片选择和环境配置

选择芯片,这里选择的是STM32F103VE,然后点击OK。

 CMSIS下选择CORE,Device下选择Startup,选择完后点击OK。

 4、添加源文件

右击 Source Group 1 ,点击 Add New Item to Group ‘Source Group 1’…

选择文件类型,这里我们点击 Asm Files (.s) 添加汇编文件,然后输入文件名text,并点击 Add。

 

三、代码编写,编译与调试

1、代码编写

在test.s里面添加以下代码:

 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、程序编译

先进行一些初始设置,点击 Options for Target…, 在Output界面下,勾选 Create HEX File,才能生成 hex 文件;在 Debug界面下,勾选 Use Simulator,因为在后面我们要进行虚拟调试,后OK 保存设置。

设置Debug选项下面的“Dialog DLL"和"TARMSTM.DLL";parameter项改为“-pSTM32F103C8",用于设置支持STM32F103C8的软硬件仿真,点击ok

点击Rebuild进行编译

 编译成功,没有错误。

3、程序调试

点击字母d图标进入调试界面

进入调试状态后,界面与编辑状态相比有明显的变化,Debug菜单项中原来不能用的命令现在已经可以用了,工具栏会多出一个用于运行和调试的工具条,从左到右依次是复位、运行、暂停、单步、过程单步、执行完当前子程序、运行到当前行、下一状态。

按照要求进行单步运行,发现寄存器 R5,R6,R7,R8 的值和程序设置一致:

 四、分析生成的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

每一组字母对应一个不同的域,每一个字母对应一个十六进制编码的数字

每一个域由至少两个十六进制编码数字组成,它们构成一个字节,就像以下描述的那样:

内容 描述

:

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

 3、文件尾

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

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

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

五、总结

通过本次搭建虚拟仿真让我更加了解到Keil的大致功能,此次实验仿真过程中遇到了很多问题,但是通过参考其他大佬的博客以及百度帖子还是基本完成了实验要求,达到了本次实验的目的。希望在以后能更加深入学习Keil相关知识。

六、参考文献

搭建并配置Keil嵌入式开发环境,完成一个基于STM32汇编程序的编写_镜仔吃柠檬的博客-CSDN博客

https://blog.csdn.net/ssj925319/article/details/111868500
https://blog.csdn.net/u010632165/article/details/106481146
https://blog.csdn.net/beready/article/details/24668529

 

物联沃分享整理
物联沃-IOTWORD物联网 » 【嵌入式基础】Keil下编译代码并生成HEX文件

发表评论