乐于分享
好东西不私藏

STM32F103 标准库工程模板怎么建?把官方库、头文件路径和源码关系一次讲清楚

STM32F103 标准库工程模板怎么建?把官方库、头文件路径和源码关系一次讲清楚
在学习 STM32 的过程中,初学者往往不是被寄存器或 C 语言本身难住,而是对工程模板的结构和文件关系感到陌生。
标准库解压后,有 Libraries、Project、Utilities;
Keil 工程里,又有 CORE、FWLIB、USER、STARTUP、CMSIS。
网上教程里的目录命名还不统一,有的叫 CORE,有的叫 CMSIS,有的叫 USER,有的叫 APP。
看得越多,反而越乱。
其实创建 STM32 标准库工程模板,核心不是死记某个教程的步骤,而是搞清楚三个问题:
第一,官方标准库里到底有哪些东西?
第二,哪些文件必须放进自己的工程?
第三,Keil 里为什么既要添加源文件,又要配置 Include Paths?
只要这三个问题搞明白,后面创建 GPIO、USART、TIM、ADC、DMA 工程,思路就会清楚很多。
这篇文章以STM32F103C8T6 + 标准外设库 + Keil MDK为例,把标准库工程模板从头梳理一遍。

为什么要先认识标准库?

很多初学者创建 STM32 工程时,习惯直接照着教程复制文件。
这个做法短期能跑起来,但问题是:换一个芯片,不知道启动文件怎么选;换一个外设,不知道库函数文件在哪里;编译报错,不知道是头文件路径问题,还是源文件没加。
看到 STM32F10X_MD、USE_STDPERIPH_DRIVER,不知道这些宏到底从哪来。所以,学习 STM32 标准库,不能只会复制工程模板。标准库本质上是 ST 官方提供的一套开发工具箱。
你不需要一开始逐行读懂里面所有源码,但至少要知道:
(1)标准库有哪些主要目录;
(2)每个目录大概放什么内容;
(3)工程模板需要哪些文件;
(4)官方例程在哪里;
(5)库函数说明书在哪里;
(6)出问题时应该回到哪里查。
一句话:
先知道标准库有什么,再知道东西在哪里,最后用到哪里深入哪里。

官方标准库根目录怎么看?

首先,你需要从 ST 官方网站下载 STM32F10x 标准外设库(推荐最新稳定版本 V3.6.0):https://www.st.com.cn/zh/embedded-software/stsw-stm32054.html?utm_source

页面说明:下载页面包含版本信息、授权协议、用户手册(.chm)等资源,建议保留手册以便查阅函数说明。

解压后根目录如下:

以 STM32F10x_StdPeriph_Lib_V3.6.0 为例,解压后根目录如下:
STM32F10x_StdPeriph_Lib_V3.6.0├─ _htmresc                         ← HTML 文档资源,可跳过├─ Libraries                        ← 重点,工程所需库文件├─ Project                          ← 重点,官方模板和官方例程├─ Utilities                        ← 官方评估板支持包,普通开发板可跳过├─ Package_license.html             ← 授权说明,可跳过├─ Package_license.md               ← 授权说明,可跳过├─ Release_Notes.html               ← 版本说明,可跳过└─ stm32f10x_stdperiph_lib_um.chm   ← 标准库用户手册,建议保留
这里面初学者重点看三个东西:
LibrariesProjectstm32f10x_stdperiph_lib_um.chm
其中:
Libraries 是工程真正需要的库文件。Project   是官方模板和官方例程。stm32f10x_stdperiph_lib_um.chm 是标准库用户手册。

至于 _htmresc、授权文件、版本说明,前期知道它们存在即可,不需要重点研究。

Utilities 主要是 ST 官方评估板支持包,比如官方开发板上的 LCD、按键、LED 等板级资源。普通最小系统板或者自己画的板子,一般不需要重点使用。
所以,创建标准库工程模板时,最重要的一句话是:
重点看 Libraries 和 Project。

Libraries:工程真正需要的库文件

Libraries 是标准库最核心的目录。
它包含两部分:
Libraries├─ CMSIS└─ STM32F10x_StdPeriph_Driver
可以简单理解为:
CMSIS                         → 内核和芯片支持STM32F10x_StdPeriph_Driver    → STM32外设标准库驱动
再说得通俗一点:
CMSIS 让程序认识 Cortex-M3 内核和 STM32F10x 芯片。
StdPeriph_Driver 提供 GPIO、RCC、USART、TIM、ADC、DMA 等外设库函数。
一个负责底层基础,一个负责外设操作。

CMSIS:启动、内核、芯片和系统时钟

在 STM32F10x 标准库中,CMSIS 重点看这个路径:
Libraries└─ CMSIS   └─ CM3      ├─ CoreSupport       ← Cortex-M3 内核支持      └─ DeviceSupport     ← ST 芯片支持
1. CoreSupport
CoreSupport├─ core_cm3.c    ← Cortex-M3 内核支持源文件└─ core_cm3.h    ← Cortex-M3 内核支持头文件
这两个文件提供 Cortex-M3 内核相关支持,比如:
NVIC;SysTick;SCB内核寄存器访问;一些内核相关的基础定义。
简单理解:
core_cm3.c 和 core_cm3.h 是 Cortex-M3 内核支持文件。

2. DeviceSupport
DeviceSupport 里重点看:
DeviceSupport└─ ST   └─ STM32F10x      ├─ startup                 ← 启动文件目录      ├─ stm32f10x.h             ← STM32F10x 芯片总头文件      ├─ system_stm32f10x.c      ← 系统时钟初始化源文件      └─ system_stm32f10x.h      ← 系统时钟初始化头文件
这里面每个文件都很关键。
其中:
stm32f10x.h             ← 定义寄存器、外设基地址、中断号、芯片宏system_stm32f10x.c      ← 提供 SystemInit(),负责系统时钟初始化startup_xx.s            ← 复位后最先执行,最后进入 main()

启动文件应该怎么选?

