在MDK5中新建STM32F4XX工程模板(基于固件库)

0. 库函数和寄存器的区别

本质上是一样的。可以在库函数模板里面,直接操作寄存器,因为官方库相关头文件有寄存器定义。但是不能在寄存器模板调用库函数,因为没有引入库函数相关定义。

了解寄存器基本原理的目的是为了让我们对STM32相关知识有比较深入的理解,这样在开发过程中方可得心应手,游刃有余。底层代码配置出了问题需要调试的话,必须对寄存器有一定的了解才能找到问题,因为调试代码,底层只能查看寄存器相关配置。

1. 所用到的工具

开发环境:MDK5
固件库版本:V1.4(F4专用)

固件库的下载地址:https://download.csdn.net/download/mahoon411/13457727

2. 新建工程模板

  1. 首先建立一个文件夹为 Template。 这是工程的根目录文件夹。为了方便存放工程需要的一些其他文件,再新建下面 5 个子文件夹: CORE ,FWLIB,OBJ,SYSTEM,USER。
    在这里插入图片描述

至于这些文件夹名字,实际上是可以任取的,这样取名只是为了方便识别。

  1. 接下来, 打开 Keil,点击 Keil 的菜单: Project –>New Uvision Project ,然后将目录定位到刚才建立的文件夹 Template 之下的 USER 子目录, 同时,工程取名为 Template 之后点击保存, 我们的工程文件就都保存到 USER 文件夹下面。 操作过程如下图:
    在这里插入图片描述
    在这里插入图片描述
  2. 接下来会出现一个选择 Device 的界面,就是选择我们的芯片型号,这里我们定位到STMicroelectronics 下面的 STM32F407ZG。选择 STMicroelectronics→STM32F4 Series→STM32F407→STM32F407ZG(如果使用的是其他系列的芯片,选择相应的型号就可以了)。
    在这里插入图片描述

特别注意: 一定要提前安装好对应的器件 pack 之后,才会显示相应芯片的内容。器件的pack可以直接从官网下载。
在这里插入图片描述

点击 OK, MDK 会弹出 Manage Run-Time Environment 对话框
在这里插入图片描述
这是 MDK5 新增的一个功能,在这个界面,可以添加自己需要的组件,从而方便构建开发环境,不过这里不做介绍。直接点击 Cancel即可。
做完以上步骤,keil的project的界面应如下图所示。
在这里插入图片描述

  1. USER 目录下面包含 四 个文件,如下图所示。
    在这里插入图片描述
    这里说明一下, Template.uvprojx 是工程文件,非常关键,不能轻易删除, MDK51.4生成的工程文件是以.uvprojx 为后缀。
    Listings 和 Objects 文件夹是 MDK 自动生成的文件夹,用于存放编译过程产生的中间文件。这里,我们把两个文件夹删除,我们会在下一步骤中利用之前新建的 OBJ 文件夹,存放编译产生的中间文件。当然,我们不删除这两个文件夹也是没有关系的,只是我们不用它而已。
    在这里插入图片描述
  2. 下面我们要将官方的固件库包里的源码文件复制到我们的工程目录文件夹下面。
    打开官方固件库包,定位到我们之前准备好的固件库包的目录:\STM32F4xx_DSP_StdPeriph_Lib_V1.4.0\Libraries\STM32F4xx_StdPeriph_Driver 下面,将目录下面的 src,inc 文件夹 copy 到我们刚才建立的 FWLib 文件夹下面。
    在这里插入图片描述
    在这里插入图片描述

src 存放的是固件库的.c 文件, inc 存放的是对应的.h 文件,每个外设对应一个.c 文件和一个.h 头文件。 文件内容如下图所示。
在这里插入图片描述
在这里插入图片描述

  1. 下面我们要将固件库包里面相关的启动文件复制到我们的工程目录 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_cmFunc.h 以及 core_cmInstr.h 同样复制到 CORE 目录下面。

在这里插入图片描述
在这里插入图片描述

  1. 接下来我们要复制工程模板需要的一些其他头文件和源文件到我们工程。
    首先定位到目录: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 目录下面。
