基于Keil创建汇编语言的STM32工程

2023-11-14

本文是在Keil嵌入式开发环境下完成一个基于STM32汇编程序的编写,学习在没有硬件条件下进行仿真调试,观察ARM寄存器的变化状况,记录过程生成的 hex文件各段的大小,了解Hex文件格式及其前8个字节内容含义。

一、新建工程

双击打开 Keil uVision5 软件

点击菜单栏的Project -> New uVision Project 新建一个项目

自定义项目路径和项目名,点击回车,项目建立成功,弹出以下界面
在这里插入图片描述

二、配置环境

1.选择设备

设置工程的目标环境,本文基于STM32F103ZET6,因此在弹出选择窗口选出对应的芯片,点击OK即可。
在这里插入图片描述

2.选择运行环境

ARM的CMSIS已经把开发所需要的软件组件都封装好了,因此直接选择即可:

1.CMSIS下选择CORE;
2.Device下Startup,其中包含了启动文件;
具体操作如下图:
在这里插入图片描述
然后点击OK,这样运行环境就配置好了。

三、添加源文件

1.新建文件

单击 Source Group 1后,选择Add New Item to Group ‘Source Group 1’
在这里插入图片描述
因为是创建汇编文件,所以选择 Asm File (.s) 添加汇编文件
在这里插入图片描述
输入文件名,点击 Add 新建成功
在这里插入图片描述

2.添加源代码

在这里插入图片描述

添加的源代码如下:

 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

四、编译运行文件

1.仿真器设置

依次点击Project ->Options for Target ‘Target1’
在这里插入图片描述
在弹出的窗口中点击Output,勾选Create HEX File ,这样才能生成Hex文件
在这里插入图片描述

然后点击 Debug ,勾选 Use Simulator ,这样才能进行后面的虚拟调试,后点击OK保存即可
在这里插入图片描述

2.文件编译

点击Rebuild对文件进行编译
在这里插入图片描述
程序并无报错,编译成功
在这里插入图片描述

3.程序调试

点击右上方的调试图标进入调试阶段
在这里插入图片描述
接着点击Step 进行单步执行调试
在这里插入图片描述
在这里我们会发现程序一直循环,不能正常的进行调试,查阅相关错误可发现是我们在Debug中Diolog未进行设置

详情可参考 https://blog.csdn.net/beready/article/details/24668529

再次进入仿真器设置界面,对Debug界面的Dialog DLL 和Parameter 进行参数设置
修改Dialogue DLL中参数为 DARMSTM.DLL,Parameter 中参数为 -pSTM32F103ZE(因为本次实验用的STM32F103ZET6芯片),修改后如下页图所示:
在这里插入图片描述

4.调试结果

再次调试运行,发现结果符合预期,寄存器R5、R6、R7、R8的值和程序设置一致,具体结果如图所示:
在这里插入图片描述

五.HEX文件的分析

打开实验所生成的hex文件可以看出,是一串十六进制字符
在这里插入图片描述

1.扩展线性地址记录

扩展线性地址记录(即hex 文件的第一排)也叫作 32 位地址记录或 HEX386 记录

这些记录包含数据地址的高 16 位

扩展线性地址记录总是有两个数据字节
如图,其中第一行数据为020000040800F2,可以看做是0x02 0x00 0x00 0x04 0x08 0x00 0xF2,其前四个字节和最后一个字节有特殊含义,中间为数据.

第一个0x02表示该行数据中有两个数据
第二个,第三个0x00 0x00表示本行数据的起始地址位
第四个字节有0x00 0x01 0x02 0x03 0x04 0x05,分别有以下含义:

‘00’ Data Rrecord:用来记录数据,HEX文件的大部分记录都是数据记录

‘01’ 文件结束记录:用来标识文件结束,放在文件的最后,标识HEX文件的结尾

‘02’ 扩展段地址记录:用来标识扩展段地址的记录

‘03’ 开始段地址记录:开始段地址记录

‘04’ 扩展线性地址记录:用来标识扩展线性地址的记录

‘05’ 开始线性地址记录:开始线性地址记录

最后一个字节0xf8为校验和。校验和= 0x100-累加和。在nodepad++中,如果该校验和不是绿色,则表示该校验和是错的。

2.数据部分

Intel HEX 由任意数量的十六进制记录组成。每个记录包含5个域,它们按以下格式排列:

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

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

通常表示为::[1字节长度][2字节地址][1字节记录类型][n字节数据段][1字节校验和]

3.文件结束

在这里插入图片描述
如图可知,该hex文件末尾数据为00000001FF,是一个文件结束的标志

00:记录的长度为 0
0000:LOAD OFFSET为0000
01:TYPE = 01
FF:校验和为FF

六、实验小结

通过实验可以发现在Keil环境下创建STM32汇编语言工程还是相对简单的,虽然在软件调试的过程中遇到了一些问题,但通过查阅相关资料、询问同学还是得以解决,最终完成本实验。

参考文献:
1.https://blog.csdn.net/weixin_39752827/article/details/81477686
2.https://blog.csdn.net/m0_58414679/article/details/120467462?utm_source=app&app_version=4.15.0&code=app_1562916241&uLinkId=usr1mkqgl919blen
3.https://blog.csdn.net/qq_43279579/article/details/111717607

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于Keil创建汇编语言的STM32工程 的相关文章