Keil 使用的启动文件在:
STM32F10x└─ startup   └─ arm                          ← Keil MDK 使用这个目录      ├─ startup_stm32f10x_ld.s    ← 低容量芯片      ├─ startup_stm32f10x_md.s    ← 中容量芯片,STM32F103C8T6 常用      ├─ startup_stm32f10x_hd.s    ← 大容量芯片      ├─ startup_stm32f10x_xl.s    ← 超大容量芯片      └─ startup_stm32f10x_cl.s    ← 互联型芯片
这些文件不是随便选的,而是根据芯片容量和系列选择。
常见含义如下:
ld    → Low-density,低容量芯片md    → Medium-density,中容量芯片hd    → High-density,大容量芯片xl    → XL-density,超大容量芯片cl    → Connectivity line,互联型芯片
以 STM32F103C8T6 为例,它通常是 64KB Flash,属于中容量芯片,所以选择:startup_stm32f10x_md.s
这一步非常重要,启动文件选错,轻则编译异常,重则程序运行不正常。

标准外设库驱动目录:inc 和 src 分别干什么?

标准外设库驱动本体在:
Libraries└─ STM32F10x_StdPeriph_Driver   ├─ inc                     → 头文件目录   └─ src                     → 源文件目录   
展开后是这样:
Libraries└─ STM32F10x_StdPeriph_Driver   ├─ inc                         ← 外设驱动头文件目录   │  ├─ misc.h                   ← NVIC、SysTick 等辅助函数声明   │  ├─ stm32f10x_gpio.h         ← GPIO 头文件   │  ├─ stm32f10x_rcc.h          ← 时钟控制头文件   │  ├─ stm32f10x_usart.h        ← 串口头文件   │  ├─ stm32f10x_tim.h          ← 定时器头文件   │  ├─ stm32f10x_adc.h          ← ADC 头文件   │  ├─ stm32f10x_dma.h          ← DMA 头文件   │  └─ ...   │   └─ src                         ← 外设驱动源文件目录      ├─ misc.c                   ← NVIC、SysTick 等辅助函数实现      ├─ stm32f10x_gpio.c         ← GPIO 驱动实现      ├─ stm32f10x_rcc.c          ← RCC 驱动实现      ├─ stm32f10x_usart.c        ← USART 驱动实现      ├─ stm32f10x_tim.c          ← TIM 驱动实现      ├─ stm32f10x_adc.c          ← ADC 驱动实现      ├─ stm32f10x_dma.c          ← DMA 驱动实现      └─ ...
这里要重点理解:
inc 里面放的是 .h 头文件。
src 里面放的是 .c 源文件。
.h 文件主要负责声明,比如函数声明、结构体定义、宏定义。
.c 文件主要负责实现,也就是真正的函数代码。
举个例子:
函数声明:FWLIB\inc\stm32f10x_gpio.h
函数实现:FWLIB\src\stm32f10x_gpio.c
所以不能只复制 inc,也不能只配置头文件路径。
如果你要使用 GPIO 标准库函数,就不仅要让编译器找到 stm32f10x_gpio.h,还要让 stm32f10x_gpio.c 参与编译。
这也是很多初学者经常报错的地方。

Project:官方模板和官方例程

Project 目录也非常重要。
Project├─ STM32F10x_StdPeriph_Template  ← 官方标准库工程模板└─ STM32F10x_StdPeriph_Examples  ← 官方标准库外设例程
网上教程很多,但真正可靠的起点,还是官方模板和官方例程。
因为官方例程和标准库版本是匹配的,展示的是 ST 推荐的基本用法。
当网上资料说法不一致时,建议优先回到官方 Project 目录查。

官方模板里面有什么?

官方模板目录如下:
Project└─ STM32F10x_StdPeriph_Template   ├─ EWARM                  ← IAR Embedded Workbench 工程文件目录,使用 IAR 时参考   ├─ HiTOP                  ← HiTOP 工具链工程文件目录,普通 Keil 用户可跳过   ├─ MDK-ARM                ← Keil MDK 工程文件目录,使用 Keil 时重点看   ├─ RIDE                   ← RIDE 工具链工程文件目录,普通 Keil 用户可跳过   ├─ TrueSTUDIO             ← TrueSTUDIO 工程文件目录,普通 Keil 用户可跳过   │   ├─ LICENSE.txt            ← 模板工程授权说明,可了解,创建工程时不是必须文件   ├─ Release_Notes.html     ← 模板工程版本说明,可跳过   │   ├─ main.c                 ← 主函数模板,程序入口,实际项目通常要改成自己的 main.c   ├─ stm32f10x_conf.h       ← 标准库配置文件,决定包含哪些外设库头文件,重点   ├─ stm32f10x_it.c         ← 中断服务函数源文件,写 SysTick、USART、EXTI 等中断函数   ├─ stm32f10x_it.h         ← 中断服务函数头文件,声明中断函数   └─ system_stm32f10x.c     ← 系统时钟初始化文件,提供 SystemInit(),重点
这里面重点看:
STM32F10x_StdPeriph_Template├─ main.c                 ← 主函数模板├─ stm32f10x_it.c         ← 中断服务函数源文件├─ stm32f10x_it.h         ← 中断服务函数头文件├─ stm32f10x_conf.h       ← 标准库配置文件├─ system_stm32f10x.c     ← 系统时钟文件,模板中也提供一份
这里面最容易被忽略,但又非常关键的是:
stm32f10x_conf.h
/**  ******************************************************************************  * @file    Project/STM32F10x_StdPeriph_Template/stm32f10x_conf.h   * @author  MCD Application Team  * @version V3.6.0  * @date    20-September-2021  * @brief   Library configuration file.  ******************************************************************************  * @attention  *  * Copyright (c) 2011 STMicroelectronics.  * All rights reserved.  *  * This software is licensed under terms that can be found in the LICENSE file  * in the root directory of this software component.  * If no LICENSE file comes with this software, it is provided AS-IS.  *  ******************************************************************************  *//* Define to prevent recursive inclusion -------------------------------------*/#ifndef __STM32F10x_CONF_H#define __STM32F10x_CONF_H/* Includes ------------------------------------------------------------------*//* Uncomment/Comment the line below to enable/disable peripheral header file inclusion */#include"stm32f10x_adc.h"#include"stm32f10x_bkp.h"#include"stm32f10x_can.h"#include"stm32f10x_cec.h"#include"stm32f10x_crc.h"#include"stm32f10x_dac.h"#include"stm32f10x_dbgmcu.h"#include"stm32f10x_dma.h"#include"stm32f10x_exti.h"#include"stm32f10x_flash.h"#include"stm32f10x_fsmc.h"#include"stm32f10x_gpio.h"#include"stm32f10x_i2c.h"#include"stm32f10x_iwdg.h"#include"stm32f10x_pwr.h"#include"stm32f10x_rcc.h"#include"stm32f10x_rtc.h"#include"stm32f10x_sdio.h"#include"stm32f10x_spi.h"#include"stm32f10x_tim.h"#include"stm32f10x_usart.h"#include"stm32f10x_wwdg.h"#include"misc.h"/* High level functions for NVIC and SysTick (add-on to CMSIS functions) *//* Exported types ------------------------------------------------------------*//* Exported constants --------------------------------------------------------*//* Uncomment the line below to expanse the "assert_param" macro in the    Standard Peripheral Library drivers code *//* #define USE_FULL_ASSERT    1 *//* Exported macro ------------------------------------------------------------*/#ifdef  USE_FULL_ASSERT/**  * @brief  The assert_param macro is used for function's parameters check.  * @param  expr: If expr is false, it calls assert_failed function which reports   *         the name of the source file and the source line number of the call   *         that failed. If expr is true, it returns no value.  * @retval None  */  #define assert_param(expr) ((expr) ? (void)0 : assert_failed((uint8_t *)__FILE__, __LINE__))/* Exported functions ------------------------------------------------------- */  voidassert_failed(uint8_t* file, uint32_t line);#else  #define assert_param(expr) ((void)0)#endif/* USE_FULL_ASSERT */#endif/* __STM32F10x_CONF_H */
它决定标准库包含哪些外设头文件。
例如你要用 GPIO、RCC、USART,通常就会在 stm32f10x_conf.h 中包含对应头文件:
#include"stm32f10x_gpio.h"#include"stm32f10x_rcc.h"#include"stm32f10x_usart.h"
所以 stm32f10x_conf.h 可以理解为:
标准外设库的配置入口文件。