在这里插入图片描述
在这里插入图片描述

  1. 前面 7 个步骤,我们将需要的固件库相关文件复制到了我们的工程目录下面。
    下面我们将这些文件加入我们的工程中去。
    打开keil,右键点击 Target1,选择 Manage Project Items,如下图所示。
    在这里插入图片描述

  2. Project Targets 一栏,我们将 Target 名字修改为 Template,然后在 Groups 一栏删掉一个 SourceGroup1,建立三个 Groups: USER,CORE,FWLIB。然后点击 OK,可以看到我们的 Target名字以及 Groups 情况如下图所示。
    在这里插入图片描述
    点击OK,project的情况如下图所示。
    在这里插入图片描述

  3. 下面我们往 Group 里面添加我们需要的文件。
    我们按照步骤 9 的方法, 右键点击点击Tempate, 选择 Manage Project Items。然后选择需要添加文件的 Group。
    这里第一步我们选择 FWLIB,然后点击右边的 Add Files,定位到我们刚才建立的目录\FWLIB\src 下面,将里面所有的文件选中(Ctrl+A),然后点击 Add,然后 Close。可以看到 Files 列表下面包含我们添加的文件,如下图所示。
    在这里插入图片描述
    这里有个文件 stm32f4xx_fmc.c 比较特殊。这个文件是 STM32F42 和 STM32F43 系列才用到,
    所以我们这里要把它删掉(注意是 stm32f4xx_fmc.c 要删掉,不要删掉 stm32f4xx_fsmc.c)。 如
    下图所示:删除之后,点击OK。进入下一步
    在这里插入图片描述

这里需要说明一下,对于我们写代码,如果我们只用到了其中的某个外设,我们就可以不用添加没有用到的外设的库文件。例如我只用 GPIO,我可以只用添加 stm32f4xx_gpio.c 而其他的可以不用添加。这里我们全部添加进来是为了后面方便,不用每次添加,当然这样的坏处是工程太大,编译起来速度慢,用户可以自行选择。

  1. 用同样的方法,将 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,回到工程主界面。
在这里插入图片描述

  1. 接下来我们要在 MDK 里面设置头文件存放路径。
    也就是告诉 MDK 到那些目录下面去寻找包含了的头文件。这一步骤非常重要。 如果没有设置头文件路径,那么工程会出现报错:头文件路径找不到
    具体操作如下图, 5 步之后添加相应的头文件路径。
    在这里插入图片描述
    这里我们需要添加的头文件路径包括: \CORE, \USER\以及\FWLIB\inc。这里大家务必要仔细,固件库存放的头文件子目录是\FWLIB\inc,不是 FWLIB\src。
    在这里插入图片描述
    点击OK后,C/C++页面变化为。
    在这里插入图片描述
  2. 接下来对于 STM32F40 系列的工程,还需要添加一个全局宏定义标识符。
    添加方法是点击魔术棒之后,进入 C/C++选项卡,然后在 Define 输入框连输入:
    STM32F40_41xxx,USE_STDPERIPH_DRIVER
    注意这里是两个标识符 STM32F40_41xxx和 USE_STDPERIPH_DRIVER, 他们之间是用逗号隔开的。
    在这里插入图片描述
  3. 接下来我们要编译工程,在编译之前我们首先要选择编译中间文件编译后存放目录。
    方法是点击魔术棒 ,然后选择“Output”选项下面的“Select folder for objects…” ,然后选择目录为我们上面新建的 OBJ 目录。
    在这里插入图片描述
    在这里插入图片描述

然后将下方的三个选项框都勾上。Create HEX File 选项选上是要求编译之后生成 HEX 文件。Browse Information 选项选上是方便我们查看工程中的一些函数变量定义。
在这里插入图片描述

  1. 在编译之前,我们先把 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);
	
	}
}

与此同时,要删掉stm32f4xx_it.c 文件中的第32行对main.h 头文件的引入以及 144 行 SysTick_Handler 函数内容。
在这里插入图片描述
在这里插入图片描述

  1. 下面我们点击编译按钮编译工程,可以看到工程编译通过没有任何错误和警告。
    在这里插入图片描述
    在这里插入图片描述
  2. 到这里,一个基于固件库 V1.4 的工程模板就建立完成,同时在工程的 OBJ 目录下面生成了对应的 hex 文件。
    在这里插入图片描述
  3. 这里还有个非常重要的关键点,就是系统时钟的配置,这里我们要修改 System_stm32f4xx.c 文件,把 PLL 第一级分频系数 M 修改为 8,这样达到主时钟频率为 168MHz。
    在这里插入图片描述
    PLL_M 这里我们要修改为 8,这样我们的系统时钟就是 168MHz。
    在这里插入图片描述
    同时,我们要在 stm32f4xx.h 里面修改外部时钟 HSE_VALUE 值为 8MHz, 因为我们的外部高速时钟用的晶振为 8M,具体修改方法如下:
    在这里插入图片描述
    如果编译之后,你的stm32f4xx_it.c文件的左边没有加号,请关闭keil后,重新打开工程就有了(这是keil的一个bug)。
    至此,工程模板就建立完成了。

猜你喜欢

转载自blog.csdn.net/mahoon411/article/details/110738443