Keil嵌入式开发环境下,STM32汇编程序的编写及Hex文件的简单分析

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
0000LOAD OFFSET为0000
02TYPE=01
FF校验和为FF

总结

本文仅简单介绍了在Keil嵌入式开发环境下,STM32汇编程序的简单编写及Hex文件的简单分析。在操作过程中也遇到了很多的问题,但通过查找资料,询问同学,还是完成了本次实验。同时也期待大家能够积极留言,指出我存在的问题,谢谢!

参考资料:
https://blog.csdn.net/qq_48641886/article/details/120562414?spm=1001.2014.3001.5502
https://blog.csdn.net/qq_46467126/article/details/120444165?spm=1001.2014.3001.5502

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值