使用Keil5创建STM32工程

Keil对于做单片机开发的人员来所再熟悉不过了。Keil成立与1982年,在2005年10月被ARM公司收购。
相信对于很多STM32的初学者来说从零开始创建一个STM32工程是比较困难的,很多人都是把之前的工程复制过来,再进行改编的,这样可以省掉很多烦恼。笔者最近也在学习STM32的开发,顺便整理一下自己的方法跟大家分享,下面来介绍如何使用Keil μVision5创建一个STM32的工程。

下载ST官方库


在ST官网:https://www.st.com/zh/microcontrollers-microprocessors.html下载STM32 Standard Peripheral Libraries库文件,打开后进入工具与软件 -> 嵌入式软件 -> MCU及MPU嵌入式软件

STM32 Standard Peripheral Libraries

笔者购买的开发板是使用STM32F103C8T6微控制器的开发板,所以选择STSW-STM32054:

STSW-STM32054

下载完成后解压文件你会得到以下文件,这里主要用到的是LibrariesProject文件夹:

解压后文件夹

创建工程文件夹


  • 创建文件夹Template作为工程文件的根目录,然后在Template目录下再创建以下文件夹:CMSIS、USER、FWLIB、STARTUP。 CMSIS用于存放内核函数,USER存放用户自己的函数,FWLIB存放库函数,STARTUP存放启动引导文件。

  • 将STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\CoreSupport中的文件复制到工程目录的CMSIS文件夹中,
    将STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x中的.c和.h文件复制到工程目录的CMSIS文件夹中,复制完成后的CMSIS文件夹应该是这样的:

CMSIS

  • 将STM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Template目录下的.c和.h文件复制到工程目录的USER文件夹中,复制完成后的USER文件就是这样的:

USER

  • 将STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\STM32F10x_StdPeriph_Driver目录下的inc文件夹和src文件夹复制到工程目录的FWLIB文件夹中,复制完成后的FWLIB文件夹应该是这样的:

CMSIS

  • 将STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\arm中的startup_stm32f10x_md.s文件复制到工程文件夹的STARTUP文件夹中,这里的是单片机的启动引导文件,可以根据芯片的FLASH容量来区分属于小容量、中容量和大容量从而决定使用哪个启动引导文件:
FLASH容量 分类 对应的启动引导文件
FLASH <= 32K 小容量 startup_stm32f10x_ld.s
64K <= FLASH <= 128K 中容量 startup_stm32f10x_md.s
256K <= FLASH <= 512K 大容量 startup_stm32f10x_hd.s

笔者购买的开发板是使用STM32F103C8T6的微控制器,拥有64K的FLASH,属于中容量的微控制器,所以启动引导文件选择arm中的startup_stm32f10x_md.s,复制完成后的STARTUP文件夹应该是这样的:

STARTUP

新建μVision工程


打开Keil,新建工程Template,工程文件保存在上一步的Template目录中,保存后选择芯片,这里我们用到的是STM32F103C8,在Search中输入STM32F103C8选中后点OK,在下一步弹出的Manager Run-Time Environment中我们点击Cancel,不需要让Keil来为我们添加库文件,我们使用之前下载好的库文件自己手工添加。

STM32F103C8 Device

点击Manager Project Items按钮,将Project Targets更名为Template。 删除默认的Groups,并创建以下Groups:CMSIS、USER、FWLIB、STARTUP。

Manager Project Items

在CMSIS Group中添加工程文件目录的CMSIS文件夹里的.c文件;在USER Group中添加工程文件目录的USER文件夹里的.c文件;在FWLIB Group中添加工程文件目录的FWLIB\src文件夹里的.c文件;在STARTUP Group中添加工程文件目录的STARTUP文件夹里的startup_stm32f10x_md.s文件;添加完成后点击OK。

点击Options for Target按钮(魔术棒)选择C/C++设置页,在Preprocessor Symbots的Define中填写:USE_STDPERIPH_DRIVER, STM32F10X_MD这里的STM32F10X_MD是因为启动引导文件使用的是中容量的引导文件;Include Paths中填写:.\CMSIS;.\FWLIB\inc;.\FWLIB\src;.\USER;.\CMSIS\startup\arm,完成后点击OK。

OPtions for Target

编译调试


编译工程出现报错:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Rebuild started: Project: Template
*** Using Compiler 'V5.06 update 6 (build 750)', folder: 'C:\Keil_v5\ARM\ARMCC\Bin'
Rebuild target 'Template'
compiling core_cm3.c...
compiling main.c...
USER\main.c(24): error: #5: cannot open source input file "stm32_eval.h": No such file or directory
#include "stm32_eval.h"
USER\main.c: 0 warnings, 1 error
compiling system_stm32f10x.c...
...
compiling stm32f10x_tim.c...
assembling startup_stm32f10x_md.s...
compiling stm32f10x_wwdg.c...
".\Objects\Template.axf" - 1 Error(s), 0 Warning(s).
Target not created.
Build Time Elapsed: 00:00:08

