1.创建工程文件
在我们创建工程时为了方便,需要提前配置好启动文件,以及工程的创建位置,这样做更有利于我们管理整个工程。
首先我们创建一个文件夹,用来存放整个工程的所有文件
在这个文件夹下,创建四个子文件夹,用来存放我们工程需要的启动文件、固件库以及我们自己在编写过程中创建的各种外设的驱动文件。
四个文件的名称不是固定的,可以自定义文件名,但是在一般情况下都是采用这种命名方式,四个文件夹的说明如下表所示。
文件夹名称 | 说明 |
CORE | 用来存放STM32的启动文件 |
FWLIB | 用来存放STM32的各种库函数文件 |
HARDWARE | 用来存放外设模块文件 |
USER | 用来存放工程文件 |
2.添加工程文件
在我们创建好文件夹后,就可以开始往文件夹里面放东西了,首先是我们的启动文件
1.CORE
这个文件夹是用来存放STM32的内核启动文件的,其中需要包含以下几个文件:
文件名 | 说明 |
core_cm4.h | 内核功能的定义,比如NVIC相关寄存器的结构体和Systick配置; |
core_cm4_simd.h | 包含与编译器相关的处理 |
core_cmFunc.h | 内核核心功能接口头文件 |
core_cmInstr.h | 包含一些内核核心专用指令 |
startup_stm32f40_41xxx.s | 堆栈的初始化、中断向量表以及中断函数定义 |
我们打开STM32的固件库文件并且打开以下路径:
STM32F4xx固件库\STM32F4xx_DSP_StdPeriph_Lib_V1.4.0\Libraries\CMSIS\Device\ST\STM32F4xx\Source\Templates\arm
我这里采用的是STM32F407的固件库,所以在此文件路径下存在以下文件:
我用红框框标出来的就是我需要的启动文件,各位可以根据自己的型号选择。
除了启动文件,还需要添加几个与内核有关的头文件,分别是以下几个:core_cm4.h、core_cm4_simd.h、core_cmFunc.h、core_cmInstr.h。路径:
STM32F4xx固件库\STM32F4xx_DSP_StdPeriph_Lib_V1.4.0\Libraries\CMSIS\Include
将这5个文件添加到CORE文件夹中后,工程的CORE文件就添加好了。
2.FWLIB
这个文件夹中包含了我们在工程中需要使用到的各种标准外设驱动函数文件。在固件库文件中其路径为:
STM32F4xx固件库\STM32F4xx_DSP_StdPeriph_Lib_V1.4.0\Libraries\STM32F4xx_StdPeriph_Driver
在这个路径下,有两个子文件,分别是inc和src,一个是库函数的头文件、一个是库函数的源文件。
我们直接将这两个子文件夹拷贝到我们的FWLIB文件夹下,FWLIB文件夹就配置完成了。
3.USER
这个文件中保存的是我们的工程文件,之后我们在创建工程的时候,就是创建在此文件夹下。这个里面我们需要准备六个文件,分别是以下文件:
文件名 | 说明 |
stm32f4xx.h | 片上外设访问头文件,里面包含大量结构体和宏定义(寄存器定义声明及内存访问操作的封装) |
system_stm32f4xx.c | STM32F4xx 系统时钟配置文件,关键函数SystemInit(),系统启动文件 |
stm32f4xx_conf.h | 里面包含了我们需要使用的标准库,对于需要使用的库需要在其中加以说明 |
stm32f4xx_it.h | 中断服务函数头文件 |
stm32f4xx_it.c | 编写中断服务函数,当然也可以将其编写在其他文件中比如各个硬件的驱动文件里面 |
main.c | 主函数文件,有用户自己创建在此文件夹下 |
首先是我们的stm32f4xx.h、system_stm32f4xx.c这两个文件,这两个文件的所在路径为:
STM32F4xx固件库\STM32F4xx_DSP_StdPeriph_Lib_V1.4.0\Libraries\CMSIS\Device\ST\STM32F4xx\Include
其次是stm32f4xx_conf.h、stm32f4xx_it.h、stm32f4xx_it.c文件,其在固件库中的路径是:
STM32F4xx固件库\STM32F4xx_DSP_StdPeriph_Lib_V1.4.0\Project\STM32F4xx_StdPeriph_Templates
main.c文件需要我们在建立工程时自己创建,创建到USER文件夹下即可。
4.HRADWARE
HRADWARE文件中存放的是外设模块文件,是我们在编写代码过程中使用到的各种模块的代码,这个文件在创建工程时不需要添加文件。
3.KEIL5对工程进行配置
首先先创建一个工程,工程名可以自己选择,创建路径在USER目录下
创建完成之后选择芯片
选择好后,点击下方按钮
添加工程配置资源文件。
这里将我们刚开始准备好的4个文件夹都添加到工程中,添加好文件组后,我们添加文件,将所有的*.s *.c文件都添加到组中。
添加完成之后大概就是这个样子的,因为FWLIB中文件太多,我就没有全部添加进去,这些文件添加好后,还需要添加这些文件所对应的头文件。
点击下方按钮
打开之后,添加头文件路径
添加头文件成功之后,我们还需要添加两个宏定义标识符
USE_STDPERIPH_DRIVER,STM32F40_41xxx,
这个步骤完成后,基本的配置过程就已经完成了。
4.编译测试
在上述步骤都完成后,我们还差一个main.c文件就可以编译了,我们在USER目录下创建一个main文件。
现在我们就可以编译测试了。
一般情况下到这一步就可以编译通过了。
5.编译错误
在一般情况下,到了上一步之后应该可以编译成功,但是有可能会出现以下错误,导致编译失败。
出现这个问题的原因就是在STM32的固件库文件中,有官方提供的main.c文件,所以在stm32f4xx.h文件中也有对main.h文件的包含,但是我们使用的不是官方提供的main模板,所以这个包含也就不存在,我们可以双击错误,定位到#include "main.h"处,然后将这一行注释掉
注释掉这个地方之后会报另一个错误。
这个时候我们再双击这个警告,跳转到stm32f4xx_it.c中
将这里也注释掉,然后重新编译。
不出意外的话,就编译成功了。
6.总结
在STM32的学习中,配置一个工程虽然不难,但是过程比较麻烦,如果每创建一个工程都去重新配置一个工程文件,就会增加不必要的工作量,我们可以提前配置好一个工程文件,以后要使用的时候直接拷贝过去就可以了。
仅供参考,不保证一定不会遗漏哪些问题,毕竟我也是小菜鸡,但是目前在我的学习阶段是没有什么太大的问题。