一、keil的安装
这里笔者以前安装过了,但可以跟着链接https://blog.csdn.net/qq_45659777/article/details/120496577来
mdk531安装 链接:https://pan.baidu.com/s/1ttrDhv6kXgAvPiYINf9iGw 提取码:1234
链接:https://pan.baidu.com/s/1T11pBKpD6xc-cNmXBskcaw 提取码:1234
链接:https://pan.baidu.com/s/1a7UDSVeLC4ktHNN9lV9oIA 提取码:1234
通过以上链接下载mdk和注册器,点击安装mdk,根据提示自行更改软件路径和支持包路径,填写完注册信息后NEXT,等待安装。安装完成,点击Finish。
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。
点击运行下载的支持包,NEXT开始安装,安装完成,点击Finish。
二、一个基于STM32汇编程序的编写
1.创建工程及配置环境
- 打开keil5,在project中选择new uvison project
2. 填写文件名,这里读者命名为LED
3. 配置环境,选择使用的stm32芯片
4. 选择运行环境,勾选CMSIS下的CORE和DEVICE下的STARTUP
2.添加文件
1.在project的Target 1文件下右键单击Source Group 1选择 Add New Item to Group .
2.选择Asm File (.s),填入源文件名称,然后点击Add
然后就可以看见文件被创建成功,可以编入代码
3.代码编写
输入如下代码
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
- 条件设置
先点开晶振图标,点击Output ,勾选Creat Hex File 。
然后点击Debug,勾选Use Simulator ,然后将Dialog DLL改成DARMSTM.DLL ,将Parameter改成之前选择的-pSTM32F103ZE 。
4.编译调试
第一步,点击rubuild 图标进行编译
编译完成后发现并没有错误,可以进行下一步开始调试
第二步,点击Debug 图标进行调试
最后,点击step over逐步,发现R5,R6,R7,R8与程序设置一致
三、分析Hex文件
1.打开Hex文件
在之前文件的路径下找到Hex文件,选择打开,我们这里打开方式用的记事本
- 在前面我们做的需要在晶振图标下勾选creat hex file的步骤,将会生成hex文件
2.扩展线性地址记录
hex文件的第一排字符称之为扩展线性地址记录 ,也称为32位地址记录或HEX386记录 在第一行数据:020000040800F2中,其实际表达为0x02 0x00 0x00 0x04 0x08 0x00 0xf2 。
- 第一个字节 0x02表示本行数据的长度;
- 第二、三字节 0x00 0x00表示本行数据的起始地址;
- 第四字节 0x04表示数据类型,用来标识扩展线性地址的记录,数据类型有:0x00、0x01、0x02、0x03、0x04、0x05
'00' Data Rrecord:用来记录数据,HEX文件的大部分记录都是数据记录
'01' End of File Record: 用来标识文件结束,放在文件的最后,标识HEX文件的结尾
'02' Extended Segment Address Record: 用来标识扩展段地址的记录
'03' Start Segment Address Record:开始段地址记录
'04' Extended Linear Address Record: 用来标识扩展线性地址的记录
'05' Start Linear Address Record:开始线性地址记录
- 然后是数据,0x08 0x00是地址的高16位
- 最后一个字节 0xf2为校验和,计算方法为:
01h + NOT (02h+ 00h+ 00h +04h +08h+00h) 。
当一个扩展线性地址记录被读取,存储于数据域的扩展线性地址被保存,它被应用于从 Intel HEX 文件读取来的随后的记录
线性地址保持有效,直到它被另外一个扩展地址记录所改变
通过把记录当中的地址域与被移位的来自扩展线性地址记录的地址数据相加获得数据记录的绝对存储器地址
3.数据部分
Intel HEX 由任意数量的十六进制记录组成。每个记录包含 5 个域,它们按一定格式排列:llaaaatt[dd…]cc 每一组字母对应一个不同的域,每一个字母对应一个十六进制编码的数字。每一个域由至少两个十六进制编码数字组成,它们构成一个字节
内容 | 描述 |
---|
ll | 数据长度域,它代表记录当中数据字节(dd)的数量 | : | 每个Intel HEX记录都由冒号开头 | aaaa | 地址域,它代表记录当中数据的起始地址 | tt | 代表HEX记录类型的域,它可能是以下数据当中的一个:00(数据记录)、01(文件结束记录)、02(扩展段地址记录)、04(扩展线性地址记录) | dd | 数据域,它代表一个字节的数据。一个记录可以有许多数据字节.记录当中数据字节的数量必须和数据长度域(ll)中指定的数字相符 | cc | 表示这个记录的校验和(校验和的计算是通过将记录当中所有十六进制编码数字对的值相加,以256为模进行以下补足) |
4.文件尾
在文件最后一排,是一个文件结束的标志 :00000001FF 。
这是一个END OF FILE RECORD,标识文件的结尾
内容 | 描述 |
---|
00 | 记录的长度为0 | 0000 | LOAD OFFSET为0000 | 02 | TYPE=01 | FF | 校验和为FF |
总结
本文简单介绍了keil的安装注册,在keil环境下编译调试了一个基于stm32汇编程序的编写,了解了Hex文件格式及其前8个字节内容含义。在这过程中遇到了许多困难,幸好在参考资料和询问同学下,慢慢解决了。期待更进一步!
参考资料:https://blog.csdn.net/qq_45659777/article/details/120496577 https://blog.csdn.net/qq_43279579/article/details/108880667?utm_source=app https://blog.csdn.net/ssj925319/article/details/108919862
|