MDK5软件入门
这里主要记录一下MDK5软件的介绍及使用。
MDK5简介
MDK 源自德国的 KEIL 公司,是 RealView MDK 的简称。在全球 MDK 被超过 10 万的嵌入式开发工程师使用。目前最新版本为:MDK5.14,该版本使用 uVision5 IDE 集成开发环境,是目前针对 ARM 处理器,尤其是 Cortex M 内核处理器的最佳开发工具
新建MDK5工程
在完成安装MDK5软件后,打开软件,点击Project->New uVision Project,如图所示:
弹出新建工程界面:
这里选择工程创建的目录位置,编辑工程名,(例如:test)新建文件夹USER,保存在这里。之后会弹出选择器件的对话框,根据STM32型号选择对应的型号就可以了,这里我根据我的STM32F103ZET6型号选择。
特别主要,一定要安装对于的器件pack才会显示这些内容,如果没得选择,先关闭MDK,下载对应的pack安装后再打开创建工程
点击OK后会弹出运行环境选择对话框。
这个是MDK5新增的一个功能,在这里我们可以添加自己需要的组件,从而方便构建开发环境,不需要的话直接点击Cancel即可。
工程初步建立如下:
这里就完成新建一个MDK5的工程了。
新建STM32开发环境
通过上面的操作已经新建了一个框架了。但还不够,还需要添加启动代码,以及.c文件等等。
启动代码是一段和硬件相关的汇编代码,必不可少,主要作用如下:
- 堆栈的初始化;
- 初始化程序计数器(PC);
- 设置向量表异常事件的入口地址;
- 调用main函数。
这里意法半导体(ST)公司提供了3个启动文件给我们,分别对应不同容量的STM32芯片。我们目前使用的基本都是大容量产品,所以选择startup_stm32f10x_hd.s作为我们的启动文件。
我们找到Target1->Source Group1->双击->设置打开文件类型为Asm Sourcefile->选择startup_stm32f10x_hd.s->点击Add,如图所示:
现在就可以开始编写自己的代码了,但是现在的目录结构还是有点混乱,也就是工程下乱七八糟什么都有。
我们需要进行整理一下。
接下来,我们在 Project 工程目录下面,
- 新建 3 个文件夹 CORE, OBJ 以及STM32F10x_FWLib。CORE 用来存放核心文件和启动文件,OBJ 是用来存放编译过程文件以及 hex 文件STM32F10x_FWLib 文件夹顾名思义用来存放 ST 官方提供的库函数源码文件。已有的 USER 目录除了用来放工程文件外,还用来存放主函数文件 main.c,以及其他包括 system_stm32f10x.c 等等。
- 下面我们要将官方的固件库包里的源码文件复制到我们的工程目录文件夹下面。打开官方固件库包,定位到我们之前准备好的固件库包的目录下面,将目录下面的 src,inc 文件夹 copy 到我们刚才建立的 STM32F10x_FWLib 文件夹下面。src 存放的是固件库的.c 文件,inc 存放的是对应的.h 文件。
- 下面我们要将固件库包里面相关的启动文件复制到我们的工程目录 CORE 之下。打开官方固件库包,将文件 core_cm3.c和 文 件 core_cm3.h 复 制 到 CORE 下 面 去 。
然 后将 startup_stm32f10x_hd.s 文件复制到 CORE 下面。
- 将三个文件 stm32f10x.h,system_stm32f10x.c,system_stm32f10x.h,复制到我们的 Project目录之下。然后将下面的 4 个文件main.c,stm32f10x_conf.h,stm32f10x_it.c,stm32f10x_it.h 复制到 Project 目录下面。
- 前面 8 个步骤,我们将需要的固件库相关文件复制到了我们的工程目录下面,下面我们将这些文件加入我们的工程中去。右键点击 Target1,选择 Manage Components。
- 下面我们往 Group 里面添加我们需要的文件。我们按照步骤 10 的方法, 右键点击点击 Led,选择选择 Manage Components.然后选择需要添加文件的 Group,这里第一步我们选 择 FWLIB , 然 后 点 击 右 边 的 Add Files, 定 位 到 我 们 刚 才 建 立 的 目 录
STM32F10x_FWLib/src 下面,将里面所有的文件选中(Ctrl+A),然后点击 Add,然后 Close.可以看到 Files 列表下面包含我们添加的文件。这里需要说明一下,对于我们写代码,如果我们只用到了其中的某个外设,我们就可以不用添加没有用到的外设的库文件。这里我们全部添加进来是为了后面方便,不用每次添加,当然这样的坏处是工程太大,编译起来速度慢,用户可以自行选择。
- 用同样的方法,将 Groups 定位到 CORE 和 USER 下面,添加需要的文件。这里我们的 CORE 下面需要添加的文件为 core_cm3.c,startup_stm32f10x_hd.s ( 注意,默认添加的时候文件类型为.c, 也就是添加 startup_stm32f10x_hd.s 启动文件的时候,你需要选择文件类型为 为 All files 才能看得到这个文件),USER 目录下面需要添加的文件为 main.c,stm32f10x_it.c,system_stm32f10x.c.
这样我们需要添加的文件已经添加到我们的工程中了,最后点击 OK,回到工程主界面。
最后效果图如下:
- 接下来我们要编译工程,在编译之前我们首先要选择编译中间文件编译后存放目录。方法是点击魔术棒,然后选择“Output”选项下面的“Select folder for objects…”,然后选择目录为我们上面新建的 OBJ 目录。这里大家注意,如果我们不设置 Output 路径,那么默认的编译中间文件存放目录就是 MDK 自动生成的 Objects 目录和 Listings 目录。
- 下面我们要告诉 MDK,在哪些路径之下搜索需要的头文件,也就是头文件目录。 这里大家要注意,对于任何一个工程,我们都需要把工程中引用到的所有头文件的路径都包含到进来。回到工程主菜单,点击魔术棒 ,出来一个菜单,然后点击 c/c++选项.然后点击
Include Paths 右边的按钮。弹出一个添加 path 的对话框,然后我们将图上面的 3 个目录添加进去。记住,keil 只会在一级目录查找,所以如果你的目录下面还有子目录,记得 path一定要定位到最后一级子目录。然后点击 OK.
- 接下来,我们再来编译工程,可以看到又报了很多同样的错误。为什么呢?这是因为 3.5 版本的库函数在配置和选择外设的时候通过宏定义来选择的,所以我们需要配置一个全局的宏定义变量。按照步骤 16,定位到 c/c++界面,然后填写
“STM32F10X_HD,USE_STDPERIPH_DRIVER”到 Define 输入框里面。这里解释一下,如果你用的是中容量那么 STM32F10X_HD 修改为 STM32F10X_MD,小容量修改为 STM32F10X_LD. 然后点击 OK。
- 这样一个工程模版建立完毕。下面还需要配置,让编译之后能够生成 hex 文件。同样点击魔术棒,进入配置菜单,选择 Output。然后勾上下三个选项。 其中 Create HEX file 是编译生成 hex 文件,Browser Information 是可以查看变量和函数定义。
建好工程模板,以后再写程序便可直接复制粘贴使用。