序、安装并配置KEIL
一:安装MDK
1.首先在官网下载KEIL安装包。
https://www.keil.com/download/product/.
2.下载完成之后找到安装包并点击程序。
2.点击Next。
3.勾选同意,继续点击Next。
4.填写路径,继续点击Next。
5.填写信息,继续点击Next。
5.进入安装,中间出现插口安装提示也点击安装。
6.安装完成。
以为到这里就结束了吗?不!它还要注册(pojie不是:|)。
6.打开安装好的KEIL。(一定要以管理员身份运行!!!不然会出错!!!答应我一定要点击管理员身份运行!!!)
7.在File下找到License Management并点击。
8.复制这个ID。
9.打开我们的注册(pojie)软件,将刚刚得到的ID贴上去,选择ARM,并Generate。
10.得到注册(pojie)码之后,复制它,将它贴到我们最开始得到ID的页面这个位置,并点击Add LIC。
11.这样就恭喜你成功注册(pojie)了KEIL。
二:支持包下载
下载地址:https://www.keil.com/dd2/pack/.(我下载的是Keil.STM32Flxx_DFP.2.1.0.pack)
1.找到下载得到的Keil.STM32Flxx_DFP.2.1.0.pack。
2.点击Next。(这里我已经下载过了。)
3.等待下载,之后finish。
一、编写STM32程序
一.新建工程
1.双击打开程序Keil uversion5,点击project菜单下的new uVersion Project。
2.命名文件并保存。
3.选择仿真芯片,我选的是STM32F103VE。
4.CMSIS 下在选项 CORE后打钩;Device 下 在选项后Startup(其中包含了启动文件)打钩,之后点击OK。
5.右击 Source Group 1 ,点击 Add New Item to Group ‘Source Group 1’…
6.选择文件类型,点击 Asm Files (.s) 添加汇编文件,然后输入文件名,并点击 Add。
然后你就可以看见它啦。
二.代码编写与调试
1.代码编写
在刚才新建的.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.程序编译
- 点击 Options for Target…,就是这个有点像魔法棒的东西。
3.点击output页面,勾选Create HEX File。
4.点击Debug页面,勾选Use Simulator,修改Dialog的设置如下图(答应我一定要修改!!!不然会出错!!!),之后点击OK。
5.点击Rebuild进行编译。
看到这个就代表成功了!
3.程序调试
1.点击这个图标进入调试界面。
2.点击run运行程序。
3.进行调试,会发现得到的结果与预期的相符合,详情如图。
4.分析生成的HEX文件
1.找到生成的HEX文件,并打开。
我用的Notepad++,当然也可以用记事本。
2.扩展线性地址记录(hex 文件的第一排十六进制)也叫作 32 位地址记录或 HEX386 记录,这些记录包含数据地址的高 16 位。扩展线性地址记录总是有两个数据字节,外观如下(这里我通过标记方便对应原始数据):
:020000040800F2
字节段 | 含义 |
---|---|
02 | 记录数据字节的数量 |
0000 | 地址域,对于扩展线性地址记录,这个域总是 0000 |
04 | 记录类型 04 (扩展线性地址记录) |
0800 | 是地址的高 16 位 |
F2 | 是这个记录的校验和,计算方法:01h + NOT(02h + 00h + 00h + 04h + 08h + 00h) |
当一个扩展线性地址记录被读取,存储于数据域的扩展线性地址被保存,它被应用于从 Intel HEX 文件读取来的随后的记录。线性地址保持有效,直到它被另外一个扩展地址记录所改变。通过把记录当中的地址域与被移位的来自扩展线性地址记录的地址数据相加获得数据记录的绝对存储器地址。
3.数据部分
Intel HEX 由任意数量的十六进制记录组成。每个记录包含 5 个域,它们按一定格式排列::llaaaatt[dd…]cc。每一组字母对应一个不同的域,每一个字母对应一个十六进制编码的数字。每一个域由至少两个十六进制编码数字组成,它们构成一个字节,就像以下描述的那样:
:llaaaatt[dd…]cc
字节段 | 含义 |
---|---|
: | 每个Intel HEX记录都由冒号开头 |
ll | 数据长度域,它代表记录当中数据字节(dd)的数量 |
aaaa | 地址域,它代表记录当中数据的起始地址 |
tt | 代表HEX记录类型的域,它可能是以下数据当中的一个:00(数据记录)、01(文件结束记录)、02(扩展段地址记录)、04(扩展线性地址记录) |
dd | 数据域,它代表一个字节的数据。一个记录可以有许多数据字节.记录当中数据字节的数量必须和数据长度域(ll)中指定的数字相符 |
cc | 校验和域,它表示这个记录的校验和(校验和的计算是通过将记录当中所有十六进制编码数字对的值相加,以256为模进行以下补足) |
3.文件尾
在文件的最后一排,是一个文件的结束标志:
:00000001FF
字节段 | 含义 |
---|---|
00 | 记录的长度为 0 |
0000 | LOAD OFFSET为0000 |
01 | TYPE = 01 |
FF | 校验和为FF |
三、总结
这个程序只是真机模拟STM32的程序,后期结合单片机应该可以玩出更多的新花样。这篇就这样,下篇再见~
四、参考资料
https://blog.youkuaiyun.com/m0_58414679/article/details/120467462?utm_source=app&app_version=4.15.0&code=app_1562916241&uLinkId=usr.
https://blog.youkuaiyun.com/u010632165/article/details/106481146.