购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

3.2 Keil MDK的安装与使用

3.2.1 如何安装Keil MDK

1. 获取Keil MDK安装包

Keil MDK的安装包可以到KEIL官网上下载,官网中的Keil MDK下载界面如图3.1所示。单击“MDK-Arm”,进入个人信息填写界面,完善个人信息之后即可下载安装包。这里下载的Keil MDK版本是MDK-ARM V5.26,如果有更新的版本,开发者也可以使用更新的版本。

图3.1 官网中的Keil MDK下载界面

2. 具体安装步骤

(1)下载好安装包后,双击打开,即可安装Keil MDK。Keil MDK初始安装界面如图3.2所示。在弹出的初始安装对话框中单击“Next”按钮,进入软件使用条款界面。

图3.2 Keil MDK初始安装界面

(2)在软件使用条款界面勾选“I agree to all the terms of the preceding License Agreement”复选框(见图3.3),再次单击“Next”按钮,进入安装路径选择界面。

图3.3 软件使用条款界面

(3)在安装路径选择界面选择合适的安装路径,并单击“Next”按钮,如图3.4所示。

图3.4 安装路径选择界面

注意

路径名一定不能带有中文,并且安装目录不能与51单片机的Keil或Keil4冲突,三者的目录必须分开。

(4)填写用户信息界面(见图3.5)。个人用户根据自己的情况填写即可,填完之后单击“Next”按钮即正式开始软件的安装。

图3.5 填写用户信息界面

(5)当进度条滚到最右端时,弹出安装完成界面(见图3.6),单击“Finish”按钮即可完成安装。

图3.6 安装完成界面

3. 安装STM32芯片包

Keil MDK5不像Keil MDK4那样自带了很多厂商的MCU芯片包,而是需要自己安装相应芯片的支持包。单击“Finish”按钮,关掉KEIL5安装完成界面后即弹出MCU芯片包的安装界面,如图3.7所示。Keil MDK会自动下载各种厂商的MCU芯片包,如果此时计算机没有连接网络或网速较慢,则会出现报错,不过这是没有影响的,可以直接关掉它,手动下载所需要的MCU芯片包再进行安装。这里建议开发者选择手动安装所需要的MCU芯片包。STM32系列的芯片包可以在KEIL官网上下载。

图3.7 MCU芯片包的安装界面

STM32系列的芯片包下载界面如图3.8所示。在官网中找到STM32系列的芯片包,选择相应的系列下载到本地计算机中,具体下载哪个系列需要参照所使用单片机,用什么就下载什么,没必要安装全部的芯片包。下载完成后,双击打开,进行安装即可。

图3.8 STM32系列的芯片包下载界面

MCU芯片包的安装路径必须与Keil MDK的安装路径一致。安装完成之后,在Keil MDK的Pack Installer中就可以看到所安装的MCU芯片包了。在开始开发嵌入式系统时,选择对应的单片机型号即可。

说明

本书内容所涉及的Keil MDK软件仅供教学使用,Keil MDK软件作为一款商业开发工具并不是免费的,前面安装的Keil MDK软件默认为试用版,只能编译不超过32KB的代码。如果要编译的程序代码超过32KB或想要用作商业用途,则必须购买正版软件,以获得使用权。

3.2.2 创建库函数工程模板

现在有了开发工具,基于第2章对STM32标准函数库的学习,就可以利用所安装的Keil MDK软件建立STM32嵌入式系统的工程了。利用STM32标准函数库新建工程的步骤比较烦琐,通常的做法是,先使用STM32标准函数库建立一个空的工程作为通用工程模板,当设计和开发实际的STM32嵌入式系统时,直接复制这个通用工程模板即可。在通用工程模板的基础上进行修改和开发,可提高系统开发的效率。

1. 建立工程框架

为了使工程目录更加清晰,先在本地计算机上新建一个“通用工程模板”文件夹,再在该文件夹中新建三个文件夹,分别命名为Project、Libraries和Guide。其中Project文件夹用于存放工程文件;Libraries文件夹用于存放STM32库文件;Guide文件夹用于存放程序说明TXT文件,这个说明文件需要由开发者自行编写。在Libraries文件夹中新建两个文件夹,命名为CMSIS和STM32F10x_Driver,分别用于存放内核与外设的库文件。

创建完所需要的文件夹之后,打开Keil MDK软件,单击菜单:Project\New µVision Project…,把目录定位到刚才建立的“通用工程模板\Project”文件夹之下,先将工程命名为“Template”,之后单击“保存”按钮。“Template”仅作为所创建的通用工程模板的名称,在以后设计和开发实际的嵌入式系统时,为了方便区分,可以将“Template”改为相应工程应用的英文名称。

