三、创建工程模板
创建完成的工程模板可以直接下载使用:
文件在百度网盘中的:立创·STM32F103C8T6开发板资料(标准库)-> 第03章软件资料 -> 空白工程模板
1. 前提条件
- 已经安装好KeilMDK软件
- 已经安装好STM32F1xx的Pack包
2. 标准固件库获取
如果没有账号,可以注册一个。
3. 标准固件库介绍
3.1 文件夹介绍
打开下载的STM32F10x标准固件库,里面的目录如图所示。
- Libraries:此文件夹里面有3个文件夹,包含CMSIS和标准外设库,存放官方封装的一些库函数,方便用户开发使用。
- Project:此文件夹是工程模板文件夹和官方编写的示例代码,涉及芯片的大部分功能。
- Utilities:此文件夹包含一些第三方组件和STM32配套的开发板文件。
3.2 Project
Examples文件夹,内容如图所示。
从上图中可以看出,这个文件夹里是各种外设资源的例程,每个文件夹里面还有更为详细的功能示例,对我们开发具有很高的参考价值。我们一定要多看,多读,多用。
3.3 Libraries
打开Libraries文件夹之后,内容如图所示。
- CMSIS:微控制器软件接口标准(CMSIS:Cortex Microcontroller Software Interface Standard) 是Cortex-M处理器系列的与供应商无关的硬件抽象层。
- STM32F10x_StdPeriph_Driver: 从名称也可以看出,这个是STM32F10系列的标准外设库,存放一些封装了寄存器的库函数,我们后面编程也是依赖于这个库进行开发,覆盖STM32F10芯片的绝大部分功能。
3.4 Utilities
这个是第三方组件文件夹,我们不必太关注。
4. 创建标准固件库模板
4.1 新建工程目录
新建文件夹,命令为 STM32F103C8T6_ProjectTemplate,用来保存新创建的工程。
然后在该文件夹下新建6个文件夹,分别命名为:
- project: 存放工程文件(目前只支持MDK5)。
- libraries:存放各种库文件,CMSIS,芯片固件库,文件系统库,网络库等。
- board:存放和板子初始化和链接文件。
- app: 存放应用程序,由用户编写和放main函数。
- bsp:存放和底层相关的支持包。
- module:主要存放各种软件模块,比如软件定时器,PID,FIFO,状态机等。
然后在 project文件夹 下新建一个文件夹:MDK(V5)
在STM32F103C8T6_ProjectTemplate文件夹下新建一个README.md文件,如图所示。
4.2 拷贝工程文件
找到我们的固件库的下载目录,将 STM32F10x_StdPeriph_Lib_V3.6.0\Libraries 文件夹下的内容全部拷贝到新建目录的 libraries 下。
找到 \STM32F10x_StdPeriph_Lib_V3.6.0\Project\STM32F10x_StdPeriph_Template 下面的:
- stm32f10x_conf.h
- stm32f10x_it.c
- stm32f10x_it.h
复制到 module文件夹 下
我们将board和bsp文件夹,拖到 STM32F103C8T6_ProjectTemplate 文件夹中替换。
board和bsp文件夹在百度网盘中的空白工程模板压缩包中可以找到!
【本篇开头有链接】
4.3 新建Keil工程
在上面建立的project
文件夹里面创建一个MDK(V5)
文件夹用来存放keil MDK ARM V5
版本的工程文件。 打开Keil uVision5
创建一个新的工程:Project
->New uVision Project
-> 选好芯片型号STM32F103C8
。
4.4 创建分组并添加源文件
右键 Target
->单击 Manage Project Items
如下所示设计分组(双击可以修改名字):
将\libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\arm
目录下的startup_stm32f10x_md.s
(启动文件)添加到STARTUP组里(注意最后要点击对话框左下角的OK按钮才能生效)
启动文件使用汇编写的,他是上电或复位后执行的第一段代码:
- 设置堆栈大小和PC指针。
- 配置中断向量表:设置中断向量表的位置,这样当中断发生时,CPU能够找到相应的中断服务程序。
- 定义中断服务例程的默认处理函数:通常会定义一个默认的中断处理函数,当未定义特定的中断处理函数时,会调用这个默认函数。在某些启动文件中,都是了弱定义的中断处理函数,允许我们在其C代码中重定义。
- 系统时钟初始化。
- 跳转到c语言的main函
将\libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x
目录下的system_stm32f10x.c
添加到APP组里面:
将\libraries\STM32F10x_StdPeriph_Driver\src
目录下的所有文件添加到Driver组里面:
添加\libraries\CMSIS\CM3\CoreSupport
目录下的com3
文件到Driver组下面:
添加\board
目录下的board.c
文件到Board组中去。
添加\bsp\uart
目录下的bsp_uart.c
文件到BSP组中。
添加README.md
文件到DOC目录下去。(注意:文件类型一定要选择 All files 才可以看得到.md后缀的文件)
然后我们新建一个main.c
文件,添加到APP目录中。
4.5 添加头文件路径
根据上面gif动图
的示例,将下面图片中的路径都添加进去!
4.6 配置工程
点击魔法棒弹出页面
- 使用
微库
- 版本使用
AC5
- 勾选
Create HEX File
使其编译生成HEX
文件
- C语言使用
C99标准
- 添加
全局宏定义
- 优化等级调为
0
4.7 编译测试
将main.c中的代码替换为:
/*
* 立创开发板软硬件资料与相关扩展板软硬件资料官网全部开源
* 开发板官网:www.lckfb.com
* 技术支持常驻论坛,任何技术问题欢迎随时交流学习
* 立创论坛:https://oshwhub.com/forum
* 关注bilibili账号:【立创开发板】,掌握我们的最新动态!
* 不靠卖板赚钱,以培养中国工程师为己任
* Change Logs:
* Date Author Notes
* 2024-03-26 LCKFB-LP first version
*/
#include "stm32f10x.h"
#include "board.h"
#include "bsp_uart.h"
#include "stdio.h"
int main(void)
{
board_init();
uart1_init(115200);
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_ResetBits(GPIOC,GPIO_Pin_13);
while(1)
{
GPIO_SetBits(GPIOC, GPIO_Pin_13);
printf("LED ON!\r\n");
delay_ms(500);
GPIO_ResetBits(GPIOC, GPIO_Pin_13);
printf("LED OFF!\r\n");
delay_ms(500);
}
}
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
我们点击编译
发现0错误,0警告,这样我们的工程模板就完成了!