3、Libraries⽂件夹,⾥⾯有CMSIS、和STM32F4xx_StdPeriph_Driver两个⽂件夹,CMSIS ⽂件夹存放的是符合 CMSIS 规范的⼀些
1、core_m4.h是 CMSIS核⼼⽂件,提供进⼊M4内核接⼝由ARM公司提供,所有的CM4内核的芯⽚都适⽤。
2、system_stm32f4xx.h是⽚上外设接⼊层系统头⽂件。主要⽤来申明设置系统以及总线时钟相关的函数。源⽂件对应为
system_stm32f4xx.c。
3、stm32f4xx.h是STM32F4⽚上外设访问层头⽂件,主要是系统寄存器定义申明以及包装内存操作。
system的头文件4、stm32f4xx_it.c,stm32f4xx_it.h 以 及stm32f4xx_conf.h 等 ⽂ 件 ⽤来编写中断服务函数(中断服务函数也可以写在任意⽂件中)。
5、stm32f4xx_conf.h 是外设驱动配置⽂件。
6、misc.c,misc.h,stm32f4xx_ppp.c,stm32f4xx_ppp.h 以及 stm32f4xx_rcc.c 和stm32f4xx_rcc.h ⽂件是STM32F4 标准的外设库⽂件。misc.c和misc.h是定义中断优先级分组和Systick定时器相关的函数。stm32
f3xx_rcc.c 和 stm32f4xx_rcc.h 是与 RCC 相关的⼀些操作函数,作⽤主要是⼀些时钟的配置和使能。在任何⼀个 STM32 ⼯程 RCC 相关的源⽂件和头⽂件是必须添加的。
stm32f4xx_ppp.c 和 stm32f4xx_ppp.h,是 STM32F4 标准外设固件库对应的源⽂件和头⽂件。包括⼀些常⽤外设
GPIO,ADC,USART 等。
7、Application.c就是应⽤层代码。
8、有了上述⽂件还差⼀个启动⽂件,启动⽂件⼀般叫做startup_xxxx.s。启动⽂件主要⽤来进⾏堆栈的初始化,中断向量表以及中断函数的定义。启动⽂件需要引导进⼊main函数。Reset_Hardler中断函数是唯⼀实现了的中断处理函数(在系统复位之后进⼊main函数,进⼊之前调⽤SystemInit系统初始化函数),其他的中断函数基本都是死循环。
三、固件库的使⽤
3、将需要固件库相关⽂件复制到⼯程⽬录中。将固件包⾥的
STM32F4xx_DSP_StdPeriph_Lib_V1.4.0\Libraries\STM32F4xx_StdPeriph_Driver⾥的src和inc拷贝到
刚新建的FWLIB中,将固件库的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 ⽬录下⾯。将固件库的STM32F4xx_DSP_StdPeriph_Lib_V1.4.0\Libraries\CMSIS\Device\ST\STM32F4xx\Include 将⾥⾯的 2 个头⽂件 stm32f4xx.h 和 system_stm32f4xx.h 复制到 USER ⽬录之下。再将
\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中。
4、在Keil的Project Targets中添加组(USER,CORE,FWLIB),并将相应的⽂件加⼊其中。(注意:FWLIB中的stm32f4xx_fmc.c⽂件只有STM32F42和STM32F43需要⽤到,这⾥应该删除)
5、在MDK中设置头⽂件存放路径,也就是告诉MDK应该去那些⽬录⾥寻包含的头⽂件。在魔术棒的
C/C++选项卡输⼊Define输⼊框输⼊:STM32F40_41xxx,USE_STDPERIPH_DRIVER。并在Output选择中间⽂件编译后存放⽬录(及刚刚新建的OBJ⽬录)同时将下⽅
的三个选项都勾上。
6、将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 |