单击“保存”按钮之后,会弹出一个芯片型号选择界面(见图3.9),需要选择对应的芯片型号。本书主要以STM32F103ZET6单片机为例讲解STM32嵌入式系统的设计与实践,因此,选择STMicroelectronics\STM32F1 Series\STM32F103\STM32F103ZE。如果使用的是其他系列的芯片,只需要选择相应的型号就可以了。

图3.9 芯片型号选择界面

注意

在Keil MDK5软件中,只有安装了对应的芯片包才会显示相应的芯片型号,因此,在使用KeilMDK5软件设计嵌入式系统时,一定要先安装好与自己硬件相对应的芯片包,否则将无法选择正确的芯片型号。

单击“OK”按钮之后,Keil MDK5软件会弹出一个“Manage Run-Time Environment”对话框,这是Keil MDK5软件新增的一个功能。在这个对话框中,可以添加需要的组件,从而方便构建开发环境。这里不做过多介绍,直接单击“Cancel”按钮,进入工程初步建立的界面。到这里,只是建立了一个框架,还需要进一步添加对应的启动代码和文件等。

现在看一下之前建立的Project文件夹,就会发现多了两个文件夹和两个文件,分别为Template.uvoptx文件和Template.uvprojx文件、Listings文件夹和Objects文件夹。Template.uvprojx文件是工程文件,非常关键,不可以删除;而Listings文件夹和Objects文件夹是Keil MDK5软件自动生成的文件夹,分别用于存放在编译过程中产生的中间文件。按照表3.1所示的通用工程模板文件清单,将第2章介绍的STM32标准函数库中的相应文件复制到刚才建立的“通用工程模板”对应的文件夹目录下,主要文件位置可以参照第2章中的图2.4。

表3.1 通用工程模板文件清单

2. 添加文件

将STM32标准函数库中的文件复制到对应的文件夹后,初始的工程框架就基本完成了,接下来需要通过Keil MDK5将这些文件加入工程中。右击“Target1”,选择“Manage Project Items”选项(见图3.10)进入项目分组管理界面(见图3.11)。

图3.10 选择“Manage Project Items”选项

图3.11 项目分组管理界面

(1)在“Project Targets”一栏中,将“Target1”先修改为“Template”。同样,在设计和开发实际的嵌入式系统时,可以将“Template”改为相应的工程应用的英文名称。

(2)在“Groups”一栏中单击 按钮,删除Source Group1,然后单击 按钮新建四个Groups,分别命名为Project、CMSIS、STM32F10x_Driver和Guide。

(3)在Project、CMSIS、STM32F10x_Driver和Guide四个Groups中添加程序设计所需要的文件。

① 选中“Groups”一栏中的Project,然后单击右下角的“Add Files”按钮,定位到前面建立的“通用工程模板”目录下的Project文件夹中,选中其中的main.c、stm32f10x_it.c和system_stm32f10x.c文件,单击“Add”按钮添加到Project组所对应的Files栏中,之后单击“Close”按钮,完成Project组中所需要文件的添加。

② 选中“Groups”一栏中的CMSIS,然后单击右下角的“Add Files”按钮,定位到前面建立的“通用工程模板”目录下的CMSIS文件夹中,选中其中的core_cm3.c和startup_stm32f10x_hd.s文件,单击“Add”按钮添加到CMSIS组所对应的Files栏中,之后单击“Close”按钮。

注意

在默认添加时,文件类型为.c。在添加startup_stm32f10x_hd.s启动文件时,需要将文件类型改为“All files”,才能看到这个启动文件。

③ 用同样的方法为STM32F10x_Driver组添加“通用工程模板”目录下的STM32F10x_Driver\src文件夹中的所有驱动源文件。

说明

在实际的STM32嵌入式系统设计过程中,如果只用到了其中的某个外设,可以不添加没有用到的外设的库文件。例如,只用GPIO,可以只添加stm32f10x_gpio.c,而其他文件可以不用添加。全部添加进来是为了方便在后面的程序设计中使用,不用每次都添加。当然这样的坏处是工程太大,编译起来速度会较慢。在工程建立过程中,用户可以自行选择。

④ 采用同样的方法将“通用工程模板”目录下Guide文件夹中由开发者自己编写的Guide.txt文件添加到Guide中。

