创建STM32F103C8T6极简式标准库工程模板


ChangeCode
原创
发布时间: 2025-12-10 12:20:34 | 阅读数 0收藏数 0评论数 0
封面
本文聚焦 STM32F103C8T6 芯片,提供一套极简风格的标准库工程模板搭建方案,借鉴江科大模板的精简设计思路。内容从固件库准备、工程目录规划、Keil 环境配置,到库函数集成与编译验证,全程步骤清晰、无冗余操作,新手可按流程快速搭建出轻量化、可直接开发的标准库工程,为后续外设驱动开发筑牢基础。

准备工作:

材料:

1. STM32F103工程的本质

STM32F103工程是一个包含硬件配置、代码逻辑、编译链接规则的完整开发环境集合。其核心作用是将开发者编写的应用代码与STM32F103的硬件资源关联,通过编译器(如Keil MDK、IAR)生成可烧录到芯片中的二进制文件。一个规范的工程需包含启动文件、库文件、用户代码、配置文件等部分,确保代码可编译、可调试且能稳定运行。

1. 开发中常用的各类库文件

库文件是STM32开发的“桥梁”,用于简化对芯片底层硬件的操作。不同库的封装程度与使用场景差异显著,主流包括寄存器库、标准库、HAL库及FF库,具体特点如下:

  1. 寄存器库(裸机操作库):最底层的操作方式,直接通过读写STM32F103的寄存器来控制硬件外设(如GPIO、USART、TIM等)。其核心是寄存器地址定义与位操作宏,无额外封装,代码执行效率高,但开发难度大,需熟记寄存器功能,适合对硬件底层有深入理解的开发者或对代码体积、执行速度有严苛要求的场景。
  2. 标准库(STD Library):ST公司针对STM32F1系列推出的底层封装库,基于寄存器操作进行了函数级封装(如GPIO_Init()、USART_SendData()),屏蔽了复杂的寄存器细节,同时保留了较高的执行效率。标准库的函数命名规范、接口清晰,是STM32F103开发的经典选择,目前仍被大量项目采用,但ST已不再对其进行更新维护。
  3. HAL库(Hardware Abstraction Layer):ST公司推出的跨平台硬件抽象层库,采用更高层次的封装,实现了对不同STM32系列芯片的兼容(如F1、F4、L4等)。HAL库提供了丰富的API函数与回调机制,支持CubeMX图形化配置工具,能极大简化工程搭建流程,降低开发门槛,适合快速开发及跨系列芯片迁移的项目,但由于封装层次高,代码执行效率略低于标准库。
  4. FF库(FatFs Library):并非ST官方提供的芯片控制库,而是第三方开发的通用文件系统库,用于实现STM32F103对SD卡、U盘等存储设备的文件读写操作(如创建文件、读取数据)。FF库具有轻量、可配置的特点,常作为辅助库集成到STM32工程中,实现数据的持久化存储。
ZIP
江科大_STM32Template_寄存器模板.zip
237.89KB
RAR
江科大_STM32Template_库函数模板.rar
493.51KB
PACK
Keil.STM32W1xx_DFP.1.0.0.pack
4.09MB
PACK
Keil.STM32L1xx_DFP.1.2.0.pack
22.39MB
PACK
Keil.STM32L0xx_DFP.1.6.0.pack
31.22MB
PACK
Keil.STM32F4xx_DFP.1.0.8.pack
34.78MB
PACK
Keil.STM32F1xx_DFP.2.2.0.pack
48.18MB
PACK
Keil.STM32L4xx_DFP.1.4.0.pack
61.01MB
PACK
Keil.STM32F0xx_DFP.2.0.0.pack
63.62MB

工具:

主流工程模板解析与选择

STM32F103的工程搭建核心基于ST标准库(入门首选,HAL库因封装层次高导致复杂度更高),江科大野火正点原子普中嘉立创五家机构的工程差异,本质是文件组织形式、代码精简度、外设封装程度及教学导向的不同,而非核心库本身的差异——各家模板均基于ST官方库开发,核心功能保持一致。

这种差异是机构为适配自身开发板硬件特性与目标用户(如新手、进阶开发者)需求而做的针对性优化。


维度

江科大

正点原子

野火

