KEIL C51环境下,STM32汇编语言工程的创建及Hex文件的分析
文章目录
前言
在开发单片机时,使用的是C语言或者汇编语言,这两种语言都不能直接烧写到单片机里面,执不执行暂且不说,光是代码的体积,就足以撑破整个单片机。所以,需要一个软件,把C语言或者汇编语言编译生成单片机可执行的二进制代码,而且它的体积也非常的小,足够存放在单片机的存储器里面。KEIL公司(现在是ARM公司的一个公司)的软件恰好可以提供这样的功能,并且它还有很多优点,比如工程易于管理,自动加载启动代码,集编辑、编译、仿真一体,调试功能强大等等
本次,我将在Keil嵌入式开发环境下,演示进行STM32汇编程序的简单编写以及Hex文件的初步分析
一、Keil下载安装
1.Keil C51的简介
Keil C51是美国Keil Software公司出品的51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用;
Keil提供了包括C编译器、宏汇编、链接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境(μVision)将这些部分组合在一起;
2013年10月,Keil正式发布了Keil μVision5 IDE,也是目前最新版本
2.软件下载
- Keil开发环境可以在官网下载(注意下载正确版本,STM32属于MDK-Arm):
3.环境搭建
- 第一步:双击MDK524a应用程序文件,点击next>>
- 第二步:同意安装协议
- 第三步:自定义安装路径
- 第四步:填写个人信息
- 第五步:等待安装
- 最后安装成功
二、在keil环境下创建新项目
1.新建工程
- 打开Keil,选择“project”,点击“New μVision Project…”:
- 选择项目工程存放的位置,并进行命名,最后点击保存:
- 弹出的窗口如下图所示:
(设置工程的目标环境,这里是基于STM32F103VE;既可以通过Search直接进行输入查找;也可通过+号进行手动查询)
- 选择运行环境:
CMSIS中选择CORE;Device中选择Startup
2.添加源文件
- 在界面左侧的Project栏,打开Target1,鼠标右键单击Source Group1, 选择Add New Item to Group…
- 选择Asm File(.s),设置源文件名称,并保存:
二、代码编写,编译与调试
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.条件设置
- 首先在Output下勾选Create Hex File,这样才可以生成hex文件:
- 再次点击Debug,勾选其下的Use Simulator(表示使用软件仿真):
- 设置下面的Dialog DLL项为:DARMSTM.DLL和TARMSTM.DLL
- Parameter项为:-pSTM32F103C8
然后点击OK
3.编译调试
- 点击如下图所示的build或rebuild进行编译:
- 再点击如下所示的标识进入调试:
- 工程并进入调试模式后,点击如图所示的step over键,可以得到预期结果:
- 由上图可以看出:寄存器R5,R6,R7,R8与程序设置一致
四、分析生成的Hex文件
- 由于我们再之前的条件设置环节,已经勾选了生成Hex文件,所以这里不需要再去设置一次
1.打开Hex文件
- 这里用记事本打开项目所在文件夹下的.hex文件:
2.扩展线性地址记录
- 扩展线性地址记录(hex 文件的第一排十六进制)也叫作 32 位地址记录;
- 扩展线性地址记录总是有两个数据字节,外观如下:
:020000040800F2
(注:这里为了标记方便,采用原始数据)
内容 | 描述 |
---|---|
02 | 记录当前数据字节的数量 |
0000 | 地址域,对于扩展线性地址,这个域总是0000 |
04 | 记录类型04(扩展线性地址记录) |
0800 | 是地址的高16位 |
F2 | 是这个记录的校验和,计算方法:01h+NOT(02h+00h+04h+08h+00h) |
- 当一个扩展线性地址记录被读取,存储于数据域的扩展线性地址被保存,它被应用于从 Intel HEX 文件读取来的随后的记录
- 线性地址保持有效,直到它被另外一个扩展地址记录所改变
- 通过把记录当中的地址域与被移位的来自扩展线性地址记录的地址数据相加获得数据记录的绝对存储器地址
3.数据部分
- Intel HEX 由任意数量的十六进制记录组成。每个记录包含 5 个域,它们按一定格式排列::llaaaatt[dd…]cc
- 每一组字母对应一个不同的域,每一个字母对应一个十六进制编码的数字
- 每一个域由至少两个十六进制编码数字组成,它们构成一个字节,就像以下描述的那样::llaaaatt[dd…]cc
内容 | 描述 |
---|---|
ll | 数据长度域,它代表记录当中数据字节(dd)的数量 |
: | 每个Intel HEX记录都由冒号开头 |
aaaa | 地址域,它代表记录当中数据的起始地址 |
tt | 代表HEX记录类型的域,它可能是以下数据当中的一个:00(数据记录)、01(文件结束记录)、02(扩展段地址记录)、04(扩展线性地址记录) |
dd | 数据域,它代表一个字节的数据。一个记录可以有许多数据字节.记录当中数据字节的数量必须和数据长度域(ll)中指定的数字相符 |
cc | 表示这个记录的校验和(校验和的计算是通过将记录当中所有十六进制编码数字对的值相加,以256为模进行以下补足) |
4.文件尾
- 在文件最后一排,是一个文件结束的标志
:00000001FF
内容 | 描述 |
---|---|
00 | 记录的长度为0 |
0000 | LOAD OFFSET为0000 |
02 | TYPE=01 |
FF | 校验和为FF |
总结
本文仅简单介绍了在Keil嵌入式开发环境下,STM32汇编程序的简单编写及Hex文件的简单分析。在操作过程中也遇到了很多的问题,但通过查找资料,询问同学,还是完成了本次实验。同时也期待大家能够积极留言,指出我存在的问题,谢谢!
参考资料:
https://blog.youkuaiyun.com/qq_48641886/article/details/120562414?spm=1001.2014.3001.5502
https://blog.youkuaiyun.com/qq_46467126/article/details/120444165?spm=1001.2014.3001.5502