经过前面的操作,STM32嵌入式系统设计所需要的文件就添加到工程中了,单击“OK”按钮,回到工程主界面,如图3.12所示。现在就可以在主界面的Project中看到之前所添加的文件了。

图3.12 工程主界面

3. 配置魔术棒选项卡

在工程中添加完程序设计所需的文件之后,并不能直接编译,因为此时的工程还找不到它所对应的程序头文件,需要告诉Keil MDK软件在哪些路径下能够搜索到工程所需要的头文件,即头文件目录。任何一个工程都需要把其引用的所有头文件路径包含进来,这部分工作是在魔术棒选项卡的配置界面中进行的。

在工程主界面中,单击 按钮,进入魔术棒选项卡的配置界面,如图3.13所示。魔术棒选项卡的配置十分重要,它不仅限于为工程添加头文件路径,许多用户的串口用不了printf函数、编译有问题或下载有问题等,都是因为魔术棒选项卡的配置出了问题。魔术棒选项卡在编译、调试和下载等方面的配置方法会在后面的应用中详细讲解,现在先介绍如何通过魔术棒选项卡来为常见的工程添加需要的头文件目录和程序设计过程中常用的一些必要的配置方法。

图3.13 魔术棒选项卡的配置界面

(1)在魔术棒选项卡配置界面中的Target选项卡中,先将芯片和外部晶振设置为8.0MHz(STM32标准函数库默认采用的是8.0MHz的晶振,也可以根据实际应用要求对芯片和外部晶振进行修改),再勾选“Use MicroLIB”复选框,这样在设计串口驱动程序时,就可以使用printf函数了。

(2)Output选项卡界面如图3.14所示。在Output选项卡中,把输出文件夹定位到“通用工程模板”目录下的Project\Objects文件夹中,事实上这个文件夹是Keil MDK软件的默认选项,用于存放在编译过程中产生的调试信息、预览信息和封装库等文件。如果想要更改输出文件夹,则可以通过该方法把输出文件夹定位到其他文件夹中。如果想在编译过程中生成.hex文件(.hex文件为程序设计完成后下载到单片机上进行硬件调试的文件),则需要勾选“Create HEX File”复选框。

图3.14 Output选项卡界面

(3)在Listing选项卡中,把输出文件夹定位到“通用工程模板”目录下的Project\Listings文件夹中,事实上这个文件夹也是Keil MDK的默认选项,用于存放在编译过程中产生的C/汇编/链接的列表清单等文件。若要更改输出文件夹,则可以用该方法选择其他文件夹。

(4)在C/C++选项卡中,添加编译器编译时需要查找的头文件目录和处理宏,具体步骤如下。

① 添加头文件路径。C/C++选项卡添加头文件界面如图3.15所示。单击“Setup Compiler Include Paths”一栏最右边的按钮,会弹出一个添加路径的对话框,单击 按钮,将通用工程模板中包含头文件的三个目录添加进去。在以后的嵌入式系统设计中,也需要用同样的方法将编写的头文件目录添加进来。

图3.15 C/C++选项卡添加头文件界面

注意

Keil MDK只会在一级目录中查找头文件,因此头文件路径一定要定位到最后一级子目录,然后单击“OK”按钮即可。如果头文件路径添加有误,则编译时会报错“找不到头文件”。

② 添加宏。3.50版本的STM32标准函数库在配置和选择外设时是通过宏定义来选择的,所以需要配置一个全局的宏定义变量。继续定位到C/C++选项卡,填写“STM32F10X_HD, USE_STDPERIPH_DRIVER”到“Define”输入框中(见图3.16)。切记,两个标识符中间是逗号不是句号。STM32F10X_HD宏的作用是告诉STM32标准函数库,所使用的STM32芯片类型是大容量的,使STM32标准函数库能够根据选定的芯片型号进行配置。如果选用的STM32芯片类型是中容量的,那么需要将STM32F10X_HD修改为STM32F10X_MD;如果选用的STM32芯片类型是小容量的,则需要将STM32F10x_HD修改为STM32F10X_LD。USE_STDPERIPH_DRIVER宏的作用是让stm32f10x.h包含stm32fl0x_conf.h头文件。填写完毕后,单击“OK”按钮,退出魔术棒选项卡配置界面。

图3.16 C/C++选项卡添加宏

到这里,库函数通用工程模板基本上就创建完成了。在编译之前,还需要编写一段主程序。打开工程Project中的main.c文件,并将其中的代码复制到main.c中覆盖原有代码,这是一段实现单片机GPIOA端口的PA2和PA3引脚反复交替置位、复位的简单程序,代码细节将在后面的实例设计中进行讲解。

