目录
1 安装芯片支持包
当然,创建新项目之前你得安装keil5。
支持包官网下载起来非常慢,在这里进入官网:
我这里给出F4的网盘链接。
链接:https://pan.baidu.com/s/111N6DYXRh67wtQBK4UgcxQ?pwd=4321
提取码:4321
双击.pack文件可以直接安装,此操作需要在安装Keil之后再执行,因为它会去搜索并锁定Keil的安装路径进行安装,安装过程next到finish即可。
2 新建项目目录
2.1 新建文件
用于存放项目。
2.2 新建项目目录
目录名字可以自己起,通常我习惯是下面这个名字,下面我挨个介绍:
BSP:用于存放自己的驱动代码;
在此目录下我新建了src和inc文件,分别存放驱动的.c源文件和.h头文件。
CORE:存放项目启动的汇编代码;
FWLIB:存放固件库文件;
OBJ:用于存放生成的中间文件,也包括hex;
USER:存放main.c以及keil5项目启动文件。
3 新建工程
在菜单栏点击:
接下来:
叉掉:
创建后:
4 导入库文件
4.1 下载固件库
STM32固件库包含了STM32外设对应的库函数c文件和h文件,以及必需的启动文件等,固件库同样的需要到官网下载:意法半导体-STMicroelectronicshttps://www.st.com/content/st_com/zh.html
下载很快,稍等会儿。
4.2 分配固件库
将库里的文件分别放入新建的文件夹USER、CORE、FWLIB中。
4.2.1 工程目录FWLIB
将固件库中的外设文件拷贝到工程路径中,将固件库路径 \STM32F4xx_DSP_StdPeriph_Lib_V1.9.0\Libraries\STM32F4xx_StdPeriph_Driver 下的src和inc文件夹拷贝到工程目录FWLIB下,其中src 存放的是 固件库的.c 文件,inc 存放的是对应的.h 文件。
完成后的FWLIB目录:
4.2.2 工程目录CORE
拷贝固件库 \STM32F4xx_DSP_StdPeriph_Lib_V1.9.0\Libraries\CMSIS\Device\ST\STM32F4xx\Source\ Templat es\arm\ startup_stm32f40_41xxx.s 到工程目录CORE下,文件 startup_stm32f40_41xxx.s为启动文件。
拷贝固件库 \STM32F4xx_DSP_StdPeriph_Lib_V1.9.0\Libraries\CMSIS\Includ
如下4个相关核心文件到工程目录CORE下:
完成后的CORE目录:
4.2.3 工程目录USER
将固件库 \STM32F4xx_DSP_StdPeriph_Lib_V1.9.0\Libraries\CMSIS\Device\ST\STM32F4x x\Include
拷贝到工程目录USER下:
将固件库 \STM32F4xx_DSP_StdPeriph_Lib_V1.9.0\Project\STM32F4xx_StdPeriph_Templates的的如下图文件
拷贝到工程目录USER下
完成后的USER目录:
4.3 导入到项目
4.3.1 导入源文件
工程文件添加:
回到Keil5,虽然在工程路径下拷贝过来很多文件,但是Keil上的工程目录依旧是空的,需要手动添加文件进来。
选择红绿白矩形:
在Groups中修改原有的Source Group 1为CORE,在新建2个组分别命名为FWLIB和USER
添加启动文件到CORE中,需要把文件类型切换成All files
USER添加3个.c文件
切换到工程目录FWLIB的src文件夹,除了 stm32f4xx_fmc.c
之外,图中写的全选,其他文件全部选中,Add
(为什么除了fmc呢,根据stm32f4参考手册,我选的stm32f407没有fmc功能)
到这文件添加完了,点OK。
添加完工程的目录如下:
4.3.2 导入头文件
选择魔法棒:
添加全局宏定义,点击小魔术棒,选到C/C++项,在宏定义输入框键入 STM32F40_41xxx,USE_STDPERIPH_DRIVER,
选中工程中FWLIB\inc,CORE,USER三个路径添加进来:
5 编译输出配置
切换到Output,点击Select Folder Objects…选择工程中的OBJ文件夹用于存放编译产生的中间文件,然后再勾选Create HEX File创建十六进制文件,OK保存
6 编译
首先选择编译器:
拷贝进来的源码文件需要做些修改,删除模板的main.c中内容,只留个框架,再添加头文件:
#include "stm32f4xx.h" // Device header
int main(void)
{
/* Infinite loop */
while (1)
{
}
}
打开Keil工程USER组下的stm32f4xx_it.c文件,将32行的 #include "main.h"
和144行的 TimingDelay_Decrement();
删除或屏蔽掉(因为main.h中只声明了这个TimingDelay_Decrement函数,没有定义,原定义在main.c中了,这里不需要),否则会出现编译出错。
编译
再次编译:
出现警告:.\USER\stm32f4xx.h(11583): warning: #47-D: incompatible redefinition of macro "DBGMCU_APB2_FZ_DBG_TIM9_STOP" (declared at line 11576)啥啥的。
解决方法:注释掉下图5行。(项目里是不能修改的,它是只读,需要在页面stm32f4xx.h保存一份,使用记事本打开编辑后,再替换掉原来的USER中的stm32f4xx.h)