打印
[STM32F7]

【ST资料大分享】STM32F407 之 基于 STM32F40x 固件库的 MDK5 工程

[复制链接]
1192|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
丶tiantian|  楼主 | 2016-7-29 16:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

  • <span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">1、MDK 安装说明:安装路径不要包含中文,否则,就会出现一些奇怪的错误!</span>  



2、建立工程

1)、由于以前用惯了原子的模板,这次也用原子的模板啦!新建一个文件夹,命名为Template,然后在其下,建立五个子文件夹:CORE ,FWLIB,OBJ,SYSTEM,USER。名字可以随便取,怎样方便识别就怎样取,如下:


2)、打开 Keil,点击 Keil 的菜单: Project –>New Uvision Project ,然后将目录定位到刚才建立的文件夹 Template 之下的 USER 子目录,同时,工程取名为 MY_Template

之后点击保存,我们的工程文件就都保存到 USER 文件夹下面。 操作过程如下图:



新建工程



工程保存路径以及命名


3)、接下来会出现一个选择Device的界面,由于我买的是STM32F407ZGT6 核心板,故在STMicroelectronics 下面的 STM32F407ZG。(一定要安装对应的器件 pack 才会显示这些内容)




点击 OK, MDK 会弹出 Manage Run-Time Environment 对话框




这是 MDK5 新增的一个功能,在这个界面,我们可以添加自己需要的组件,从而方便构建开发环境,没用到,我们直接点击 Cancel,即可得如下界面:




4)、现在我们可以看看USER 目录下包含了 2 个文件,如下图:




5)、工程建立好之后,我们就要将官方的固件库包里的源码文件复制到我们工程目录对应的文件夹下面。

打开官方固件库包,定位到我们之前准备好的固件库包的目录:\STM32F4xx_DSP_StdPeriph_Lib_V1.4.0\Libraries\STM32F4xx_StdPeriph_Driver 下面,将目录下面的 src,inc

文件夹 copy 到我们刚才建立的 FWLib 文件夹下面。src 存放的是固件库的.c 文件, inc 存放的是对应的.h 文件,您不妨打开这两个文件目录过目一下里面的文件,每个外设对

应一个.c 文件和一个.h 头文件。 如下图


6)、接下来我们将固件库包里面相关的启动文件复制到我们的工程目录CORE下。

打开官方固件库包,定位到目录 \STM32F4xx_DSP_StdPeriph_Lib_V1.4.0\Libraries\CMSIS\Device\ST\STM32F4xx\Source\Templates\arm 下面,将文件

startup_stm32f40_41xxx.s 复制到 CORE 目录下面。然后定位到目录\STM32F4xx_DSP_StdPeriph_Lib_V1.4.0\Libraries\CMSIS\Includ,将里面的头文件 core_cm4.h

和 core_cm4_simd.h 同样复制到 CORE 目录下面。现在看看我们的 CORE 文件夹下面的文件,如下图 :




7)、接下来我们要复制工程模板需要的一些其他头文件和源文件到我们的工程。

首先定位到目录:STM32F4xx_DSP_StdPeriph_Lib_V1.4.0\Libraries\CMSIS\Device\ST\STM32F4xx\Include 将里面的 2 个头文件 stm32f4xx.h 和 system_stm32f4xx.h 复制到

USER 目录之下。 这两个头文件是STM32F4 工程非常关键的两个头文件。后面我们讲解相关知识的时候会给大家详细讲解。然后进入目录

\STM32F4xx_DSP_StdPeriph_Lib_V1.4.0\Project\STM32F4xx_StdPeriph_Templates ,将 目 录 下 面 的 5 个 文 件 main.c , stm32f4xx_conf.h , stm32f4xx_it.c ,

stm32f4xx_it.h ,system_stm32f4xx.c 复制到 USER 目录下面。 请按下图 选中 5 个文件然后复制:




将这 2+5 个文件复制到USER 目录中之后,USER目录文件如下图:




8)、前面 7 个步骤,我们将需要的固件库相关文件复制到了我们的工程目录下面,下面我们将这些文件加入我们的工程中去。右键点击 Target1,选择 Manage

Project Items...或者直接点击快捷按钮,如下图,




9)、Project Targets 一栏,我们将 Target 名字修改为 Template,然后在 Groups 一栏删掉一个 Source Group1,建立三个 Groups: USER,CORE,FWLIB。然后点击 OK,可

以看到我们的 Target名字以及 Groups 情况如下图