普中

嘉立创

文件夹分层

极简(3 层)

多层(工程化)

标准化分层(多编译器)

基础分层(3 层)

极简(3 层)

封装程度

无封装(原生库)

深度封装(自有层)

轻量封装(易踩坑点)

少量封装(板载适配)

无封装(原生库)

标准库完整性

仅保留必需文件

完整保留

完整保留

常用外设保留

常用外设保留

适配芯片 / 开发板

F103C8T6(通用)

F103 全系列(原子板)

F103 全系列(野火板)

普中自家 F103 板

立创 F103 最小系统板

新手友好度

★★★★★(零门槛)

★★★☆☆(需理解封装)

★★★★☆(规范易理解)

★★★★☆(抄就能跑)

★★★★★(极简适配)

工程拓展性

★☆☆☆☆(仅适配 C8T6)

★★★★★(全库拓展)

★★★★☆(多编译器 / 全库)

★☆☆☆☆(仅适配普中板)

★★☆☆☆(仅适配立创板)

适配场景

纯新手入门(学库函数)

进阶学习(工程化项目)

贴近企业开发(规范)

纯新手实操(跟板学)

立创生态用户(快验证)

江科大模板的核心优势是「极致精简、聚焦核心」—— 无冗余文件、无额外封装,新手能直接看到「库函数→硬件操作」的对应关系,是从零搭建专属工程的最佳参考蓝本。以下以主流的 STM32F103C8T6 为例,拆解「复刻江科大风格 + 自定义适配」的完整步骤,全程贴合新手认知逻辑。


ZIP
STM32F10x_StdPeriph_Lib_V3.5.0.zip
21.17MB
1

准备标准库固件包

获取 STM32F10x_StdPeriph_Lib_V3.5.0 标准库压缩包,为工程搭建备齐基础文件。

ZIP
STM32F10x_StdPeriph_Lib_V3.5.0.zip
21.17MB
2

解压固件库

解压压缩包,初步浏览根目录下各文件夹(图片文件夹、Libraries 等)的分布情况。

3

忽略无用图片文件夹

根目录第一个文件夹中是两张图片,无需后续操作,没啥用,直接跳过

4

库函数目录

第二个 Libraries 文件夹包含工程所需的核心库函数文件,是后续重点操作目录,之后创建工程的时候会用的到

5

官方工程示例

打开 Project 文件夹,该目录下存放官方工程示例与模板,可作为后续开发参考

6

评估板例程

浏览 Utilities 文件夹,其内为 STM32 官方评估板的测评程序,该评估板就是官方用STM32做的一个小电路板,用来测评STM32,暂不涉及核心配置

7

库文档说明

接下来后面两个文件,一个是库函数的发布文档,一个是使用手册

  1. 发布文档里有一些版本的说明
  2. 使用手册里有教怎么使用这个库函数
8

创建工程主目录

首先,我们需要先建立一个存放工程的文件夹,比如在D盘、E盘等位置,起个名字,叫 STM32Project ,以后的工程都存在这个文件夹下,这样比较方便管理

9

Keil5 新建工程

打开keil5软件,点击 project → New vVision Project

10

创建工程子目录

然后选择刚才新建的文件夹,再次新建一个文件夹用来存放本次的工程,起个名字,叫做 STM32Template专门存放本次工程文件

11

命名并保存工程

进入新建的 STM32Template 文件夹,起个工程名,叫 Project,然后点击保存

在这里,可以起个通用一点的名字,文件实的名称是很方便改的,这个各称以后不太方便改,所以就起个 Project 的名称

12

选择目标芯片型号

选择器件型号,我们的芯片型号是 STM32F103C8T6,所以这里选择 STM32F103C8 这个,点击 OK

13

关闭工程小助手

这里弹出的是 Keil 软件的一个新建工程小助手,这个可以帮助我们快速新建工程,但现在我们暂时不用这个小助手,把它 ×

14

初始工程状态

接下来工程就建好了,但是这里的工程文件是空空如也,现在这个工程还是不能直接用的,我们需要给它添加一点工程的必要文件

15

查找启动文件路径

打开固件库的文件夹,打开STM32F10x_StdPeriph_Lib_V3.5.0Libraries CMSIS CM3 DeviceSupport STSTM32F10x startup arm

