正点原子stm32F407学习笔记1——新建工程模板

一、基于固件库

1、新建文件夹
新建一个Template文件夹,在此文件夹下新建五个子文件夹

2、打开keil软件,点击菜单栏Project –>New Uvision Project,如果有其他工程,先点击Project->Close Project,然后将目录定位到刚才建立的文件夹 Template 之下的 USER 子目录,同时,工程取名为 Template 之后点击保存,我们的工程文件就都保存到 USER 文件夹下面

3、 接下来会出现一个选择 Device 的界面,我的开发板型号是STM32F407ZG,这里我选择 STMicroelectronics→STM32F4 Series→STM32F407→STM32F407ZG(如果使用的是其他系列的芯片,选择相应的型号就可以了)

点击OK,出现界面,直接点击cancel

4、将官方的固件库包里的源码文件复制到我们的工程目录文件夹下面。打开官方固件库包,定位到我们之前准备好的固件包目录:\STM32F4xx_DSP_StdPeriph_Lib_V1.4.0\Libraries\STM32F4xx_StdPeriph_Driver 下面,将目录下面的 src,inc 文件夹 copy 到我们刚才建立的 FWLIB 文件夹下面。

5、将固件库包里面相关的启动文件复制到我们的工程目录 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 目录下面

6、接下来我们要复制工程模板需要的一些其他头文件和源文件到我们工程。首先定位到目录:
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 目录下面。

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

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

9、右键点击点击Tempate,选择 Manage Project Items.然后选择需要添加文件的 Group,这里第一步我们选择 FWLIB,然后点击右边的 Add Files,定位到我们刚才建立的目录\FWLIB\src 下面,将里面所有的文件选中(Ctrl+A),然后点击 Add,然后 Close.可以看到 Files 列表下面包含我们添加的文件(对于我们写代码,如果我们只用到了其中的某个外设,我们就可以不用添加没有用到的外设的库文件。例如我只用 GPIO,我可以只用添加 stm32f4xx_gpio.c 而其他的可以不用添加。这里我们全部添加进来是为了后面方便,不用每次添加,当然这样的坏处是工程太大,编译起来速度慢,)

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

10、用同样的方法, CORE 下面需要添加的文件为 startup_stm32f40_41xxx.s(注意,默认添加的时候文件类型为.c,也就是添加 startup_stm32f40_41xxx.s 启动文件的时候,你需要选择文件类型为 All files才能看得到这个文件 )


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

点击add界面不会退出,自己添加成功后点击close关闭,主界面如下

12、在 MDK 里面设置头文件存放路径。也就是告诉 MDK 到那些目录下面去寻找包含了的头文件。这一步骤非常重要。如果没有设置头文件路径,那么工程会出现报错头文件路径找不到。

我们需要添加的头文件路径包括:\CORE, \USER\以及\FWLIB\inc。这里大家务必要仔细,
固件库存放的头文件子目录是\FWLIB\inc,不是 FWLIB\src。因为Inc中是头文件,src中是源文件

13、还需要添加一个全局宏定义标识符。添加方法是点击魔术棒之后,进入 C/C++选项卡,然后在 Define 输入框连输入:STM32F40_41xxx,USE_STDPERIPH_DRIVER。注意这里是两个标识符 STM32F40_41xxx和 USE_STDPERIPH_DRIVER,他们之间是用逗号隔开的

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

Create HEX File 选项选上是要求编译之后生成 HEX 文件。
Browse Information 选项选上是方便我们查看工程中的一些函数变量定义。选择OBJ是因为生成的文件统一放在这个文件夹下,不然会放在系统默认文件夹下。
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、点击编译按钮编译工程无错误和警告
17、到这里,一个基于固件库的工程模板就建立完成,同时在工程的 OBJ 目录下面生成了
对应的 hex 文件。打开flymcu软件定位到对应的hex文件进行串口烧录,烧录进开发板后两个LED灯闪烁。

