基于Keil5创建STM32汇编语言工程以及hex文件分析

您所在的位置:网站首页 keil5怎么导出mainc 基于Keil5创建STM32汇编语言工程以及hex文件分析

基于Keil5创建STM32汇编语言工程以及hex文件分析

2024-07-14 14:59| 来源: 网络整理| 查看: 265

文章目录 一、工程建立和环境配置1.新建项目工程2.配置适合单片机型号的环境 二、用汇编语言编写代码三、编译运行代码1.设置参数2.代码编译3.程序调试 四、分析hex文件五、总结六、参考汇总

一、工程建立和环境配置 1.新建项目工程 双击图标,打开Keil 5 在这里插入图片描述点击Project,打开工程项目 在这里插入图片描述 -点击New uVision Project,新建一个项目 在这里插入图片描述自定义文件名后,点击保存 在这里插入图片描述 2.配置适合单片机型号的环境 在select Device for Target中选择单片机型号包 在这里插入图片描述选择合适自己型号的单片机包后,点击OK 在这里插入图片描述在界面中勾选CORE和Startup两项后,点击OK 在这里插入图片描述右击Source Group后,点击Add New Item to Group... 在这里插入图片描述选中Asm File并在在Name处自定义名字后,点击Add

在这里插入图片描述

在Source Group下发现.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

代码出处:Keil环境下创建STM32汇编语言工程并分析HEX文件内容

三、编译运行代码 1.设置参数

编译前首先要设置一下参数,步骤如下:

找到并点击Options for Target... 在这里插入图片描述在output中找到Create HEX File并勾选,这样才可以生成hex文件 在这里插入图片描述在Debug中找到并选中Use Simulator,便于我们可以进行虚拟调试,然后点击OK 在这里插入图片描述 2.代码编译 点击左上角的Rebuild进行编译 在这里插入图片描述0 Error(s)表示编译成功,没有错误 在这里插入图片描述 3.程序调试 点击Start/Stop Debug Session,进入调试模式,开始调试程序 在这里插入图片描述单击Step或者F11,即可进行单步调试

在这里插入图片描述

若出现error 65 在这里插入图片描述 解决方案如下:(详细解决方案来自:KEIL Debug:error 65) ① 在任意磁盘任意目录下创建一个.ini文件,内容为map 0x40000000,0x40070000 read write 在这里插入图片描述② 在Options for Target...中的Debug下的Initialization File处选择刚才所创建的.ini文件,点击OK 在这里插入图片描述调试中已无错误,问题已解决 在这里插入图片描述经过调试,发现寄存器R0、R1、R2、R3、R5、R6、R7、R8的值和程序代码设置的值一致 在这里插入图片描述 在这里插入图片描述 四、分析hex文件 在名为object文件夹中找到.hex文件,双击后,选择用记事本方式打开 在这里插入图片描述用记事本方式打开后的.hex文本 在这里插入图片描述扩展线性地址记录

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

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

扩展线性地址记录总是有两个数据字节,外观如下(这里我通过标记方便对应原始数据):

:020000040800F2

内容描述02这个记录当中数据字节的数量0000地址域,对于扩展线性地址记录,这个域总是 000004记录类型 04 (扩展线性地址记录)0800是地址的高 16 位F2是这个记录的校验和,计算方法:01h + NOT(02h + 00h + 00h + 04h + 08h + 00h)

当一个扩展线性地址记录被读取,存储于数据域的扩展线性地址被保存,它被应用于从 Intel HEX 文件读取来的随后的记录

线性地址保持有效,直到它被另外一个扩展地址记录所改变

通过把记录当中的地址域与被移位的来自扩展线性地址记录的地址数据相加获得数据记录的绝对存储器地址

数据部分·

Intel HEX 由任意数量的十六进制记录组成。每个记录包含 5 个域,它们按一定格式排列::llaaaatt[dd…]cc

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

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

:llaaaatt[dd…]cc

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

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

:00000001FF

内容描述00记录的长度为 00000LOAD OFFSET为000001TYPE = 01FF校验和为FF 五、总结

在Keil5下创建STM32工程,用汇编语言编写程序的操作还是比较容易上手掌握的,亲自操作一遍的效果要比只看不做的效果好很多,萌新小编,还有很多不足之处,希望大佬们多多斧正

六、参考汇总

① Keil环境下创建STM32汇编语言工程并分析HEX文件内容 ② KEIL Debug:error 65



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3