注意

覆盖原有代码后,代码最后一行的后面必须加上一个回车符,否则在编译过程中会有警告。

现在就可以单击 按钮进行工程编译了,工程编译结果如图3.17所示。从图3.17中可以看出,程序代码编译零错误零警告。

图3.17 工程编译结果

3.2.3 Keil MDK软件仿真

上一节介绍了如何利用STM32标准函数库在Keil MDK软件下创建STM32嵌入式系统工程模板,并讲解了如何进行编译,以验证程序代码的正确性。本节将进一步介绍如何利用Keil MDK软件对程序代码进行软件仿真。

Keil MDK的一个强大功能是能够对整个目标硬件进行仿真。在Keil MDK软件仿真中,可以查看很多与硬件相关的寄存器,观察这些寄存器,能够知道编写的代码是不是真正有效。通过软件仿真,可以在程序下载到STM32芯片之前发现很多可能出现的问题,这样最大的好处是能很方便地检查程序存在的缺陷,避免频繁下载程序来查找错误,从而延长了STM32的FLASH使用寿命(STM32的FLASH使用寿命≥1万次)。当然,软件仿真也不是万能的,有很多问题必须通过在线调试才可以发现。

先打开所创建的通用工程模板中的main.c文件,然后打开魔术棒选项卡,确认前面的设置没有发生变动之后,再单击Debug选项卡。Debug选项卡仿真调试设置如图3.18所示。选择“Use Simulator”单选按钮,使用软件仿真;勾选“Run to main()”复选框,跳过汇编代码,直接跳转到main函数开始仿真;设置下方的Dialog DLL,分别为DARMSTM.DLL和TARMSTM.DLL,Parameter设置为-pSTM32F103ZE,用于设置支持STM32F103ZE的软硬件仿真,这样就可以通过“Peripherals”选项选择对应外设的对话框来观察软硬件仿真结果。单击“OK”按钮完成设置。

图3.18 Debug选项卡仿真调试设置

接下来,返回工程主界面,单击“开始/停止仿真”按钮 ,开始仿真。

注意

如果在仿真之前没有编译过工程,需要先编译一遍,否则单击“开始/停止仿真”按钮后会显示缺少Template.axf文件。

Keil MDK软件仿真界面如图3.19所示,由图可以发现,仿真界面比工程主界面多了一个工具栏,这就是Keil MDK软件的Debug工具栏,这个工具栏在仿真时是非常重要的。

图3.19 Keil MDK软件仿真界面

下面简要介绍一下Debug工具栏相关按钮的功能。Debug工具栏及其按钮功能如图3.20所示。

图3.20 Debug工具栏及其按钮功能

(1)复位。该按钮的功能等同于STM32硬件上的复位按钮,单击一次该按钮相当于实现了一次硬复位,按下该按钮后,代码会重新从头开始执行。

(2)执行到断点处。该按钮用来快速执行到所设置的断点处。有时候并不需要查看每一步是如何执行的,而是快速执行到程序的某个地方来查看结果,这时就可以在这个地方设置一个断点,单击该按钮就可以快速将程序执行到这个地方。

(3)停止运行。该按钮在程序执行的时候会变为有效(成为红色),单击该按钮可以使程序停止,进入单步调试状态。

(4)执行进去。该按钮用来实现执行到某个函数中去的功能。在没有函数的情况下,该按钮等同于“执行过去”按钮。

(5)执行过去。在有函数的地方,单击该按钮就可以单步执行这个函数,而不会进入这个函数里执行。

(6)执行出去。当进入某个函数中进行单步调试时,如果已经得到了想要的结果或不需要再继续执行该函数的剩余部分,就可以单击该按钮,一步执行完函数余下的部分,并跳出函数回到函数被调用的位置。

(7)执行到光标处。该按钮可以使程序迅速地运行到光标位置,这和执行到断点处的按钮功能类似。但是二者也有区别,断点可以有多个,但是光标所处的位置只有一个。

(8)汇编窗口。单击该按钮可以查看汇编代码,这在分析程序时很有用。

(9)观察窗口。单击该按钮会弹出一个显示变量的窗口,在该窗口中可以查看各种变量值。

(10)内存查看窗口。单击该按钮会弹出一个内存查看窗口,输入要查看的内存地址,观察内存的变化情况。

(11)串口打印窗口。单击该按钮会弹出一个类似串口调试助手界面的窗口,该窗口显示从串口中打印出的内容。

