一:创建工程
1. 新建工程
固件库包获取以后下面就正式进入工程模板的创建, 我们在电脑任意位置创建一个文件夹, 命名为“库函数模板创建” , 然后在其下面新建 3 个文件夹, 如下: (文件夹命名可任意, 我们这里根据文件类型命名)
Obj 文件夹: 用于存放编译产生的 c/汇编/链接的列表清单、 调试信息、 hex文件、 预览信息、 封装库等文件。
User 文 件 夹: 用 于 存 放用 户 编 写的 main.c 、 stm32f10x.h 头 文 件、stm32f10x_conf.h配置文件、stm32f10x_it.c和stm32f10x_it.h中断函数文件。
Libraries 文件夹: 用于存放 CMSIS 标准和 STM32 外设驱动文件。
这和前面介绍寄存器模板创建时多了一个 Libraries 文件夹, 在此文件夹下新建 2 个文件夹命名为 CMSIS 和 STM32F10x_StdPeriph_Driver, 其实这些文件夹命名都是直接复制固件库相应的文件夹名, 如下:
CMSIS 文 件 夹 用 于 存 放 一 些 CMSIS 标 准 文 件 和 启 动 文 件 ;STM32F10x_StdPeriph_Driver 文件夹用于存放 STM32 外设驱动文件。
CMSIS 文件夹内文件如下:
我们从这里面抽取工程模板 CMSIS 所需的几个文件出来, 如下: (这些文件在前面介绍固件库已做讲解, 这里就不再重复它们的路径是哪里)
STM32F10x_StdPeriph_Driver 文件夹内文件如下:
其实这个文件夹都是直接从固件库“STM32 最新固件库v3.5\Libraries\STM32F10x_StdPeriph_Driver” 目录下复制, 无需修改。 里面存放的就是 STM32 标准外设驱动文件, src 目录存放的是外设驱动的源文件, inc目录存放的是对应的头文件。 如下:
User 文件夹内文件如下:
里面的这些文件也是从固件库内复制而来。
到这里就已经将创建库函数模板所需的固件库文件复制过来了, 下一步打开KEIL5 软件, 新建一个工程, 工程名根据喜好命名, 但是要注意使用英文, 如果使用中文名可能会出现一些奇怪的错误, 这里我们命名为 Template, 直接保存在最开始创建的 “库函数模板创建” 文件夹下。
2. 给工程添加文件
在新建的工程中添加文件, 文件从“库函数模板创建” 文件夹下获取, 双击Group 文件夹就会出现添加文件的路径, 然后选择文件即可。 如果我们将“库函数模板创建” 目录下的文件都添加到 Group 这个默认组中, 显然是非常乱的, 对于我们查找工程文件和工程维护极其不方便。 因此这里我们需要根据文件类型来构建新的工程组。 操作步骤如下:
为了工程目录更加清晰及方便文件查找, 新建 User、 Startup、StdPeriph_Driver 和 CMSIS 工程组。
User 组用于存放 User 文件夹下的源文件, Startup 组用于存放 STM32 的启动文件, StdPeriph_Driver 组用于存放 STM32 外设的驱动源文件、 CMSIS 组用于存放 CMSIS 标准文件, 比如系统总线时钟等初始化源文件。
创建好的工程目录组如下所示:
接下来就需要将对应的一些文件添加到工程目录组中, 这样才能进行程序的开发。 添加工程文件步骤如下:
同样是点击图标 1, 弹出界面后, 在图标 2 中选择好要添加的工程组, 点击图标 3 添加文件, 会弹出添加文件对话框, 在图标 4 中选择对应文件夹内的文件(细心的朋友会发现前面我们只创建了 User、 Obj、 Libraries 文件夹, 却多出了另外 2 个文件夹 Objects 和 Listings, 这是因为使用 KEIL5 创建工程时默认会产生这两个文件夹用于存放程序编译后的列表文件及 HEX 等文件, 这里我们可以将这两个文件夹剪切到我们创建的 OBJ 文件夹内, 也可以删除它) , 注意图标5 中文件类型的选择, 默认是.c 文件, 在 Startup 工程组中我们需要添加 STM32的启动文件, 而启动文件类型是.s, 所以要将文件类型选择为“All files(*.*)”才能看到, 点击图标 6 即可添加, 将所有文件添加至对应工程组后, 如下所示:
在 StdPeriph_Driver 工程组中我们只添加了 2 个源文件, 对于 STM32 程序开发, 通常这 2 个文件都是需要的, 其他的外设源文件根据是否使用外设而添加,如果大家把所有的源文件都加进来也是没有问题的, 只不过工程在编译的时候会比较慢, 所以我们的原则是使用到哪个外设就添加哪个外设的源文件。
3. 配置魔术棒
这一步的配置工作非常重要, 很多人编写程序编译后发现找不到 HEX 文件,还有的人后面做 printf 实验时打印不出信息, 这些问题都是在这个地方没有配置好导致的。
(1) Target 中选中微库“Use MicroLib” , 主要是为了后面 printf 重定向输出使用, 不然会出现各种奇怪的现象。 其他的设置保持默认即可, 配置如下:
(2) Output 选项卡中把输出文件夹定位到我们工程目录下的 Obj 文件夹,如果想在编译的过程中生成 hex 文件, 那么 Create HEX File 选项勾上。 配置如下:
(3) Listing 选项卡中把输出文件夹也定位到我们工程目录下的 Obj 文件夹。 其他设置默认, 配置如下:
(4) C/C++选项卡配置
因为创建的是库函数模板, 所以需要在对处理器类型和库进行宏定义, 在Define 这一栏中复制这两个宏: USE_STDPERIPH_DRIVER,STM32F10X_HD注意它们之间有一个英文符的逗号。 通过这两个宏就可以对 STM32F10x 系列芯片进行库开发, 因为在库源码内支持很多 F1 系列芯片, 通过这个宏就可以选择到底是用种芯片的库驱动。 同理 USE_STDPERIPH_DRIVER 这个宏也是类似的原理。 这里我们就不深究, 大家只要复制到 Define 栏中即可。
设置好了宏, 还需要将我们前面添加到工程组中的文件路径包括进来, 同样还是在 C/C++选项卡中, 具体步骤如下:
首先点击图标 1, 弹出一个添加头文件路径的对话框, 然后点击图标 2, 新建一个空路径列表, 再点击图标 3, 会弹出浏览文件夹对话框, 在图标 4 中选择对应的头文件路径即可, 这个头文件路径就是你工程组中那些文件的头文件路径, 选择好后点击图标 5 确定, 然后回到图标 2 重新建立一个空路径列表, 再次添加路径, 直到所有头文件路径添加完成点击图标 6 即可。
最后添加好的头文件路径如下:
我们直接从 ST 公司提供的模板上复制过来的, 所以我们把 main.c文件内的所有内容删除, 写上一个最简单的框架程序, 我们输入如下内容:
#include "stm32f10x.h"
int main()
{
while(1)
{
}
}
然后我们编译一下工程, 编译后结果 0 错误 0 警告, 表明我们创建的库函数模板完全正确。 如下:
图标 1 中第一个编译是对单个文件编译, 第二个编译是对工程中修改过的文件进行编译, 第三个编译是对工程中所有文件进行编译。 通常我们使用的是中间那个编译, 效率比较高。到这一步我们的库函数模板才算真正创建好。