原因是没有找到文件stm32_eval.h,修改main.c文件,将不需要的内容删除,修改后的main.c文件如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/* Includes ------------------------------------------------------------------*/
#include "stm32f10x.h"
#include <stdio.h>


/* Private functions ---------------------------------------------------------*/

/**
* @brief Main program.
* @param None
* @retval None
*/
int main(void)
{
/* Infinite loop */
while (1)
{
}
}

重新编译工程,依然有错:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Rebuild started: Project: Template
*** Using Compiler 'V5.06 update 6 (build 750)', folder: 'C:\Keil_v5\ARM\ARMCC\Bin'
Rebuild target 'Template'
...
compiling stm32f10x_wwdg.c...
linking...
.\Objects\Template.axf: Error: L6200E: Symbol SystemCoreClock multiply defined (by system_stm32f10x_1.o and system_stm32f10x.o).
.\Objects\Template.axf: Error: L6200E: Symbol AHBPrescTable multiply defined (by system_stm32f10x_1.o and system_stm32f10x.o).
.\Objects\Template.axf: Error: L6200E: Symbol SystemInit multiply defined (by system_stm32f10x_1.o and system_stm32f10x.o).
.\Objects\Template.axf: Error: L6200E: Symbol SystemCoreClockUpdate multiply defined (by system_stm32f10x_1.o and system_stm32f10x.o).
Not enough information to list image symbols.
Not enough information to list load addresses in the image map.
Finished: 2 information, 0 warning and 4 error messages.
".\Objects\Template.axf" - 4 Error(s), 0 Warning(s).
Target not created.
Build Time Elapsed: 00:00:07

原因是system_stm32f10x.c文件重复,在CMSIS中和USER中都有一份,我们需要将USER中的system_stm32f10x.c文件移除出工程,点击Manager Project Items,选择USER Group,选择USER里的stm32f10x.c然后点击删除按钮。完成后点击OK。

remove stm32f10x.c from user group

重新编译工程,此时没有报错了:

1
2
3
4
5
6
7
8
9
10
11
12
Rebuild started: Project: Template
*** Using Compiler 'V5.06 update 6 (build 750)', folder: 'C:\Keil_v5\ARM\ARMCC\Bin'
Rebuild target 'Template'
compiling core_cm3.c...
...
compiling stm32f10x_usart.c...
assembling startup_stm32f10x_md.s...
compiling stm32f10x_wwdg.c...
linking...
Program Size: Code=856 RO-data=268 RW-data=20 ZI-data=1636
".\Objects\Template.axf" - 0 Error(s), 0 Warning(s).
Build Time Elapsed: 00:00:07

保存工程作为以后开发的模板工程,下次开发新项目时复制一份出来可以直接在这上面开发了。

测试工程文件


编辑main.c文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
/**
******************************************************************************
* @file Project/STM32F10x_StdPeriph_Template/main.c
* @author Junle
* @version V3.5.0
* @date 27-April-2020
* @brief Main program body
******************************************************************************
* @attention
*
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
*
* <h2>&copy; COPYRIGHT 2011 STMicroelectronics</h2>
******************************************************************************
*/

/* Includes ------------------------------------------------------------------*/
#include "stm32f10x.h"
#include <stdio.h>


/* Private functions ---------------------------------------------------------*/
void LED_GPIO_Config(void); //配置GPIO
void Delay(__IO u32 nCount); //延时函数


/**
* @brief 配置GPIO.
* @param None
* @retval None
*/
void LED_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); // 开启GPIOB时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //定义要使用的pin
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //复用功能的推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化GPIO
}


/**
* @brief 延时函数.
* @param None
* @retval None
*/
void Delay(__IO u32 nCount)
{
for(; nCount != 0; nCount--);
}


/**
* @brief Main program.
* @param None
* @retval None
*/
int main(void)
{
SystemInit();
LED_GPIO_Config();
/* Infinite loop */
while (1)
{
GPIO_ResetBits(GPIOB, GPIO_Pin_10);
Delay(0x400000);
GPIO_SetBits(GPIOB, GPIO_Pin_10);
Delay(0x400000);
}
}


/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/

点击Options for Target按钮(魔术棒)选择Output设置页,勾选Create HEX File然后点击OK,重新编译工程,完成后在工程文件夹下会生产Objects文件夹,HEX文件会存放在该文件夹中。

Create HEX File

将LED和电阻串联连接到开发板的PB10引脚:

接线图

下载HEX文件到STM32F103C8T6开发板,运行效果:

运行效果

LED灯闪烁,说明我们手动创建的工程文件可用。

作者

Junle

发布于

2020-04-27

更新于

2024-03-22

许可协议

评论