18、每个实验都有一个 SYSTEM 文件夹,下面有 3 个子目录分别为 sys,usart,delay,存放的是我们每个实验都要使用到的共用代码。用我们之前讲解的办法,在工程中新建一个组,命名为SYSTEM,然后加入这三个文件夹下面的.c 文件分别为 sys.c,delay.c,usart.c

再编译一遍,如果没有报错说明添加成功
19、最后,系统时钟的配置,修改为符合我们硬件的值修改 System_stm32f4xx.c 文件,把 PLL 第一级分频系数 M 修改为 8,这样达到主时钟频率为 168MHz

同时,我们要在 stm32f4xx.h(在system_stm32f4xx.c中,注意关闭keil再重新打开才能看到) 里面修改外部时钟 HSE_VALUE 值为 8MHz,因为我们的外部高速时钟用的晶振为 8M

二、基于寄存器

1、新建一个test文件夹,在test文件夹中新建USER文件夹

2、打开 MDK(以下将 MDK5 简称为 MDK)软件。然后点击 Project→New uVision Project,将工程名设为test,保存在这个 USER 文件夹里面

3、开发板所使用的 STM32 型号为 STM32F407ZGT6,所以在这里我们选择STMicroelectronics→STM32F4 Series→STM32F407→STM32F407ZGT6(如果使用的是其他系列的芯片,选择相应的型号就可以了

点击OK,之后弹出的界面点击cancel
4、添加启动代码,直接使 startup_stm32f40_41xxx.s 这个启动文件即可。不过这个启动文件做了一点修改,到寄存器版本文件夹下的其中一个实验(如跑马灯实验)中的USER下找到启动文件复制到刚刚新建的的test下的USER文件夹下


我们在汇编代码里面使能了 FPU,所以在 MDK 里面,我们也要设置使用 FPU,否则可能代码会无法运行,设置方法如下:点击魔术棒,选择 Options for Target ‘Target1’,打开 Target 选项卡,在 Code Generation 里面,选择 Use single precision

5、启动文件添加到工程,我们找到 Target1→Source Group1→双击→设置打开文件类型为 Asm Source file→选择 startup_stm32f40_41xxx.s→点击 Add

6、MDK5.14 默认将文件生成在了 Listings 和 Objects 文件夹里面,所以我们在TEST 目录下新建一个新的 OBJ 文件夹来存放这些中间文件

点击OK,这时定位到了OBJ文件夹下
7、copy系统代码,还是进入寄存器的system文件夹下复制到test文件夹下

8、将system添加到工程,在 Target 目录树上点击右键→Manage Project Items,然后点击 Add Files 按钮,把 SYSTEM 文件夹三个子文件夹里面的:sys.c、usart.c、delay.c 加入到 SYSTEM 组中。

9、与上一步骤同样方式新建USER文件夹,新建一个 test.c 文件,并保存在 USER 文件夹下。然后双击 USER 组,会弹出加载文件的对话框,此时我们在 USER 目录下选择 test.c 文件,加入到 USER 组下。


10、编写代码,在 test.c 文件里面输入如下代码:

#include "sys.h"
#include "usart.h" 
#include "delay.h" 
//ALIENTEK 探索者STM32F407开发板 实验0
//新建工程实验  
//技术支持:www.openedv.com
//广州市星翼电子科技有限公司

int main(void)
{ 
	u8 t=0;
	Stm32_Clock_Init(336,8,2,7);//设置时钟,168Mhz
	delay_init(168);		//初始化延时函数
	uart_init(84,115200);	//串口初始化为115200
	while(1)
	{
		printf("t:%d\r\n",t);
		delay_ms(500);
		t++;
	}
}

此时编译会报错,显示找不到头文件

然后在 Include Paths 处(4 处),点击 5 处的按钮。在弹出的对话框中加入 SYSTEM 文件
夹下的 3 个文件夹名字,把这几个路径都加进去

先用flyMCU软件通过串口烧录进开发板,打开串口助手可看到数字增加,程序执行正确

至此,stm32基于库函数和寄存器新建工程模板完成,所有资料均来自正点原子stm32f407探索者开发板

物联沃分享整理
物联沃-IOTWORD物联网 » 正点原子stm32F407学习笔记1——新建工程模板

发表评论