MDK Keil5实践篇:新建STM32工程文件详解

一、先下载芯片支持包

第一步:当然是先百度搜索我们的keil官网(网址):https://www.keil.com/

 第二步:点击首页的Project,会跳转如界面,再次点击Arm Cortex-M,如图所示:

  第三步:点击后会再次跳转,这时候我们再次点击Public Software Packs,如图所示:

第四步:点击后会再次跳转,我们只要仔细寻找就可以找到STM32F1,点击下载,下载起来有点点慢,如下图所示:

第五步:下载完成后双击打开会自动检索到安装的keil的芯片包文件夹,点击Next,开始安装,如图所示:

二、准备工作,将我们在理论篇创建的文件夹里面放入相应的文件内容

(1)在CMSIS文件夹中存放的是我们内核控制相关的文件,可以在之前我们下载好的ST标准库找到,如下图所示将文件复制粘贴进文件夹中:

名称

文件所在标准库中的位置

core_cm3.c\h

STM32F10x_StdPeriph_Lib_V3.6.0\Libraries\CMSIS\CM3\CoreSupport

stm32f10x.h、system_stm32f10x.c\h

STM32F10x_StdPeriph_Lib_V3.6.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x

stm32f10x_conf.h 、stm32f10_it.c\h

\STM32F10x_StdPeriph_Lib_V3.6.0\Project\STM32F10x_StdPeriph_Examples\ADC\3ADCs_DMA

(2)STM32F10x_FWLib文件夹是存放ST标准库文件的地方,里面有ST编写的提供给用户调用的规范化代码,例如对引脚口、系统时钟、DMA等等的操作,如下所示:

inc、src

STM32F10x_StdPeriph_Lib_V3.6.0\Libraries\STM32F10x_StdPeriph_Driver

(3)startup文件夹存放芯片的启动文件,怎么选择对应的芯片的启动文件请参考上一篇理论篇,如图所示:

名称

文件所在标准库中的位置

startup_stm32f10x_hd.s

\STM32F10x_StdPeriph_Lib_V3.6.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\arm

(4) 剩余的user放置主函数文件、BSP、Application文件里创建的内容有自己创建自己定义,然后Project我们等下创建的工程就是放在这里面

(5)Firmware等下编译完程序输出文件放置于此

三、MDK创建工程

第一步:打开keil5软件,依次点击Project—New uVision Project,如图所示:

第二步:继第一步后会弹出界面选择保存位置,这里我们将整个工程存放在Project文件夹中工程取名为template,注意工程的后缀名,点击保存,如图所示:

 第三步:继第二步后会弹出如下框,是让我们选择芯片,我们用的是STM32F103VE,故依次选择STMicroelectronics—STM32F103—STM32F103VE—OK,这是芯片支持包提供的芯片种类,让编译器知道你用的是什么芯片,如果没有安装STM32F1的芯片支持包是没有芯片可以选择的。

  第四步:继第三步后会弹出如下界面框Manage Run-Time Environment,可以用来配置 MDK 驱动和ST外设文件等,比如内核文件与启动文件,大家也可以先搜一下他的功能,这里我们先点击Cancel,如下图所示:由于我们之前已经将内科核文件和启动文件准备好了,所以这里我们可以选择跳过,

如果你没准备还也可以点击添加内核文件与启动文件,然后点击OK完成后,可以在我们的Project文件夹看到keil创建的文件,以后我们就从Project—template进入我们的工程文件。

完成后,可以在我们的Project文件夹看到keil创建的文件,以后我们就从Project—template进入我们的工程文件。

 第五步:第四步后我们的工程就初步建立起来了,可以看到左侧的project项目区没有内容只有默认的文件(Target),接着点击如下按钮,开始在工程里面新建目录,将各个代码分类存放,如图所示:

点击左边区域的Target可以修改名称,这里我们修改为template,同理接着点击中间区域的Source Group1修改名称,点击第三个箭头处的新建按钮可以新建文件,依次建立如下文件,如下图所示:

序号①处是新建文件、②处是删除文件、③是上移选中的文件、④是下移选中的文件,创建完如下图所示的文件后点击OK完成创建,可以在左侧项目目录框看到我们新建好的目录结构,如下图所示:

  第六步:接下来就要将我们上一章复制粘贴的文件与工程关联起来放入工程中,首先是把源文件(.c文件)引入工程,还是点击第五步的小按钮,如下图所示:

①先选中CMSIS,然后在②点击,添加文件,弹出界面,我们需要选中CMSIS中的源文件把他们添加进来,同理选中FWLB,点击Add Files…将FWLIB-src下的文件添加进来,添加startup文件时请注意,需要将寻找的类型换成所有文件,因为启动文件是.S结尾的,最后将新建的main.c也添加进user中,如下图所示:

以此类推,把该添加的文件添加完成

  最后点击下方的OK按钮,完成添加,完成后可以在左侧的项目框中看到我们添加的文件(FWLIB没展开,有点多),如图所示:

 第七步:完成了源文件的添加,接着就是头文件的添加,点击魔术棒按钮,如下图所示:

点击后选中C/C++选项卡,在点击Include Paths后面的…按钮打开,如图所示:

点击①处新建后会出来②处空白的框在点击②处的…按钮添加路径,注意头文件的路径需要选择到头文件的根目录,我们把CMSIS、FWLIB-INC、main.h这些文件的路径包含进来。如下图所示:

第八步:添加完头文件和源文件后,基本完成的差不多了,只是现在还不能进行编译,我们还没有编写程序主函数main()函数,在左侧的Project项目框中,找到user,单击点开,双击打开我们新建并添加的main.c文件,编写main函数,如图所示:

#include "main.h"
int  main(void)
{
    while(1)
    {
      ;
    }
}

main.h文件:

#ifndef __MAIN_H
#define __MAIN_H


#include "stm32f10x.h"


#endif

 第九步:编写好这两个文件后,这个时候去点编译的按钮,可以看到,如图所示:

 序号①是编译当前文件,就是我们的main.c、序号②是快速编译、序号③是全编译,第一次打开工程时我们需要点击③全编译,后续修改工程我们可以按序号②缩短编译时间

 一大堆问题,先别急,在按下序号②我们先看看现象,如下:

 当我们只编译main.c就可以发现不会有错误,这是正确的,因为main.c没啥内容怎么会报错,如下:

当我们全局编译的时候会发送那么多错误和警告,这是为啥呢?原因是我们没有将必须要包含的预编译字让编译器包含。

  第十步:点击魔术棒按钮,选择“C/C++”选项卡中所示红框中添加STM32F10X_HD,USE_STDPERIPH_DRIVER(中间用英文的“,”隔开)这样才能使编顺利通过,如图所示:

define这两个字有什么用呢,我们一个一个看,首先是USE_STDPERIPH_DRIVER,字面理解使用标准外设驱动,我们在使用STM32时不可避免的会用到外设,像最常用的是引脚,我们需要把头文件包含进来(#include “stm32f10x_gpio.h”),但是在写代码的时候我们往往不会这么操作,我们只会#include “stm32f10x.h”,就可以使用引脚的一些操作,这是为啥呢?原因很简单,我们在stm32f10x.h文件中查找USE_STDPERIPH_DRIVER,可以发现下面的代码:

如果我们定义了USE_STDPERIPH_DRIVER,就会把stm32f10x_conf.h文件包含进来,我们再看看stm32f10x_conf.h文件里面是什么,上一篇博客也提到过这份文件的作用,如图所示stm32f10x_conf.h文件把我们用的所有的标准外设头文件都包含进来了,所以我们只需要调用#include "stm32f10x.h"文件就能实现操作外设的作用,同时需要在C/C++选项卡定义USE_STDPERIPH_DRIVER:

再来看一下STM32F10X_HD,这像不像我们启动文件的命名,我们打开另一份文件systeam_stm32f10x.c和stm32f10x.h,查找STM32F10X_HD,会找到一些与芯片时钟频率有关的定义,以及一些中断号的定义与中断服务函数有关,如下两图所示:

 所以综上这两个参数的定义是必须要设置的。

 第十一步:最后我们再次全编译会发现没有错误没有警告,我们的工程模板顺利的创建完成了,如图所示:

第一步:打开keil5软件,依次点击Project—New uVision Project,如图所示:

 第二步:继第一步后会弹出界面选择保存位置,这里我们将整个工程存放在Project文件夹中工程取名为template,注意工程的后缀名,点击保存,如图所示:

 第三步:继第二步后会弹出如下框,是让我们选择芯片,我们用的是STM32F103VE,故依次选择STMicroelectronics—STM32F103—STM32F103VE—OK,这是芯片支持包提供的芯片种类,让编译器知道你用的是什么芯片

第四步:继第三步后会弹出如下界面框Manage Run-Time Environment,可以用来配置 MDK 驱动和ST外设文件等,由于我们之前那已经手动移植的启动和内核文件;比如华大单片机官方那提供的驱动库文件没有内核文件,那我们就需要在这里将CORE内核勾选,

但在这里我们STM32的官方驱动库已经提供,且我们已经幅值到我们的文件夹了,所以这里我们点击Cancel就可以了,如下图所示:

  完成后,可以在我们的Project文件夹看到keil创建的文件,以后我们就从Project—template进入我们的工程文件。

 第五步:第四步后我们的工程就初步建立起来了,可以看到左侧的project项目区没有内容只有默认的文件(Target),接着点击如下按钮,开始在工程里面新建目录,将各个代码分类存放,如图所示:

(1)CMISIS

(2)启动文件

注:这里只选择对应型号的启动文件,不要把文件的所有启动文件全都包含进来,如果全部包含进来会出错

那如果多选了会怎么样呢?如下图,选择了多个启动文件,那编译器会产生什么错误呢?

Keil提示错误信息error: L6235E: More than one section matches selector – cannot all be FIRST/LAST.

所以则合格错误表示,你添加多个启动文件, 所以我们一定要选择符合我们使用芯片类型的的启动文件就好

(3)库文件添加

  第六步:完成了源文件的添加,接着就是头文件的添加,点击魔术棒按钮,如下图所示:

  点击后选中C/C++选项卡,在点击Include Paths后面的…按钮打开,如图所示:

将下面这些头文件添加进来

  第七步:添加完头文件和源文件后,基本完成的差不多了,只是现在还不能进行编译,我们还没有编写程序主函数main()函数,在左侧的Project项目框中,找到user,单击点开,双击打开我们新建并添加的main.c文件,编写main函数,如图所示:

#include "main.h"
#include "bsp_Stm32fx.h"
int main(void)
{
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//抢占优先级分组
    BSP_SysTickInit();
    BSP_UartInit(115200);
    BSP_GpioInit();
    while(1)
    {
        BSP_SetLed0(2);//LED0闪烁
        delay_ms(300);    
        printf("hello word\n");
    }
}

main.h文件:

#ifndef __MAIN_H
#define __MAIN_H


#include "stm32f10x.h"


#endif

 第八步:编写好这两个文件后,这个时候去点编译的按钮,可以看到,如图所示:

 左到右 1号 2号 3号 ;序号①是编译当前文件,就是我们的main.c、序号②是快速编译、序号③是全编译,第一次打开工程时我们需要点击③全编译,后续修改工程我们可以按序号②缩短编译时间

然后我们编译下:

一堆错误,,这是为啥呢?原因是我们没有将必须要包含的预编译字让编译器包含。

STM32F10X_HD,USE_STDPERIPH_DRIVER

重新编译下

没问题了,那为啥加这个就好了

 define这两个字有什么用呢,我们一个一个看,首先是USE_STDPERIPH_DRIVER,字面理解使用标准外设驱动,我们在使用STM32时不可避免的会用到外设,像最常用的是引脚,我们需要把头文件包含进来(#include “stm32f10x_gpio.h”),但是在写代码的时候我们往往不会这么操作,我们只会#include “stm32f10x.h”,就可以使用引脚的一些操作,这是为啥呢?原因很简单,我们在stm32f10x.h文件中查找USE_STDPERIPH_DRIVER,可以发现下面的代码:

如果我们定义了USE_STDPERIPH_DRIVER,就会把stm32f10x_conf.h文件包含进来,我们再看看stm32f10x_conf.h文件里面是什么,上一篇博客也提到过这份文件的作用,如图所示stm32f10x_conf.h文件把我们用的所有的标准外设头文件都包含进来了,所以我们只需要调用#include "stm32f10x.h"文件就能实现操作外设的作用,同时需要在C/C++选项卡定义USE_STDPERIPH_DRIVER:

再来看一下STM32F10X_HD,这像不像我们启动文件的命名,我们打开另一份文件systeam_stm32f10x.c和stm32f10x.h,查找STM32F10X_HD,会找到一些与芯片时钟频率有关的定义,以及一些中断号的定义与中断服务函数有关,如下两图所示:

  所以综上这两个参数的定义是必须要设置的。

最后我们需要将生成的hex文件下载到开发板验证,下载之前我们先添加个好用的东西

上一篇文章讲:Firmware文件夹:专门用来存放生产的Hex、bin等程序输出烧录文件

那么如何配置:

(1)创建一个文本L:编写内容如下

(2)将其另存为.bat后缀,放置于工程中

(3)点击魔术棒将刚才的创建的"firmware.bat"文件包含进来

然后选择重新编译下

在看下文件Firmware里面只有一个hex很整洁!

到这里我们裸机工程创建结束了,我们最后看一下效果。

输出正常!

附录:

创建好的裸机工程:

链接:https://pan.baidu.com/s/1aaHOZryOd6nO1KX94bUncg

提取码:8fd4

本文参考博主:https://blog.csdn.net/weixin_45857160/article/details/121062231?spm=1001.2014.3001.5501

物联沃分享整理
物联沃-IOTWORD物联网 » MDK Keil5实践篇:新建STM32工程文件详解

发表评论