官方例程怎么用?

官方例程目录一般按外设分类:
STM32F10x_StdPeriph_Examples├─ GPIO├─ USART├─ TIM├─ ADC├─ DMA├─ SPI├─ I2C├─ EXTI├─ NVIC├─ RCC├─ SysTick└─ ...
用到哪个外设,就优先看哪个目录。
比如:
学 GPIO,就看 GPIO;
学串口,就看 USART;
学定时器,就看 TIM;
学 ADC,就看 ADC;
学 DMA,就看 DMA。
这比到处搜零散代码更靠谱,因为官方例程至少能保证:
库版本匹配;
函数调用方式规范;
文件依赖关系清楚;
适合作为入门参考。

推荐工程文件夹和工程名

创建自己的模板工程时,建议命名清楚,不要太随意,我推荐使用:
STM32F103C8T6_StdPeriph_Template
这个名字一眼能看出三件事:
STM32F103C8T6     → 目标芯片StdPeriph         → 基于标准外设库Template          → 工程模板
Keil 工程名也可以保持一致:
STM32F103C8T6_StdPeriph_Template.uvprojx
后续如果基于模板复制出具体项目,可以这样命名:
STM32F103C8T6_LED
STM32F103C8T6_USART
STM32F103C8T6_ADC_DMA
STM32F103C8T6_TIM_PWM
命名原则可以总结为:
芯片型号_库类型_功能
或者模板工程使用:
芯片型号_库类型_Template
例如:
STM32F103C8T6_StdPeriph_Template
STM32F103ZET6_StdPeriph_Template
STM32F407ZGT6_HAL_Template
命名不需要花哨,但一定要清楚。后面项目多了以后,清晰命名能省很多事。

推荐工程模板目录

建议最终整理成下面这套结构。其中,前面几个源码目录需要我们手动创建:
STM32F103C8T6_StdPeriph_Template├─ CORE                 ← 手动创建:启动文件、CMSIS、芯片支持、系统时钟├─ FWLIB                ← 手动创建:ST 官方标准外设库(Firmware Library,固件库)│  ├─ inc               ← 手动创建/复制:标准库头文件│  └─ src               ← 手动创建/复制:标准库源文件├─ USER                 ← 手动创建:main.c、中断文件、stm32f10x_conf.h├─ HARDWARE             ← 手动创建:自己写的板级驱动,如 LED、KEY、USART└─ SYSTEM               ← 手动创建:delay、sys 等通用工具
官方文件和自己工程目录的对应关系可以这样理解:
官方 CMSIS\CoreSupport                         → CORE官方 CMSIS\DeviceSupport\ST\STM32F10x          → CORE官方 CMSIS\...\startup\arm                     → CORE官方 STM32F10x_StdPeriph_Driver\inc/src        → FWLIB官方 Template 中的 main.c、it.c、conf.h         → USER自己写的 led.c、key.c、usart.c                  → HARDWARE自己写的 delay.c、sys.c                         → SYSTEM

然后,使用 Keil 新建工程、编译工程后,会自动生成一些工程文件和输出目录,例如:

STM32F103C8T6_StdPeriph_Template├─ Objects              ← Keil 自动生成:编译输出,如 .o、.axf、.hex├─ Listings             ← Keil 自动生成:编译列表文件├─ DebugConfig          ← Keil 自动生成:调试配置├─ RTE                  ← Keil 自动生成:运行环境相关文件,部分工程会出现├─ STM32F103C8T6_StdPeriph_Template.uvprojx  ← Keil 自动生成:工程文件└─ STM32F103C8T6_StdPeriph_Template.uvoptx   ← Keil 自动生成:工程选项文件

如果你在 Keil 里把输出目录改成 OBJ,那也可以是:

OBJ                   ← Keil 编译输出目录,通常由 Keil 生成或按工程配置生成

但对初学者来说,更建议顺着 Keil 默认名字写:

ObjectsListings
有些教程会把 Keil 工程分组写成:
STARTUPCMSISFWLIBUSER
这也没问题,本质上只是分组方式不同,如果按照本文目录,CORE 其实可以理解为:
CORE = STARTUP + CMSIS + system_stm32f10x
目录名字可以不同,但职责必须清楚。