这些就是STM32的启动文件,STM32的程序就是从启动文件开始执行的

16

创建 Start 文件夹存启动文件

把这些文件全部都复制下来,然后回到工程模板文件夹里,新建一个文件夹,叫做 Start ,然后把启动文件粘贴到这里面

17

提取寄存器与时钟文件

回到固件库的 STM32F10x 文件夹下

stm32f0xh:是STM32的外设寄存器描述文件,它的作用就跟51单片机的头文件 REGX52.h 一样,是用来描述 STM32 有哪些寄存器和它对应的地址的

system_stm32f10x.csystem_stm32f10x.h :这两个 system 文件是用来配置时钟的,STM32 主频 72MHZ,就是 system 文件里的函数配置的

18

复制核心文件至 Start

复制这三个文件(stm32f10x.h、system_stm32f10x.c、system_stm32f10x.h),粘贴到Start文件夹下

19

查找内核寄存器文件

返回 CM3 文件夹,进入 CoreSupport 目录,定位 Cortex-M3 内核相关文件

20

提取内核核心文件

打开CoreSupport

这两个cm3(Cortex-M3)文件就是内核的寄存器描述,他还带了一些内核的配置函数,所以多了个 .c 文件

21

复制内核文件至 Start

复制 core_cm3.ccore_cm3.h 文件,粘贴到 Start 文件夹下

22

Keil 中创建 Start 文件组

回到 keil 软件,把刚才复制的那些文件添加到工程里来,点击选中 Source Group 1 进行改名,改为 Start

23

向 Start 组添加文件

右键Start,选择 Add Existing Files to Group 'start'... (或者直接双击Start)

24

设置文件类型为所有文件

打开Start文件夹,把下边的文件类型选择为ALL Files(*.*)

25

选中并添加 Start 组文件

添加启动文件后缀为md.s的启动文件(startup_stm32f10x_md.s),然后将所有的.c和.h都添加进来,共6个文件,然后点击 close关闭,这样,Start中的文件就添加好了

选中文件后,点击add就可以添加了,

或者直接双击文件就可以添加

26

打开工程选项配置

最后我们还需要在工程选项里添加上这个文件夹的头文件路径,要不然软件是找不到h文件的,点击魔术棒按钮

27

进入 C/C++ 配置页


28

打开头文件路径配置

点击Include Paths右侧的 ...

29

新建头文件路径条目

在这里新建路径

30

添加 Start 文件夹路径

然后再点三个点的按钮,把Start的路径添加进来

31

确认头文件路径配置

点击OK返回,这样就把这个文件夹的头文件路径添加进来了

32

创建 User 文件夹

打开工程文件夹,新建文件夹,命名为 User

33

Keil 中创建 User 文件组

在Keil中,右键Target 1,点击 Add Group...(添加组),将New Group改名为 User

34

向 User 组添加新文件

在 User 上右键,点击Add New ltem to Group User'...(添加新文件到User中)

35

创建 main.c 文件

选择C文件,名字叫 main ,将路径改为User文件夹的路径,否则默认是放在文件夹外边的,点击add添加

36

引入 STM32 头文件

在main.c文件中,右键插入STM32头文件,选择 stm32f10x.h

37

编写基础 main 函数框架

main函数是一个int型返回值,void参数的函数

文件的最后一行必须是空行,否则会报警告

#include "stm32f10x.h" // Device header

int main(void)
{
while(1)
{
}
}

//注意:文件的最后一行必须是空行,否则会报警告
38

初步编译工程验证

点击 Build 按钮,编译并建立工程

39

验证寄存器工程有效性

如果提示0错误,0警告,说明创建的工程是没问题的

当前工程还没有添加STM32的库函数,所以它还是一个基于寄存器开发的项目工程,如果你想用寄存器开发STM32,那么工程创建到这里就可以了

40

准备寄存器点灯硬件

拿出STM32的最小系统板,烧录器ST-LINK V2,并接好线后插到电脑上

STM32

STLINK-V2

GND

GND

SWCLK

SWCLK

SWDIO

SWDIO

3V3

3V3


41

配置 Keil 调试器

