STM32编程学习笔记(Keil5中的文件结构解读)
对于许多初次接触单片机的小伙伴而言,了解keil5中的文件结构并不轻松,对此小编将以下面的这个结构为例,来对Keil5中的文件结构进行解读 。
这个项目是一个标准的 STM32 基于标准库开发的工程文件,结构非常规范,小编将按照文件夹拆解每个部分的作用。

-------------------------------------------------------
📦 Project: HJduino └── 📂 HJduino
├── 📂 User │
├── main.c │
├── interface.h │
├── core_cm3.h │
├── misc.h │
├── stdint.h │
├── stm32f10x.h │
└── stm32f10x_xxx.h # 各外设功能头文件(如adc、can、gpio等)
├── 📂 StdPeriph_Driver │
├── stm32f10x_gpio.c │
├── stm32f10x_rcc.c │
├── misc.c │
└── stm32f10x_xxx.c # 各外设功能实现文件(如adc、can、i2c等)
├── 📂 CMSIS │
├── core_cm3.h │
└── system_stm32f10x.c
├── 📂 Startup │
└── startup_stm32f10x_hd.s
└── 📂 APP
└── interface.c
---------------------------------------------------------
1. 项目整体架构逻辑
这个结构是 STM32 官方推荐的分层开发模式,核心目的是解耦硬件底层和业务逻辑,让代码更易维护、可复用。简单来说就是:
- 底层驱动:由 ST 官方提供的标准库实现,负责操作寄存器
- 硬件接口层:你自己写的,封装底层驱动,提供统一的硬件操作接口
- 业务逻辑层:你的应用代码(如
main.c),只需要调用接口层的函数,不用关心底层细节
2. 各文件夹与文件详解
📁 User 文件夹
这是用户业务代码的核心目录,存放你自己编写的应用逻辑和头文件。
main.c:程序入口文件,所有代码从这里开始执行,负责初始化硬件、实现业务逻辑。interface.h:你自己的硬件接口头文件,用来声明函数、定义硬件相关宏(如 LED 引脚、按键引脚)。- 其他头文件(
stm32f10x_xxx.h):标准库的头文件,定义了寄存器地址、外设枚举类型、函数声明等,是库函数的 “说明书”。 core_cm3.h:Cortex-M3 内核的通用头文件,定义了内核寄存器、指令集相关的宏和函数。
📁 StdPeriph_Driver 文件夹
这是STM32 标准库的驱动实现目录,是 ST 官方提供的底层驱动代码,所有外设的驱动函数都在这里。
.c文件(如stm32f10x_gpio.c、stm32f10x_rcc.c):库函数的具体实现,里面全是寄存器操作代码,比如GPIO_Init()、RCC_APB2PeriphClockCmd()这些函数的底层逻辑都在这里。.h文件(如stm32f10x_gpio.h):对应.c文件的头文件,声明了驱动函数,定义了外设的配置结构体、枚举类型等。misc.c:中断优先级配置、NVIC 相关的驱动实现,是 STM32 中断管理的核心文件。
📁 CMSIS 文件夹
这是ARM 提供的 Cortex-M 系列内核标准接口,是硬件抽象层(HAL)的基础,保证代码在不同厂商的 Cortex-M 芯片上可移植。
core_cm3.h:Cortex-M3 内核的核心头文件,定义了内核寄存器、异常向量表、内核指令(如__NOP()、__WFI())。system_stm32f10x.c:系统时钟配置文件,负责初始化 STM32 的时钟树(如把主频配置为 72MHz),是程序运行的基础。
📁 Startup 文件夹
这里存放启动文件,是汇编编写的代码,负责硬件启动的初始化流程。
startup_stm32f10x_hd.s:STM32F10x 大容量芯片的启动文件,主要做 3 件事:- 初始化栈指针(SP)。
- 初始化中断向量表(中断服务函数的入口地址表)。
- 调用
SystemInit()配置系统时钟,最后跳转到main()函数。
📁 APP 文件夹
这是你的硬件接口实现目录,存放你自己写的底层硬件接口函数的具体实现。
interface.c:实现interface.h中声明的函数(如UserLEDInit()、GPIOCLKInit()),是你自己封装的硬件操作逻辑,调用标准库的函数来实现功能。
3. 核心协作流程(以 LED 为例)
- 启动阶段:
startup_stm32f10x_hd.s→system_stm32f10x.c(配置时钟) → 跳转到main.c。 - 初始化阶段:
main.c调用interface.c中的GPIOCLKInit()和UserLEDInit()。 - 驱动调用阶段:
interface.c中的函数调用StdPeriph_Driver里的库函数(如RCC_APB2PeriphClockCmd()、GPIO_Init())。 - 寄存器操作阶段:库函数最终操作
CMSIS定义的寄存器地址,完成硬件配置。 - 业务运行阶段:
main.c在死循环中调用interface.h的宏(如LED_SET、LED_RESET),实现 LED 闪烁。