创建工程模板的具体步骤

下面开始正式创建工程模板。
第 1 步:新建工程文件夹
新建文件夹:
STM32F103C8T6_StdPeriph_Template

这个名字表示:

STM32F103C8T6  ← 目标芯片StdPeriph      ← 使用标准外设库Template       ← 工程模板

在模板根目录下,手动创建这些源码组织目录:

STM32F103C8T6_StdPeriph_Template├─ CORE├─ FWLIB│  ├─ inc│  └─ src├─ USER├─ HARDWARE└─ SYSTEM

注意:这里只需要手动创建源码目录。下面这些不要急着手动创建:

ObjectsListingsDebugConfigRTE.uvprojx.uvoptx

这些一般由 Keil 新建工程或编译工程时自动生成。


第 2 步:复制 CORE 文件
从官方库中复制以下文件到 CORE:
CORE├─ core_cm3.c├─ core_cm3.h├─ stm32f10x.h├─ system_stm32f10x.c├─ system_stm32f10x.h└─ startup_stm32f10x_md.s
对于 STM32F103C8T6,启动文件使用:
startup_stm32f10x_md.s
因为 STM32F103C8T6 属于中容量芯片。

第 3 步:复制 FWLIB 文件
把官方标准外设库驱动复制到 FWLIB。
对应关系如下:
官方 STM32F10x_StdPeriph_Driver\inc    → 工程 FWLIB\inc官方 STM32F10x_StdPeriph_Driver\src    → 工程 FWLIB\src
最终目录如下:
FWLIB├─ inc│  ├─ stm32f10x_gpio.h│  ├─ stm32f10x_rcc.h│  ├─ stm32f10x_usart.h│  └─ ...└─ src├─ stm32f10x_gpio.c├─ stm32f10x_rcc.c├─ stm32f10x_usart.c└─ ...
初学阶段可以把 src 里的 .c 文件全部加入工程,省得漏文件,后期项目成熟后,也可以只加入实际使用到的外设源文件。

第 4 步:复制 USER 文件
从官方模板复制或自己创建以下文件:
USER├─ main.c├─ stm32f10x_it.c├─ stm32f10x_it.h└─ stm32f10x_conf.h
注意:
官方模板中的 main.c 可能包含官方评估板相关代码,比如 LCD、LED、串口打印等,如果你用的是普通最小系统板,建议把 main.c 改成干净版本。
例如:
#include"stm32f10x.h"intmain(void){    while (1)    {    }}
先保证工程能干净编译通过,再逐步添加 LED、按键、串口等功能。

第 5 步:新建 Keil 工程
打开 Keil,新建工程,选择芯片:STM32F103C8

这是 Keil 的 Manage Run-Time Environment 窗口,简称 RTE 管理窗口。它的作用是让你选择 Keil Pack 里的组件,比如:

CMSISDeviceFile SystemNetworkUSBBoard Support

也就是说,它主要服务于 Keil Pack / CMSIS-Pack 组件化工程因为我们现在创建的是传统标准库工程模板,不是用 Keil Pack 自动生成组件的工程,所以直接关闭就可以了。此时可以看到工程根目录下,由 Keil 新建工程或编译工程时自动生成了一些文件。

你现在看到的是:
Project: STM32F10x_StdPeriph_Template└─ Target_1   └─ Source Group 1
Source Group 1 是 Keil 默认生成的分组。你可以把它删掉或重命名,然后在 Target_1 下面建立我们需要的分组:
Target_1├─ CORE├─ FWLIB├─ USER├─ HARDWARE└─ SYSTEM
注意:这些是 Keil 工程里的 Group,属于虚拟分组,不一定等于 Windows 真实文件夹。但我们建议让它和真实目录同名,这样最清楚:
真实文件夹 CORE     ↔ Keil Group CORE真实文件夹 FWLIB    ↔ Keil Group FWLIB真实文件夹 USER     ↔ Keil Group USER真实文件夹 HARDWARE ↔ Keil Group HARDWARE真实文件夹 SYSTEM   ↔ Keil Group SYSTEM
操作上一般是:
右键 Target_1→ Manage Project Items→ 在 Groups 里删除 Source Group 1 或重命名→ 添加 CORE、FWLIB、USER、HARDWARE、SYSTEM或者右键 Source Group 1,先把它重命名成 CORE,再继续添加其他 Group
如果想更贴近传统教程,也可以在 Keil 里建:
STARTUPCMSISFWLIBUSER
但建议真实文件目录仍然保持前面那套结构,避免后期混乱。
这一步只是建立了 Keil 的“虚拟分组”,接下来还要往各组里添加对应源码文件。

第 6 步:向 Keil 添加源文件
这里非常关键,需要添加到 Keil 工程中参与编译的,主要是:
.c 文件.s 文件
例如:
CORE├─ startup_stm32f10x_md.s├─ core_cm3.c└─ system_stm32f10x.cFWLIB├─ misc.c├─ stm32f10x_gpio.c├─ stm32f10x_rcc.c├─ stm32f10x_usart.c├─ stm32f10x_tim.c└─ ...USER├─ main.c└─ stm32f10x_it.c
.h 文件通常不需要单独添加到 Keil 工程里参与编译,但是,.h 文件所在目录必须配置到 Include Paths 中,这两件事一定要分清楚。
HARDWARE 和 SYSTEM 现在空着没问题,后面你写 led.cdelay.c 等模块时再添加。

为什么创建了文件夹,还要导入 Keil?

很多初学者会误以为:我已经在 Windows 里创建了 CORE、FWLIB、USER 文件夹,也把文件复制进去了,Keil 应该自动知道。
实际上不会。
Windows 文件夹只是负责存放文件。
Keil 工程文件负责记录:
哪些 .c 文件参与编译;
哪个 .s 启动文件参与编译;
头文件应该去哪些目录查找;
编译输出放在哪里;
使用哪些宏定义。
所以创建工程时必须做两件事:
(1)把 .c / .s 文件添加到 Keil 工程分组中;
(2)把头文件目录添加到 Include Paths 中。
这两件事一个都不能少。

Include Paths 到底是什么?