随机推荐

  • AVPlayer视频播放

    AVFoundation中的元数据 Apple环境下的媒体类型主要有四种 QuickTime mov MPEG 4 video mp4和m4v MPEG 4 audio m4a MPEG Layer III audio mp3 使用元数据
  • PostgreSQL和mysql语法区别详解通俗易懂

    目录 0 PostgreSQL的数据类型 0 1 数值数据类型 0 2 字符串数据类型 0 3 日期 时间数据类型 0 4 布尔类型 0 5 货币类型 0 6 几何类型 1 PostgreSQL创建表 1 1 建表之前 创建自增序列 1 2
  • 数据结构(1)—— 程序性能分析

    目录 1 什么是程序性能 2 空间复杂度 2 1 空间复杂度的组成 3 时间复杂度 3 1 时间复杂度的组成 1 什么是程序性能 所谓程序性能 performance of a program 是指运行这个程序所需要的内存和时间的多少 一个
  • Linux常见命令

    ifconfig 查看ip vi filename 打开或新建文件 并将光标置于第一行首 mkdir dir1 创建一个叫做 dir1 的目录 mkdir dir1 dir2 同时创建两个目录 rm f file1 删除一个叫做 file1
  • 两个二维数组合并

  • 重磅发布

    导语 后疫情时代 随着各行业线下业务与线上业务的深度结合转型 流量思维的增量导向逐渐转向降本增效 虚假流量已经成为互联网时代信息化数字资产最大的威胁之一 据极验最新行业数据统计 各个行业都有较高比例的虚假流量存在 机器流量最为泛滥的区块链行
  • Flutter实现类似Android中的PopupWindow控件

    最近在网上看到一段话 产品有三宝 弹窗 浮层加引导 设计有三宝 透明 阴影加圆角 运营有三宝 短信 push加红包 在日常开发中经常会遇到弹窗 浮层之类的效果 这些在Android中实现很简单 可以用PopupWindow完成 但是在flu
  • 静态映射和动态映射

    1 为什么需要映射 在内核启动过程中会开启MMU 建立虚拟映射表 以后内核使用的都是虚拟地址 但是我们查询数据手册得到I O寄存器地址都是物理地址 于是需要将物理地址转换到虚拟地址 这样才能在内核空间去访问I O寄存器 物理地址转换到虚拟地
  • Linux下配置pptp协议之拨号上网

    首先安装pptp sodo apt get install pptp linux y 创建连接 sudo pptpsetup create nodeName server yourServerAddr username xxx passwo
  • zookeeper的安装部署

    1安装zookeeper集群 上传安装包 移动到指定文件夹 mv zookeeper 3 4 6 tar gz opt apps 3 解压 tar zxvf zookeeper 3 4 6 tar gz 4 修改配置文件 1 进入到conf
  • Git介绍及常用命令

    Git介绍及常用命令 在软件开发过程中 团队协作基本上都会使用到git git可以使得团队开发效率变高 因此 我们接下来介绍git的使用方法 国内一般使用gitee 当然 也可以使用github github是国外的 所以加载慢 甚至加载不
  • SQL知识整理三:变量、全局变量、视图、事务、异常

    SQL知识整理三 变量 全局变量 视图 事务 异常 参考文章 1 SQL知识整理三 变量 全局变量 视图 事务 异常 2 https www cnblogs com chengxingliang p 3333277 html 备忘一下
  • 【马普所2008】机器学习中的核方法(上)

    Hofmann T Sch Lkopf B Smola A J Kernel methods in machine learning J Annals of Stats 2008 36 3 1 Integrating structured
  • Spring的事务隔离级别

    Spring的事务隔离级别是用于控制事务并发访问数据库时的行为 Spring框架提供了五个事务隔离级别 分别是 1 DEFAULT 默认 使用数据库默认的事务隔离级别 在大多数情况下 这等同于使用READ COMMITTED级别 2 REA
  • 使用纯java ssh方式连接linux服务器,并用此方式部署war到linux的tomcat下

    b 纯java代码使用ssh方式登录linux服务 实际应用中 可以使用这种方式上传部署web工程war包 并且部署启动tomcat 一个自动化完成所有工作 起到节省时间作用 1 去 url http www jcraft com jsch
  • QIIME2-DADA2&Deblur

    Deblur使用序列错误配置文件将错误的序列与从其来源的真实生物序列相关联 从而得到高质量的序列变异数据 主要为两个步骤 DADA2 质控 汇总版 qiime dada2 denoise single i demultiplexed seq
  • notepad 自动换行 分屏 快捷键

    一 自动换行 视图 gt 自动换行 二 分屏 Tab标签 上方文件名 右键 gt 移动到另一视图 三 快捷键 快速复制 Ctrl D 区块注释 Ctrl Shift Q 保存所有打开文件 Ctrl Shift S 行注释 Ctrl K 取消
  • 内卷化时代,一名普通测试员的铁饭碗究竟是什么?

    内卷 是现在热度非常高的一个词汇 随着热度不断攀升 隐隐有了 万物皆可卷 的程度 究其来源 内卷这个词的出现 是伴随着996开始讨论的 很不幸 996 福报等等这些词的重灾区和源头就是计算机 互联网行业 那么作为行业中一个非常重要的分支 测
  • web前端模块化框架,一句代码让html可直接引入别的html文件

    web前端模块化框架 介绍 一个web前端模块化框架 可以引入模板html文件 利于前后端分离的网站重复代码以及模块的复用 软件架构 本框架是利用mloader js文件加载带有mloader template的类的标签从而进行的文档的动态
  • 基于Keil创建汇编语言的STM32工程

    本文是在Keil嵌入式开发环境下完成一个基于STM32汇编程序的编写 学习在没有硬件条件下进行仿真调试 观察ARM寄存器的变化状况 记录过程生成的 hex文件各段的大小 了解Hex文件格式及其前8个字节内容含义 文章目录 一 新建工程 二