(12)逻辑分析窗口:单击该按钮会弹出一个逻辑分析窗口,单击“SETUP”按钮新建一些I/O端口,这些I/O端口的电平变化情况能够以多种形式显示出来,比较直观。

Debug工具栏上的其他按钮较少使用,这里不再详述。以上介绍的按钮也不是每次都能用到,根据程序调试时需要查看的内容决定具体使用哪些按钮。

下面讲解具体的仿真过程。首先,把光标放到main.c的第15行最左边的灰色区域上,单击鼠标左键,可以看到在第15行的左边出现了一个红点,这表示在这个位置设置了一个断点(也可以通过单击鼠标右键弹出的菜单来设置断点),再次单击鼠标左键则取消断点。其次,单击“执行到断点处”按钮 ,将程序执行到该断点处(见图3.21),可以看到程序在仿真过程中,执行到所设置的断点处即停止。

图3.21 程序执行到断点处

这里先不着急往下执行,单击菜单栏的“Peripherals”选项,在该选项下可以查看很多STM32外设的动态执行情况,通过选择对应的选项即可查看相应外设的运行动态,如通过单击“General Purpose I/O\GPIOA”查看GPIOA端口的动态执行情况。单击“General Purpose I/O\GPIOA”之后会在调试仿真界面之外弹出一个专门查看GPIOA端口运行情况的界面,如图3.22所示。从图3.22可以看出,所有与GPIOA端口相关的寄存器全部都显示出来了,还显示了GPIOA端口中每个引脚的输入/输出状态。GPIO端口输入/输出状态的相关内容将在第5章进行详细讲解。

图3.22 GPIOA端口情况查看界面

继续单击“执行过去” 按钮,分别执行完PA2引脚置位程序和PA3引脚置位程序后,得到了如图3.23所示的GPIOA端口设置动态情况。通过图3.23与图3.22的对比,尤其是相应寄存器位变化的对比,能够知道端口置位程序究竟执行了哪些操作。通过查看GPIOA端口的各个寄存器的设置状态,可以判断所写的代码是否存在问题。只有寄存器的设置正确了,才有可能在硬件上正确地执行。这种方法也适用于其他外设设置的动态情况查看,这里不再详述。

图3.23 GPIOA端口设置动态情况

继续单击 按钮,一步步执行,就会在while循环中看到,PA2引脚和PA3引脚反复交替置位、复位的设置情况,这说明编写的程序代码可以达到预期的目的。

此外,还可以通过单击逻辑分析窗口中的“SETUP”按钮新建PA2引脚和PA3引脚,以直观地查看循环过程中两个端口引脚的电平变化情况。单击 按钮弹出逻辑分析窗口之后,再单击窗口中的“SETUP”按钮,进入逻辑分析设置界面,如图3.24所示。通过单击 按钮新建两个端口,分别命名为PORTA.2和PORTA.3。命名后,系统会自动将其名字更改为(PORTA&0x00000004)>>2和(PORTA&0x00000008)>>3形式,同时设置界面下方的参数也会随之改变,两个端口的“Display Type”选项均改为Bit。单击“Close”按钮,设置完毕。

图3.24 逻辑分析设置界面

回到调试仿真界面,把之前设置的断点都去掉,并单击“复位” 按钮,回到程序的起始仿真位置。单击“执行到断点处” 按钮,进行仿真调试。由于没有设置任何断点,所以在这次调试中,程序会一直执行下去,这时候从逻辑分析窗口中会输出循环过程中PA2和PA3两个引脚的电平变化情况,如图3.25所示。通过调节窗口中Zoom的In(放大)或Out(缩小)可以调整窗口中视图范围的大小,由此获得合适的显示图像。PA2和PA3两个引脚的电平波形变化情况也验证了所编写的程序代码能够获得预期的结果。

图3.25 逻辑分析窗口显示I/O端口电平

Keil MDK软件仿真类型还有很多,如快速指令集仿真、外部信号和I/O端口仿真、中断过程仿真和串口通信仿真等,几乎可以覆盖整个目标硬件的调试过程,其主要的设置过程与所讲解的实践例程类似,这里不再详述,读者可以根据自己的应用实例参照例程进行仿真调试。在Keil MDK软件仿真调试中验证了代码的正确性之后,就可以将程序代码下载到硬件上进行实际的应用检验了。 vCzV3fx65wK8Ojd7SYIdUMQDcF7WoW2hMOL2fkapyE9E61RCuhrjQty4aDcjm4GO

点击中间区域
呼出菜单
上一章
目录
下一章
×