Keil 路径:Options for Target -> C/C++ -> Include Paths
Include Paths 指的是头文件搜索路径。
它的作用是告诉编译器:
当代码中出现:#include "xxx.h" 时,应该去哪些文件夹里找这个头文件。
比如 main.c 中写:
#include"stm32f10x.h"#include"led.h"
编译器就会去 Include Paths 中列出的目录里查找:
stm32f10x.hled.h
常见需要添加:
..\CORE..\USER..\FWLIB\inc
如果你自己写了模块,比如:
HARDWARE\LED\led.hSYSTEM\delay\delay.h
那么也要把对应目录加进去:
..\HARDWARE\LED..\SYSTEM\delay
一句话:
Include Paths 的作用,是解决 .h 头文件去哪里找的问题。

Include Paths 不是添加源文件

这里一定要讲清楚,配置 Include Paths,不等于把源文件加入工程。比如你在 main.c 中写:
#include"stm32f10x_gpio.h"GPIO_Init(GPIOC, &GPIO_InitStructure);
这里会经历两个阶段。

1. 编译阶段
编译器需要找到:stm32f10x_gpio.h
所以必须把下面路径加入 Include Paths:..\FWLIB\inc
这样编译器才能看到 GPIO_Init() 的函数声明。

2. 链接阶段
链接器还需要找到 GPIO_Init() 的真正实现。
它的实现一般在:FWLIB\src\stm32f10x_gpio.c
所以必须把:stm32f10x_gpio.c
加入 Keil 工程参与编译。
否则就可能出现:Undefined symbol GPIO_Init
原因是:编译器知道有 GPIO_Init() 这个函数声明,但链接器找不到它的函数实现。

3. 一句话总结
Include Paths:解决 .h 去哪里找
Add Source File:解决 .c 是否参与编译
不能只加头文件路径,不加源文件。
否则可能出现:编译阶段通过;链接阶段报错。
这就是很多初学者遇到 Undefined symbol 的根本原因。

配置 Define 宏

Keil 路径:Options for Target -> C/C++ -> Define
对于常见 STM32F103C8T6 标准库工程,通常填写:
USE_STDPERIPH_DRIVER, STM32F10X_MD
这两个宏非常重要。
USE_STDPERIPH_DRIVER    → 启用标准外设库STM32F10X_MD            → 选择 STM32F10x 中容量芯片
普通最小系统板不要随便添加:USE_STM32100E_EVAL
这是 ST 官方评估板相关宏,如果你不是用官方评估板,乱加这类宏,可能会引入不需要的板级支持代码,反而造成混乱。

STM32F10X_MD 这个宏从哪里来?

很多教程直接告诉你填:STM32F10X_MD
但真正学习时,不能只背结论,还要知道它从哪里来。打开:CORE\stm32f10x.h ,在里面搜索:Please select first
或者搜索:target STM32F10x device
你会看到类似这样的官方提示:
#error "Please select first the target STM32F10x device used in your application"
顺着这段往上看,可以看到一组候选宏:
STM32F10X_LDSTM32F10X_LD_VLSTM32F10X_MDSTM32F10X_MD_VLSTM32F10X_HDSTM32F10X_HD_VLSTM32F10X_XLSTM32F10X_CL
然后根据芯片型号和 Flash 容量选择。
比如:
STM32F103C8T6→ 64KB Flash→ Medium-density→ STM32F10X_MD
所以 STM32F10X_MD 不是凭空来的,而是官方头文件里要求你选择的芯片类型宏。

为什么推荐在 Keil Define 里写宏?

在 stm32f10x.h 中,还有一个很重要的提示,
/*  Tip: To avoid modifying this file each time you need to switch between these        devices, you can define the device in your toolchain compiler preprocessor. - Low-density devices are STM32F101xx, STM32F102xx and STM32F103xx microcontrollers   where the Flash memory density ranges between 16 and 32 Kbytes. - Low-density value line devices are STM32F100xx microcontrollers where the Flash   memory density ranges between 16 and 32 Kbytes. - Medium-density devices are STM32F101xx, STM32F102xx and STM32F103xx microcontrollers   where the Flash memory density ranges between 64 and 128 Kbytes. - Medium-density value line devices are STM32F100xx microcontrollers where the    Flash memory density ranges between 64 and 128 Kbytes.    - High-density devices are STM32F101xx and STM32F103xx microcontrollers where   the Flash memory density ranges between 256 and 512 Kbytes. - High-density value line devices are STM32F100xx microcontrollers where the    Flash memory density ranges between 256 and 512 Kbytes.    - XL-density devices are STM32F101xx and STM32F103xx microcontrollers where   the Flash memory density ranges between 512 and 1024 Kbytes. - Connectivity line devices are STM32F105xx and STM32F107xx microcontrollers.  */
提示:为了避免每次需要在这些不同芯片类型之间切换时都修改这个文件,你可以在工具链编译器的预处理器中定义芯片类型。- 低容量器件是指 STM32F101xx、STM32F102xx 和 STM32F103xx 微控制器,  它们的 Flash 存储器容量范围为 16KB 到 32KB。- 低容量 Value Line 器件是指 STM32F100xx 微控制器,  它们的 Flash 存储器容量范围为 16KB 到 32KB。- 中容量器件是指 STM32F101xx、STM32F102xx 和 STM32F103xx 微控制器,  它们的 Flash 存储器容量范围为 64KB 到 128KB。- 中容量 Value Line 器件是指 STM32F100xx 微控制器,  它们的 Flash 存储器容量范围为 64KB 到 128KB。- 高容量器件是指 STM32F101xx 和 STM32F103xx 微控制器,  它们的 Flash 存储器容量范围为 256KB 到 512KB。- 高容量 Value Line 器件是指 STM32F100xx 微控制器,  它们的 Flash 存储器容量范围为 256KB 到 512KB。- 超大容量器件是指 STM32F101xx 和 STM32F103xx 微控制器,  它们的 Flash 存储器容量范围为 512KB 到 1024KB。- 互联型器件是指 STM32F105xx 和 STM32F107xx 微控制器。

这一段是 STM32F10x 的器件密度分类说明,用来指导我们选择芯片型号宏,例如 STM32F10X_MD 表示中容量器件,STM32F10X_HD 表示高容量器件,这些宏属于 target device macro,也就是目标芯片选择宏。

