基于ST官方推出的固件库,我们能够更加方便地使用stm32。那么为了便于今后的开发工程,创建一个工程模板,可以避免浪费很多重复的时间。本次演示如何建立STM32F103VET6的工程模板供大家参考。在文章最后我也会分享一些自己已经建立好的工程模板,包括stm32f103ret6/vet6、stm32f407zet6,也欢迎大家继续补充分享。
目录
我们先要下载官方的固件库包STM32F10x_StdPeriph_Lib_V3.5.0(我会放在文章最后)编辑
一、新建工程文件夹
首先,我们要新建一个文件夹存放我们的工程模板(我这里命名为STM32F103VET6),并在该文件夹下创建5个子文件夹,一般我会命名为USER、OBJ、STM32F10x_FWLib、SYSTEM、CORE
二、创建工程
打开Keil,点击Project,再点击New μVison Project
定位到刚刚创建的文件STM32F103VET6-USER,并命名为Project
选择对应芯片的型号(比如此时我就应该选择STM32F103VE),再点击OK
当然在此之前,你需要先下载对应芯片的固件库,在我之前的帖子里有f1和f4的固件库Keil5同时兼容C51和stm32的方法(win11实测有效)
出现以下页面,点击OK
此时,你应该初步创建了工程,你能看到keil中你创建的工程以及USER文件夹如下的内容
(Listings 和 Objects文件夹是 MDK 自动生成的文件夹,用于存放编译过程产生的中间文件,我们可以将其删除)
三、添加文件
我们先要下载官方的固件库包STM32F10x_StdPeriph_Lib_V3.5.0(我会放在文章最后)
![](https://i-blog.csdnimg.cn/blog_migrate/ebe18dc0af91731666455d7667367edd.png)
1.CORE文件夹
CORE 用来存放核心文件和启动文件
(1)将STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\CoreSupport中的文件core_cm3.c和core_cm3.h复制到CORE文件夹中
(2)将STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\starturm中的文件startup_stm32f10x_hd.s复制到CORE文件夹中(注意不同的芯片对应选择不同的启动文件,以下方法便于理解启动文件的选择,如vet6的Flash大于128k,我就选择hd.s,如果还是不确定可以查阅资料)
cl:互联型产品,stm32f105/107系列
vl:超值型产品,stm32f100系列
xl:超高密度产品,stm32f101/103系列
ld:低密度产品,FLASH小于64K
md:中等密度产品,FLASH=64 or 128
hd:高密度产品,FLASH大于128
2.STM32F10x_FWLib文件
STM32F10x_FWLib 文件夹用来存放 ST 官方提供的库函数源码文件
(1)将STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\STM32F10x_StdPeriph_Driver中的src,inc 文件夹复制到STM32F10x_FWLib文件夹中(src 存放的是固件库的.c 文件,inc 存放的是对应的.h 文件)
3. OBJ文件
4.USER文件夹
USER文件存放工程代码文件
(1)将STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x中的三个文件stm32f10x.h,system_stm32f10x.c,system_stm32f10x.h复制到USER文件夹中
(2)将STM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Template中的四个文件main.c,stm32f10x_conf.h,stm32f10x_it.c,stm32f10x_it.h复制到USER文件夹中
5.SYSTEM文件夹
SYSTEM文件夹存放一些已经写好的例程共用代码(大家可以从例程或我最后的工程模板中获取)
(1)将SYSTEM文件夹中的sys、usart、delay三个文件夹复制到自己的SYSTEM文件夹中
四、在Keil中进行配置
1.添加文件到工程
(1)右键点击Target 1,再点击Manage Project ITems...,再点击删除中间框中的Source Group 1
(2)新建四个Group (3)点击USER,再点击Add Files...,将对应文件夹的三个.c文件添加进来
(4)点击CORE,再点击Add Files...,将对应文件下的两个.c\.s文件添加进来
(.s文件需要在添加文件时选择所有文件类型可见)
(5)点击FWLIB,再点击Add Files...,打开对应文件夹的src文件夹将所有.c文件添加进来
(6)点击SYSTEM,再点击Add Files...,依次打开对应文件夹的三个子文件夹delay、sys、usart,将其中的delay.c、sys.c、usart.c三个文件添加进来
2.配置工程环境
(1)点击工具栏的“魔法棒”(Options for Target...)
(2)点击上方的Output,勾选Create HEX File
再点击Select Folder for Objects...,并定位到OBJ文件夹
(3)点击上方的C/C++,在Define后面的框中填STM32F10X_HD,USE_STDPERIPH_DRIVER (填入的内容和我们的启动文件有关,如果我们用MD,那就把HD换成MD)
再在下方Include Paths中添加.h文件所在的上一级文件夹
3.替换一下main.c文件
如果使用我建好的工程的main.c,则不需要这一步,使用固件库包中的main.c,需要将以下代码替换原有代码,并敲一下回车
#include "stm32f10x.h"
void Delay(u32 count)
{
u32 i=0;
for(;i<count;i++);
}
int main(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|
RCC_APB2Periph_GPIOE, ENABLE); //使能 PB,PE 端口时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //LED0-->PB.5 端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO 口速度为 50MHz
GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化 GPIOB.5
GPIO_SetBits(GPIOB,GPIO_Pin_5); //PB.5 输出高
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //LED1-->PE.5 推挽输出
GPIO_Init(GPIOE, &GPIO_InitStructure); //初始化 GPIO
GPIO_SetBits(GPIOE,GPIO_Pin_5); //PE.5 输出高
while(1)
{
GPIO_ResetBits(GPIOB,GPIO_Pin_5);
GPIO_SetBits(GPIOE,GPIO_Pin_5);
Delay(3000000);
GPIO_SetBits(GPIOB,GPIO_Pin_5);
GPIO_ResetBits(GPIOE,GPIO_Pin_5);
Delay(3000000);
}
}
到此为止,一个工程模板就建立好了,我们点击编译,显示没有问题就ok啦