10)、下面我们往 Group 里面添加我们需要的文件。我们按照步骤 9 的方法, 右键点击点击Tempate,选择选择 Manage Components.然后选择需要添加文件的 Group,这

里第一步我们选择 FWLIB,然后点击右边的 Add Files,定位到我们刚才建立的目录\FWLIB\src 下面,将里面所有的文件选中(Ctrl+A),然后点击 Add,然后 Close.可以看到Files

列表下面包含我们添加的文件,如下图,这里需要说明一下,对于我们写代码,如果我们只用到了其中的某个外设,我们就可以不用添加没有用到的外设的库文件。

例如我只用 GPIO,我可以只用添加 stm32f4xx_gpio.c 而其他的可以不用添加。这里我们全部添加进来是为了后面方便,不用每次添加,当然这样的坏处是工程太

大,编译起来速度慢,用户可以自行选择。(添加文件也可以直接在FWLIB 图标上单击右键选择 Add Exsiting....选择要添加的文件即可)





这里有个文件 stm32f4xx_fmc.c 比较特殊。这个文件是 STM32F42 和 STM32F43 系列才用到,所以我们这里要把它删掉( 注意是 stm32f4xx_fmc.c 要删掉,不要删掉

stm32f4xx_fsmc.c)。


11)、用同样的方法,将 Groups 定位到 CORE 和 USER 下面,添加需要的文件。这里我们的 CORE 下面需要添加的文件为 startup_stm32f40_41xxx.s(注意,默认添加的时

候文件类型为.c,也就是添加 startup_stm32f40_41xxx.s 启动文件的时候,你需要选择文件类型为 All files才能看得到这个文件 ), USER 目录下面需要添加的文件为 main.c,

stm32f4xx_it.c,system_stm32f4xx.c。 这样我们需要添加的文件已经添加到我们的工程中去了,最后点击 OK,回到工程主界面。



12)、接下来我们就需要在MDK 里面设置头文件存放路径。也就是告诉 MDK 到那些目录下面去寻找包含了的头文件。这一步骤非常重要。 如果没有设置头文件路径,那么工

程会出现报错头文件路径找不到。 具体操作如下图, 5 步之后添加相应的头文件路径。




这里我们需要添加的头文件路径包括: \CORE, \USER\以及\FWLIB\inc。固件库存放的头文件子目录是\FWLIB\inc,不是 FWLIB\src。


13)、接下来对于 STM32F40 系列的工程,还需要添加一个全局宏定义标识符。添加方法是点击魔术棒之后,进入 C/C++选项卡,然后在 Define 输入框连输入:

STM32F40_41xxx,USE_STDPERIPH_DRIVER。注意这里是两个标识符 STM32F40_41xxx和 USE_STDPERIPH_DRIVER, 他们之间是用逗号隔开的。



14)、接下来我们要编译工程,在编译之前我们首先要选择编译中间文件编译后存放目录。方法是点击魔术棒,然后选择Output 选项下面的Select folder for object...,然后选择目录为我们上面新建的OBJ 目录。同时将下方的三个选项框都勾上。如下图




说明:说明一下步骤 4 的意义。 Create HEX File 选项选上是要求编译之后生成 HEX 文件。Browse Information 选项选上是方便我们查看工程中的一些函

数变量定义。


15)、在编译之前,我们先把 main.c 文件里面的内容替换为如下内容:



  • #include "stm32f4xx.h"  
  •   
  • void Delay(__IO uint32_t nCount);  
  •   
  • void Delay(__IO uint32_t nCount)  
  • {  
  •     while(nCount--){}  
  • }  
  •   
  • int main(void)  
  • {  
  •         GPIO_InitTypeDef GPIO_InitStructure;  
  •         RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);  
  •         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;  
  •         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;  
  •         GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;  
  •         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;  
  •         GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;  
  •         GPIO_Init(GPIOF, &GPIO_InitStructure);  
  •       
  •         while(1)  
  •         {  
  •         GPIO_SetBits(GPIOF,GPIO_Pin_9|GPIO_Pin_10);  
  •         Delay(0x7FFFFF);  
  •         GPIO_ResetBits(GPIOF,GPIO_Pin_9|GPIO_Pin_10);  
  •         Delay(0x7FFFFF);  
  •         }     
  • }  


与此同时,我们要将 USER 分组下面的 stm32f4xx_it.c 文件内容清空。 或者删掉其中的 32 行对main.h 头文件的引入以及 144 行 SysTick_Handler 函数内容。


16)、接下来就可以进行编译链接啦!

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

46

主题

364

帖子

2

粉丝