接着需要配置一下调试器,在keil中点击魔术棒,选择Debug,调试器选择ST-Link Debugger

42

调试器参数设置

点击右侧的Settings按钮,选择 Flash Download,勾选Reset and Run,点击OK返回

勾上这一项之后,每次下载程序后,板子会自动复位并执行,非常的方便,不勾选的话,每次还得手动去复位,费时费力,要是忘了,还可能以为代码出问题了呢,我就闹过这样的乌龙

43

重新编译工程

重新编译一遍,确保没有错误和警告

44

下载程序至开发板

点击load下载程序到STM32板子中

45

寄存器配置点灯代码

接下来开始配置寄存器点灯

这种方式需要不断地查手册来了解每个寄存器的每一位都是干啥的,而且这个操作方式也有个弊端,就是我们把除了PC13之外的位都配置成了0,"这样就会影响到其他端口的原有配置,如果要做到只配置PC13而不影响其他位,"这样就会影响到其他端口的原有配置,如果要做到只配置PC13而不影响其他位,那还需要&=和|=的操作,所以这种寄存器的操作方式,虽然代码简洁,但是还是不太方便

#include "stm32f10x.h" // Device header

int main(void)
{
// 使能时钟(GPIOC的时钟)
RCC->APB2ENR = 0x00000010;
// 配置 PC13 口的模式
GPIOC->CRH = 0x00300000;
// PC13 板载灯亮
GPIOC->ODR = 0x00000000;
// PC13 板载灯灭
GPIOC->ODR = 0x00002000;
while(1)
{
}
}

46

创建 Library 文件夹

为工程添加库函数,打开工程文件夹,新建名为 Library 的文件夹,用来存放库函数

47

提取标准库源文件

打开固件库的文件夹,打开libraries → STM32F10x_StdPeriph_Driver → src

这些就是库函数的源文件:

  1. misc.c是内核的库函数
  2. 其他的是内核外的外设库函数
48

复制源文件至 Library

全选复制,粘贴到Library 文件夹下

49

提取标准库头文件

接着返回上一级目录,打开inc文件夹

这些是库函数的头文件

50

复制头文件至 Library

继续Ctrl+A全选,然后复制,粘贴到library文件夹下

51

Keil 中创建 Library 文件组

在keil软件中,右键Target 1,添加组

将New Group 改为 Library

52

向 Library 组添加库文件

接着,再右键,添加已经存在的文件

打开 Library ,全选,Add添加(注意文件类型是 All Files(*.*))

这样就把所有的库函数文件都添加进来了,但是对于这个库函数来说,现在还不能直接使用,我们需要再添加一个文件

53

提取标准库配置文件

打开固件库文件夹 → project → STM32F10x_StdPeriph_Template

  1. stm32f10x_conf.h:用来配置库函数头文件的包含关系,另外这里面还有个用来参数检查的函数定义,这是所有库函数都需要的
  2. stm32f10x_it.c 和 stm32f10x_it.h:用来存放中断函数的
54

复制配置文件至 User

复制这三个文件,粘贴到工程的User目录下

55

添加配置文件至 User 组

回到keil中,双击User,将刚才粘贴的三个文件都添加进来

56

查找标准库宏定义

还需要一个宏定义,右键头文件跳转

在Stm32f10x.h中找到 USE_STDPERIPH_DRIVER 语句,复制

这是一个条件编译,意思是如果你定义了 USE_STDPERIPH_DRIVER 这个字符串,下面这个 #include "stm32f10x_conf.h" 语句才有效

57

配置宏定义

打开keil魔术棒,选择C/C++,在Define栏中粘贴这个字符串,这样才能包含标准外设库,也就是库函数

58

添加 Library 头文件路径

添加头文件路径,点击Include Paths 栏的三个点 ...

将 User 和 Library 的路径都添加上

59

标准库工程搭建完成

至此,标准库工程就创建完毕了

60

最终编译验证

编译验证一下创建的工程是否有问题

0报错,0警告,这说明我们的工程建立是成功的

阅读记录0
点赞0
收藏0
禁止 本文未经作者允许授权,禁止转载
猜你喜欢
评论/提问(已发布 0 条)
评论 评论
收藏 收藏
分享 分享
pdf下载 下载
pdf下载 举报