#下载stm32官方(标准库/HAL库)下载链接
http://www.openedv.com/thread-295843-1-1.html
##文件夹介绍:
Libraries文件夹下面有CMSIS和STM32F4XX_StdPeriph_Driver两个目录,这两个目录包含固件库核心的所有子文件夹和文件。
1.CMSIS文件夹存放的是符合CMSIS规范的一些文件。包括STM32F4核内外设访问层代码。DSP库,RTOS API,以及STM32F4片上外设访问层代码等。
2.STM32F4XX_StdPeriph_Driver放的是标准外设库源码文件和对应的头文件。inc目录存放的是stm32f4xx_ppp.h头文件,无需改动。src目录下面放的是stm32f4xx_ppp.c格式的固件库源文件。每一个.c文件和一个相应的.h文件对应。这些文件也是固件库外设的关键文件,每个外设对应一组文件。
project文件夹下面有两个文件,其中STM32F4XX_StdPeriph_Examples文件夹下面存放的是ST官方提供的固件库实例源码,在以后的开发中,可以参考修改这个官方提供的实例来快速驱动自己的外设,很多开发板的实例都是参考官方提供的例程源码。这些源码对以后学习非常重要。
STM32F4XX_StdPeriph_Template文件夹下面存放的是工程模板。
Utilities文件下就是官方评估板的一些对应源码。
根目录中还有一个stm32f4xx_dsp_stdPeriph_um.chm文件,直接打开可以知道,这是一个库函数的帮助文档。
##关键文件介绍
core_cm4.h 文件位于\Libraries\CMSIS\Include 目录 下面的,这个就是 CMSIS 核心文件,提供进入 M4 内核接口,这是 ARM 公司提供,对所有 CM4 内核的芯片都一样。你永远都不需要修改这个文件。
stm32f4xx.h 和 system_stm32f4xx.h 文件位于\Libraries\CMSIS\Device\ST\STM32F4xx\Include 下。system_stm32f4xx.h是片上外设接入层系统头文件。主要是申明设置系统及总线时钟相关 的函数。与其对应的源文件 system_stm32f4xx.c 在目录\Project\STM32F4xx_StdPeriph_Templates 可以找到。这个里面有一个非常重要的 SystemInit()函数申明,这个函数在我们系统启动的时候都会调用,用来设置系统的整个系统和总线时钟。
stm32f4xx.h 是 STM32F4 片上外设访问层头文件。这个文件就相当重要了,只要你做 STM32F4 开发,你几乎时刻都要查看这个文件相关的定义。这个文件打开可以看到,里面非常 多的结构体以及宏定义。这个文件里面主要是系统寄存器定义申明以及包装内存操作。
stm32f4xx_it.c,stm32f4xx_it.h 以及stm32f4xx_conf.h 等文件,可以在\Project\STM32F4xx_StdPeriph_Templates 文件夹中找到。 这几个文件我们后面新建工程也有用到。stm32f4xx_it.c 和 stm32f4xx_it.h 里面是用来编写中断服务函数,中断服务函数也可以随意编写在工程里面的任意一个文件里面,个人觉得这个文件 没太大意义。
stm32f4xx_conf.h 是外设驱动配置文件。文件打开可以看到一堆的#include,这里你建立工程 的时候,可以注释掉一些你不用的外设头文件。
对 于 上 图 中 的 misc.c,misc.h,stm32f4xx_ppp.c,stm32f4xx_ppp.h以及 stm32f4xx_rcc.c 和stm32f4xx_rcc.h 文件,这些文件存放在目录 Libraries\STM32F4xx_StdPeriph_Driver。这些文件 是 STM32F4 标准的外设库文件。其中 misc.c 和 misc.h 是定义中断优先级分组以及 Systick 定时 器相关的函数。stm32f3xx_rcc.c 和 stm32f4xx_rcc.h 是与 RCC 相关的一些操作函数,作用主要 是一些时钟的配置和使能。在任何一个 STM32 工程 RCC 相关的源文件和头文件是必须添加的。
stm32f4xx_ppp.c和stm32f4xxx_ppp.h就是stm32标准外设固件对应的源文件和头文件。包括一些实用外设GPIO、ADC、USART等。
实际上一个完整的 STM32F4 的工程光有上面这些文件还是不够的。还缺少非常关键的启 动文件。STM32F4 的启动文件存放在目录\Libraries\CMSIS\Device\ST\STM32F4xx\Source\Templates\arm下面。对于不同型号的 STM32F4 系列对应 的启动文 件也不一样。我们的开发板是 STM32F407系 所以我们选择的启动文件startup_stm32f40_41xxx.s。 启动文件到底什么作用,其实我们可以打开启动文件进去看看。启 动文件主要是进行堆栈之类的初始化,中断向量表以及中断函数定义。启动文件要引导进入 main 函数。Reset_Handler 中断函数是唯一实现了的中断处理函数,其他的中断函数基本都是死 循环。 Reset_handler 在我们系统启动的时候会调用,下面让我们看看 Reset_handler 这段代码:
这段代码的作用是在系统复位之后引导进入 main 函数,同时在进入 main 函数之前,首先要调 用 SystemInit 系统初始化函数。
#建立工程
-5.下面我们要将官方的固件库包里的源码文件复制到我们的工程目录文件夹下面。 打开官方固件库包,定位到我们之前准备好的固件库包的目录:
\Libraries\STM32F4xx_StdPeriph_Driver 下面, 将目录下面的 src,inc 文件夹 copy 到我们刚才建立的 FWLib 文件夹下面。src 存放的是固件库的.c 文件,inc 存放的是对应的.h 文件,您不妨打开这两个文件目录过目一下里面的文件,每个外设对应一个.c 文件和一个.h 头文件。
-6.下面我们要将固件库包里面相关的启动文件复制到我们的工程目录 CORE 之下。 打开官方固件库包,定位到目录
\Libraries\CMSIS\Device\ST\STM32F4xx\Source\Templat es\arm 下面,将文件 startup_stm32f40_41xxx.s 复制到 CORE 目录下面。然后定位到目录
\Libraries\CMSIS\Includ ,将里面 的 四个 头 文 件 :core_cm4.h、core_cm4_simd.h、core_cmFunc.h 以及 core_cmInstr.h 同样复制到 CORE 目录下面。现在看看我们的 CORE 文件夹下面的文件.
-7.接下来我们要复制工程模板需要的一些其他头文件和源文件到我们工程。首先定位到目录: \Libraries\CMSIS\Device\ST\STM32F4xx\Include 将里面 的 2 个头文件 stm32f4xx.h 和 system_stm32f4xx.h 复制到 USER 目录之下。这两个头文件是 STM32F4 工程非常关键的两个头文件。后面我们讲解相关知识的时候会给大家详细讲解。然后 进入目录\Project\STM32F4xx_StdPeriph_Templates , 将目录下面的 5 个 文 件 main.c , stm32f4xx_conf.h , stm32f4xx_it.c , stm32f4xx_it.h , system_stm32f4xx.c 复制到 USER 目录下面.
相关文件复制到 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 Project Items.然后选择需要添加文件的 Group,这里第一步我 们选择 FWLIB,然后点击右边的 Add Files,定位到我们刚才建立的目录\FWLIB\src 下面, 将里面所有的文件选中(Ctrl+A),然后点击 Add,然后 Close.可以看到 Files 列表下面包含 我们添加的文件,如下图 3.3.2.15。 这里需要说明一下,对于我们写代码,如果我们只用到了其中的某个外设,我们就可以不 用添加没有用到的外设的库文件。例如我只用 GPIO,我可以只用添加 stm32f4xx_gpio.c 而 其他的可以不用添加。这里我们全部添加进来是为了后面方便,不用每次添加,当然这样 的坏处是工程太大,编译起来速度慢,用户可以自行选择。
这里有个文件 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 到那些目录下面去寻 找包含了的头文件。这一步骤非常重要。如果没有设置头文件路径,那么工程会出现报错 头文件路径找不到。具体操作如下图。
这里我们需要添加的头文件路径包括:\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 objects…”,然后选择目录为我们上面新建的 OBJ 目录。同时将下方的三个选项框都勾上。
这里说明一下步骤14的意义。Create HEX File选项选上是要求编译之后生成HEX文件。Browse Information选项选上是方便我们查看工程中的一些函数变量定义.
-15.在编译之前,我们先把 main.c 文件里面的内容替换为如下内容:
#include "stm32f4xx.h"
#include "usart.h"
#include "delay.h"
int main(void)
{
u32 t=0;
uart_init(115200);
delay_init(84);
while(1){
printf("t:%d\r\n",t);
delay_ms(500);
t++;
}
}
与此同时,我们要将 USER 分组下面的 stm32f4xx_it.c 文件内容清空。或者删掉其中的 32 行对main.h 头文件的引入以及 144 行 SysTick_Handler 函数内容。
-16. 到这里,一个基于固件库 V1.4 的工程模板就建立完成,下面我们点击编译按钮编译工程,可以看到工程编译通过没有任何错误和警告。同时在工程的 OBJ 目录下面生成了 对应的 hex 文件。
-17.这里还有个非常重要的关键点,就是系统时钟的配置,这里我们要修改 System_stm32f4xx.c 文件,把 PLL 第一级分频系数 M 修改为 8, 这样达到主时钟频率为 168MHz。修改方法如下:
#if defined (STM32F40_41xxx) || defined (STM32F427_437xx) || defined (STM32F429_439xx) || defined (STM32F401xx)
/* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N */
#define PLL_M 8
#else /* STM32F411xE */
#if defined (USE_HSE_BYPASS)
#define PLL_M 8
#else /* STM32F411xE */
#define PLL_M 16
#endif /* USE_HSE_BYPASS */
#endif
同时,我们要在 stm32f4xx.h 里面修改外部时钟 HSE_VALUE 值为 8MHz,因为我们的外部高 速时钟用的晶振为 8M,具体修改方法如下:
#if !defined (HSE_VALUE)
#define HSE_VALUE ((uint32_t)8000000) /*!< Value of the External oscillator in Hz */
#endif /* HSE_VALUE */
-18. 实际上经过前面步骤,我们的工程模板已经建立完成。但是在我们在实际工程中,每个实验都有一个 SYSTEM 文件夹,下面有 3 个子目录分别为 sys,usart,delay, 存放的是我们每个实验都要使用到的共用代码。
进入 SYSTEM 文件夹,里面有三个子文件夹分别为 delay,sys,usart,每个子文件夹下面都有相应的.c 文件和.h 文件。我们将 SYSTEM 文件夹和里面 的三个子文件夹复制到我们工程根目录中。如下图。我们接下来要将这三个目录下面的源文件 加入到我们工程,同时将头文件路径加入到 PATH 中,
在工程中新建一个组,命名为 SYSTEM,然后加入这三个文件 夹下面的.c 文件分别为 sys.c,delay.c,usart.c。
参考步骤12,添加头文件路径
这样一个基于STM32标准库的工程模板就建立完成了