这段 Tip 非常重要,它是在解释芯片型号宏应该怎么选、为什么建议在 Keil Define 里定义。这里的 this file 指的是:stm32f10x.h

toolchain compiler preprocessor 对 Keil 来说就是:Options for Target -> C/C++ -> Define

也就是说,官方建议你不要直接改 stm32f10x.h,而是在 Keil 的 Define 里写:STM32F10X_MD

这样做有两个好处:
(1)不破坏官方库源码;
(2)换芯片时只需要改工程配置,不需要改官方头文件。

USE_STDPERIPH_DRIVER 是什么?

同样打开:CORE\stm32f10x.h
你会看到代码:
#ifdef USE_STDPERIPH_DRIVER#include"stm32f10x_conf.h"#endif
这段代码非常关键,它说明只有定义了:
USE_STDPERIPH_DRIVER
stm32f10x.h 才会包含:stm32f10x_conf.h
然后 stm32f10x_conf.h 才会继续包含 GPIO、RCC、USART、TIM 等标准库头文件。
也就是说:
USE_STDPERIPH_DRIVER启用 stm32f10x_conf.h启用标准外设库头文件体系可以正常使用标准库函数
所以 USE_STDPERIPH_DRIVER 可以理解为:标准外设库总开关。
如果没有定义它,标准库头文件体系可能不会按预期展开。

编译器版本要选择 ARM Compiler 5

STM32F10x 标准库比较老,官方模板主要面向早期 MDK-ARM 环境。为了避免兼容性问题,建议在 Keil 中选择:

Options for Target→ Target→ ARM Compiler→ Use default compiler version 5

也就是使用 ARM Compiler 5,如果使用 ARM Compiler 6,可能会在 core_cm3.c 中出现类似错误:

这不是标准库文件漏加,也不是头文件路径错误,而是老版 core_cm3.c 中的 naked 函数和 ARM Compiler 6 不兼容,所以标准库模板建议统一使用:ARM Compiler 5

如果 Keil 里没有 Compiler version 5,需要安装:ARM Compiler 5 Legacy Support

STM32F10x 标准库工程建议使用 ARM Compiler 5;初学者不要一上来用 ARM Compiler 6 适配老标准库,否则容易遇到 core_cm3.c 编译错误。

完成以上配置后,点击 Build 或 Rebuild 编译工程。如果编译结果显示:

0 Error(s), 0 Warning(s)

说明启动文件、CMSIS、标准外设库、用户文件、头文件路径和宏定义都已经配置正确。

至此,一个基于 STM32F10x 标准外设库的 Keil 工程模板就创建完成了。后续新建项目时,可以直接复制这份模板,在此基础上添加 LED、KEY、USART、TIM、ADC 等功能模块,进入正式开发。


STM32 标准库工程的调用流

创建工程模板,不只是把文件放进去,还要理解程序是怎么跑起来的,STM32 上电后,大致流程如下:
芯片上电 / 复位startup_stm32f10x_md.s设置初始栈指针 SP建立中断向量表进入 Reset_Handler调用 SystemInit()system_stm32f10x.c 配置系统时钟进入 C 运行库初始化调用 main()main.c 用户程序调用标准库函数stm32f10x_gpio.c / rcc.c / usart.c 等访问 stm32f10x.h 中定义的寄存器控制 STM32 硬件外设
这条链路说明:
startup_stm32f10x_md.s 不是可有可无的;
system_stm32f10x.c 负责系统初始化;
main.c 是用户程序入口;
标准库 .c 文件负责外设函数实现;
stm32f10x.h 最终对应到底层寄存器定义。
所以 STM32 工程不是一堆文件随便堆在一起,而是一条完整的启动和调用链。

中断调用链怎么理解?

中断调用链大致如下:
外设产生中断NVIC 响应中断根据启动文件中的中断向量表找到入口跳转到 xxx_IRQHandler()执行 stm32f10x_it.c 中的中断服务函数读取数据 / 清除中断标志返回主程序
这就是为什么标准库模板里通常会有:
stm32f10x_it.cstm32f10x_it.h
it 可以理解为 interrupt,也就是中断相关文件。例如串口中断、定时器中断、外部中断,最终一般都会进入对应的 xxx_IRQHandler()。
这些中断服务函数通常就写在 stm32f10x_it.c 里面。

最后检查清单

以 STM32F103C8T6 标准库工程为例,创建完成后建议按下面清单检查。
1. 启动文件是否选对?
STM32F103C8T6 → startup_stm32f10x_md.s
2. CORE 文件是否完整?
core_cm3.ccore_cm3.hstm32f10x.hsystem_stm32f10x.csystem_stm32f10x.hstartup_stm32f10x_md.s
3. FWLIB 是否复制完整?
FWLIB\incFWLIB\src
4. USER 是否有关键文件?
main.cstm32f10x_it.cstm32f10x_it.hstm32f10x_conf.h
5. Include Paths 是否配置?
至少包括:
..\CORE..\USER..\FWLIB\inc
如果有自己的模块,还要加入:
..\HARDWARE\LED..\SYSTEM\delay
6. 源文件是否加入 Keil 工程?
至少包括:
startup_stm32f10x_md.score_cm3.csystem_stm32f10x.cmain.cstm32f10x_it.cmisc.cstm32f10x_gpio.cstm32f10x_rcc.c
用到哪个外设,就加入对应 .c 文件,初学阶段可以把 FWLIB\src 中的 .c 全部加入,先保证少踩坑。
7. Define 是否填写正确?
对于 STM32F103C8T6,常见配置:
USE_STDPERIPH_DRIVER, STM32F10X_MD
8. 是否误用了官方评估板宏?
普通最小系统板通常不要加:USE_STM32100E_EVAL
类似评估板宏也不要随便加。
9. 是否能编译通过?
常见头文件路径错误:cannot open source input file "stm32f10x.h"
通常说明 Include Paths 没配好。
常见链接错误:Undefined symbol GPIO_Init
通常说明对应 .c 文件没有加入工程。

几个常见错误总结

错误一:只复制了头文件,没有复制源文件
表现:Undefined symbol xxx
原因:.h 只是声明,.c 才是实现。

