Keil5下载安装与配置
下载地址
1、Keil5:
官网下载地址:https://www.keil.com/download/product/
2、Keil注册器:
链接:https://pan.baidu.com/s/1XFTEdhNFIx4HuZfYKxrc6g 提取码:4869
3、stm32包
链接:https://pan.baidu.com/s/1Pe8ppEkdTWRvZhPErhDTSQ 提取码:4869
点击运行下载的支持包,NEXT开始安装,安装完成,点击Finish。
Keil注册
1、keil5以及注册器安装完成后,关闭杀毒软件,然后以管理员身份运行keil5。
2、在file->license management中,找到CID,并复制下来。
3、关闭声音,运行注册器,选择arm并输入刚刚复制的CID,生成一段代码
4、将这段代码输入license management的LIC中,点击add lic
创建项目
新建项目
一、点击project -> new project
选择一个路径来存放你的项目文件,并输入你的项目文件名称,这里我写的是project。
点击保存。
二、在弹出的页面中,选择你自己所用的芯片。我选用的是野火的指南者,因此选择的是对应的STM32F103VE。
三、芯片选择完成后选择运行环境,勾出图中框的部分即可。
勾选后选择ok,项目就构建好了。
向项目中添加文件
一、新建文件
点击左上角的新建文件,待文件出现后点击保存,将文件保存在项目路径下。
因为这里要编写汇编语言,因此文件后缀名是.s。以后用c语言开发的话一般用.c或者.h文件。
二、将文件加入项目
右键点击项目里的Source Group 1,选择添加现有文件(图中所框住的部分)
然后在弹出的页面中选择刚刚保存的.s文件,将其加入本项目。
点击add,再关闭这个窗口。这时候再看左边的项目结构,就会发现文件已经加入项目里面了。现在可以对其进行编写了。
编写代码并调试
一、编写代码
在保存的文件中编写以下代码:
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
这段代码的功能是往寄存器R0-R8中填入数据。
二、配置
在编写好代码后,点击上方的魔术棒图标,如图选择output并勾选生成hex文件。
再点击debug,如图所示,选择使用左边的仿真器,并填写好自己的设备信息。
我使用的野火指南者,就按图上显示的那样填写。不同的板子要填写的内容也不一样。
三、开始调试
在func3的末尾打上一个断点,然后点击调试按钮,如图所示:
点击调试按钮后进入调试界面。
在界面的左边是寄存器的内容,当进行调试的时候,左边的寄存器内容会发生变化。右边上面是执行的指令,下面是源代码。
点击左上角的运行或者单步调试,就可以看见左边的寄存器内容发生了变化。
随着程序的运行,寄存器中的内容开始发生变化。
hex文件
在选择生成hex文件后,编译项目会生成一个hex文件。这个hex文件下载到单片机中即可运行对应的程序。
至于这个hex文件里面又是什么呢
以上面的代码为例,它生成的hex文件内容如下:
:020000040800F2
:100000000006002031010008390100083B0100080A
:100010003D0100083F010008410100080000000008
:100020000000000000000000000000004301000884
:1000300045010008000000004701000849010008D0
:100040004B0100084B0100084B0100084B01000860
:100050004B0100084B0100084B0100084B01000850
:100060004B0100084B0100084B0100084B01000840
:100070004B0100084B0100084B0100084B01000830
:100080004B0100084B0100084B0100084B01000820
:100090004B0100084B0100084B0100084B01000810
:1000A0004B0100084B0100084B0100084B01000800
:1000B0004B0100084B0100084B0100084B010008F0
:1000C0004B0100084B0100084B0100084B010008E0
:1000D0004B0100084B0100084B0100084B010008D0
:1000E0004B0100084B0100084B0100084B010008C0
:1000F0004B0100084B0100084B0100084B010008B0
:100100004B0100084B0100084B0100084B0100089F
:100110004B0100084B0100084B0100084B0100088F
:100120004B0100084B0100084B0100084B0100087F
:100130000948804709480047FEE7FEE7FEE7FEE77B
:10014000FEE7FEE7FEE7FEE7FEE7FEE704480549B7
:10015000054A064B70470000A50200087901000817
:100160000000002000060020000200200002002005
:1001700070477047704700004FF00A004FF00B01C6
:100180004FF00C024FF00D0300F009F800F00AF8F0
:1001900000F00BF8DFF81CE0DFF81CF0FEE74FF092
:1001A000050570474FF0060670474FF007074FF000
:1001B000080870479F010008AB01000810B500F067
:1001C00001F810BD0CB50020019000903348006884
:1001D00040F480303149086000BF3048006800F4C6
:1001E000003000900198401C0190009818B90198C7
:1001F000B0F5A06FF1D12948006800F4003010B1CB
:100200000120009001E0002000900098012843D1D7
:100210002348006840F01000214908600846006843
:1002200020F0030008600846006840F00200086003
:100230001A484068194948600846406848600846BE
:10024000406840F4806048600846406820F47C10B4
:1002500048600846406840F4E81048600846006876
:1002600040F08070086000BF0C48006800F000702B
:100270000028F9D00948406820F003000749486089
:100280000846406840F00200486000BF03484068EC
:1002900000F00C000828F9D10CBD0000001002404D
:1002A0000020024010B51348006840F001001149D9
:1002B000086008464068104908400E4948600846F2
:1002C00000680E4908400B4908600846006820F4A1
:1002D000802008600846406820F4FE0048604FF423
:1002E0001F008860FFF76AFF4FF000600449086054
:1002F00010BD0000001002400000FFF8FFFFF6FEF6
:0403000008ED00E024
:040000050800017975
:00000001FF
对于如何理解这些数据,我参考了这篇博客:https://blog.csdn.net/MQ0522/article/details/121648987
正如这篇博客里所说,文件里的每一行都是一条数据记录,以冒号开头,以换行结尾。而数据则使用十六进制的ASCII码表示。
对于每一条记录,有六个部分,从左往右依次是:
冒号(1个字符),数据长度(一个字节),起始地址(两个字节),数据类型(一个字节),数据(字节数是数据长度值的两倍),校验和(最后一个字节)
-
数据长度N:表示本行的数据长度,采用十六进制,范围是0x00~0xff -
起始地址:本行数据的起始地址,16进制:0~FFFF 注意,当数据类型为0x01~0x05时,起始地址为0000 -
数据类型:一个字节表示,有以下几种情况: 00:表示记录数据 01:表示文件的结束 02:标识扩展段地址 03:标识开始段地址 04:标识扩展线性地址 05:标识开始线性地址 -
数据: 本条记录的主体,数据长度为N -
校验和:用0x100-累加和(前面所有十六进制数之和)表示
参考资料
1. https://blog.csdn.net/MQ0522/article/details/121648987 2. https://blog.csdn.net/qq_45659777/article/details/120496577
|