错误二:源文件复制了,但没添加到 Keil 工程
表现:文件明明在文件夹里,但编译还是报错。
原因:Windows 文件夹有这个文件,不代表 Keil 工程会编译它。
必须手动 Add Existing Files。

错误三:Include Paths 没配
表现:cannot open source input file "xxx.h"
原因:编译器不知道去哪里找头文件。

错误四:芯片宏没选
表现:编译时报错,提示类似:

Please select first the target STM32F10x device used in your application

或者定位到 stm32f10x.h 中的这一行:

#error"Please select first the target STM32F10x device use

出现:Please select first the target STM32F10x device
原因:没有定义 STM32F10X_MD 等芯片类型宏。

错误五:没定义 USE_STDPERIPH_DRIVER
表现:标准库头文件体系没有正常展开,函数或类型找不到。
原因:没有启用标准外设库总开关。

总结

创建 STM32 标准库工程模板,不是把官方库所有文件一股脑复制进去,也不是机械照抄某个教程的目录,真正要做的是:
从官方库中挑出工程需要的文件;
按照清晰职责重新组织目录;
把 .c 和 .s 文件加入 Keil 工程参与编译;
把 .h 所在目录加入 Include Paths;
在 Define 中正确配置芯片宏和标准库宏;
理解启动文件、系统初始化、主函数和标准库函数之间的调用关系。
最重要的几个结论如下:
Libraries 是工程运行基础。
Project 是官方模板和官方例程。
Utilities 主要服务官方评估板,普通开发板可以先跳过。
stm32f10x_stdperiph_lib_um.chm 是标准库用户手册,建议保留。
宏定义不要死记硬背,STM32F10X_MD 可以从 stm32f10x.h 里的 Please select first 提示找到。
USE_STDPERIPH_DRIVER 的直接证据是:
#ifdef USE_STDPERIPH_DRIVER#include"stm32f10x_conf.h"#endif
这说明它本质上就是标准外设库的总开关。
最后再记住一句话:
Include Paths 解决的是 .h 头文件去哪里找;Add Source File 解决的是 .c 源文件是否参与编译。
把这句话理解透,很多 STM32 工程报错就不再神秘,目录结构可以灵活,但不能乱来,工程模板的意义,不是让文件夹看起来复杂,而是让项目真正好开发、好维护、好复用。
对于初学者来说,标准库工程模板不是负担,而是理解 STM32 工程体系的第一道门槛。这一步跨过去,后面学 GPIO、USART、TIM、ADC、DMA,才会真正有章法。
基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-05-31 21:51:55 HTTP/1.1 GET : https://www.yeyulingfeng.com/a/691044.html
  2. 运行时间 : 0.103192s [ 吞吐率:9.69req/s ] 内存消耗:4,732.03kb 文件加载:145
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=f5beb7aa4fc4f679eb79f6cb990c02fe
  1. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/public/index.php ( 0.79 KB )
  2. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/autoload.php ( 0.17 KB )
  3. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/composer/autoload_real.php ( 2.49 KB )
  4. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/composer/platform_check.php ( 0.90 KB )
  5. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/composer/ClassLoader.php ( 14.03 KB )
  6. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/composer/autoload_static.php ( 6.05 KB )
  7. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/helper.php ( 8.34 KB )
  8. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-validate/src/helper.php ( 2.19 KB )
  9. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/ralouphie/getallheaders/src/getallheaders.php ( 1.60 KB )
  10. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/helper.php ( 1.47 KB )
  11. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/stubs/load_stubs.php ( 0.16 KB )
  12. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Exception.php ( 1.69 KB )
  13. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-container/src/Facade.php ( 2.71 KB )
  14. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/deprecation-contracts/function.php ( 0.99 KB )
  15. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/polyfill-mbstring/bootstrap.php ( 8.26 KB )
  16. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/polyfill-mbstring/bootstrap80.php ( 9.78 KB )
  17. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/var-dumper/Resources/functions/dump.php ( 1.49 KB )
  18. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-dumper/src/helper.php ( 0.18 KB )
  19. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/var-dumper/VarDumper.php ( 4.30 KB )
  20. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/guzzlehttp/guzzle/src/functions_include.php ( 0.16 KB )
  21. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/guzzlehttp/guzzle/src/functions.php ( 5.54 KB )
  22. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/App.php ( 15.30 KB )
  23. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-container/src/Container.php ( 15.76 KB )
  24. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/psr/container/src/ContainerInterface.php ( 1.02 KB )
  25. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/provider.php ( 0.19 KB )
  26. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Http.php ( 6.04 KB )
  27. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/helper/Str.php ( 7.29 KB )
  28. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Env.php ( 4.68 KB )
  29. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/common.php ( 0.03 KB )
  30. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/helper.php ( 18.78 KB )
  31. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Config.php ( 5.54 KB )
  32. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/alipay.php ( 3.59 KB )
  33. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/facade/Env.php ( 1.67 KB )
  34. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/app.php ( 0.95 KB )
  35. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/cache.php ( 0.78 KB )
  36. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/console.php ( 0.23 KB )
  37. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/cookie.php ( 0.56 KB )
  38. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/database.php ( 2.48 KB )
  39. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/filesystem.php ( 0.61 KB )
  40. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/lang.php ( 0.91 KB )
  41. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/log.php ( 1.35 KB )
  42. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/middleware.php ( 0.19 KB )
  43. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/route.php ( 1.89 KB )
  44. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/session.php ( 0.57 KB )
  45. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/trace.php ( 0.34 KB )
  46. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/view.php ( 0.82 KB )
  47. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/event.php ( 0.25 KB )
  48. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Event.php ( 7.67 KB )
  49. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/service.php ( 0.13 KB )
  50. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/AppService.php ( 0.26 KB )
  51. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Service.php ( 1.64 KB )
  52. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Lang.php ( 7.35 KB )
  53. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/lang/zh-cn.php ( 13.70 KB )
  54. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/initializer/Error.php ( 3.31 KB )
  55. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/initializer/RegisterService.php ( 1.33 KB )
  56. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/services.php ( 0.14 KB )
  57. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/service/PaginatorService.php ( 1.52 KB )
  58. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/service/ValidateService.php ( 0.99 KB )
  59. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/service/ModelService.php ( 2.04 KB )
  60. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-trace/src/Service.php ( 0.77 KB )
  61. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Middleware.php ( 6.72 KB )
  62. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/initializer/BootService.php ( 0.77 KB )
  63. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/Paginator.php ( 11.86 KB )
  64. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-validate/src/Validate.php ( 63.20 KB )
  65. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/Model.php ( 23.55 KB )
  66. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/Attribute.php ( 21.05 KB )
  67. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/AutoWriteData.php ( 4.21 KB )
  68. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/Conversion.php ( 6.44 KB )
  69. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/DbConnect.php ( 5.16 KB )
  70. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/ModelEvent.php ( 2.33 KB )
  71. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/RelationShip.php ( 28.29 KB )
  72. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/contract/Arrayable.php ( 0.09 KB )
  73. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/contract/Jsonable.php ( 0.13 KB )
  74. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/contract/Modelable.php ( 0.09 KB )
  75. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Db.php ( 2.88 KB )
  76. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/DbManager.php ( 8.52 KB )
  77. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Log.php ( 6.28 KB )
  78. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Manager.php ( 3.92 KB )
  79. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/psr/log/src/LoggerTrait.php ( 2.69 KB )
  80. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/psr/log/src/LoggerInterface.php ( 2.71 KB )
  81. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Cache.php ( 4.92 KB )
  82. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/psr/simple-cache/src/CacheInterface.php ( 4.71 KB )
  83. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/helper/Arr.php ( 16.63 KB )
  84. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/cache/driver/File.php ( 7.84 KB )
  85. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/cache/Driver.php ( 9.03 KB )
  86. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/contract/CacheHandlerInterface.php ( 1.99 KB )
  87. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/Request.php ( 0.09 KB )
  88. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Request.php ( 55.78 KB )
  89. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/middleware.php ( 0.25 KB )
  90. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Pipeline.php ( 2.61 KB )
  91. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-trace/src/TraceDebug.php ( 3.40 KB )
  92. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/middleware/SessionInit.php ( 1.94 KB )
  93. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Session.php ( 1.80 KB )
  94. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/session/driver/File.php ( 6.27 KB )
  95. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/contract/SessionHandlerInterface.php ( 0.87 KB )
  96. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/session/Store.php ( 7.12 KB )
  97. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Route.php ( 23.73 KB )
  98. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/RuleName.php ( 5.75 KB )
  99. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/Domain.php ( 2.53 KB )
  100. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/RuleGroup.php ( 22.43 KB )
  101. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/Rule.php ( 26.95 KB )
  102. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/RuleItem.php ( 9.78 KB )
  103. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/route/app.php ( 3.94 KB )
  104. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/facade/Route.php ( 4.70 KB )
  105. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/dispatch/Controller.php ( 4.74 KB )
  106. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/Dispatch.php ( 10.44 KB )
  107. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/controller/Index.php ( 9.87 KB )
  108. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/BaseController.php ( 2.05 KB )
  109. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/facade/Db.php ( 0.93 KB )
  110. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/connector/Mysql.php ( 5.44 KB )
  111. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/PDOConnection.php ( 52.47 KB )
  112. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/Connection.php ( 8.39 KB )
  113. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/ConnectionInterface.php ( 4.57 KB )
  114. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/builder/Mysql.php ( 16.58 KB )
  115. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/Builder.php ( 24.06 KB )
  116. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/BaseBuilder.php ( 27.50 KB )
  117. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/Query.php ( 15.71 KB )
  118. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/BaseQuery.php ( 45.13 KB )
  119. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/TimeFieldQuery.php ( 7.43 KB )
  120. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/AggregateQuery.php ( 3.26 KB )
  121. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/ModelRelationQuery.php ( 20.07 KB )
  122. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/ParamsBind.php ( 3.66 KB )
  123. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/ResultOperation.php ( 7.01 KB )
  124. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/WhereQuery.php ( 19.37 KB )
  125. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/JoinAndViewQuery.php ( 7.11 KB )
  126. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/TableFieldInfo.php ( 2.63 KB )
  127. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/Transaction.php ( 2.77 KB )
  128. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/log/driver/File.php ( 5.96 KB )
  129. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/contract/LogHandlerInterface.php ( 0.86 KB )
  130. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/log/Channel.php ( 3.89 KB )
  131. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/event/LogRecord.php ( 1.02 KB )
  132. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/Collection.php ( 16.47 KB )
  133. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/facade/View.php ( 1.70 KB )
  134. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/View.php ( 4.39 KB )
  135. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/controller/Es.php ( 3.30 KB )
  136. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Response.php ( 8.81 KB )
  137. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/response/View.php ( 3.29 KB )
  138. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Cookie.php ( 6.06 KB )
  139. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-view/src/Think.php ( 8.38 KB )
  140. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/contract/TemplateHandlerInterface.php ( 1.60 KB )
  141. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-template/src/Template.php ( 46.61 KB )
  142. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-template/src/template/driver/File.php ( 2.41 KB )
  143. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-template/src/template/contract/DriverInterface.php ( 0.86 KB )
  144. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/runtime/temp/c935550e3e8a3a4c27dd94e439343fdf.php ( 31.50 KB )
  145. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-trace/src/Html.php ( 4.42 KB )
  1. CONNECT:[ UseTime:0.000488s ] mysql:host=127.0.0.1;port=3306;dbname=wenku;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.000742s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.000310s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000290s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.000489s ]
  6. SELECT * FROM `set` [ RunTime:0.000192s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.000593s ]
  8. SELECT * FROM `article` WHERE `id` = 691044 LIMIT 1 [ RunTime:0.000638s ]
  9. UPDATE `article` SET `lasttime` = 1780235515 WHERE `id` = 691044 [ RunTime:0.000723s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 64 LIMIT 1 [ RunTime:0.000231s ]
  11. SELECT * FROM `article` WHERE `id` < 691044 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.000427s ]
  12. SELECT * FROM `article` WHERE `id` > 691044 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.000327s ]
  13. SELECT * FROM `article` WHERE `id` < 691044 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.000649s ]
  14. SELECT * FROM `article` WHERE `id` < 691044 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.000619s ]
  15. SELECT * FROM `article` WHERE `id` < 691044 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.000664s ]
0.104921s