对于许多初次接触单片机的小伙伴而言,了解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.cstm32f10x_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 件事:
    1. 初始化栈指针(SP)。
    2. 初始化中断向量表(中断服务函数的入口地址表)。
    3. 调用SystemInit()配置系统时钟,最后跳转到main()函数。

📁 APP 文件夹

这是你的硬件接口实现目录,存放你自己写的底层硬件接口函数的具体实现。

  • interface.c:实现interface.h中声明的函数(如UserLEDInit()GPIOCLKInit()),是你自己封装的硬件操作逻辑,调用标准库的函数来实现功能。

3. 核心协作流程(以 LED 为例)

  1. 启动阶段startup_stm32f10x_hd.ssystem_stm32f10x.c(配置时钟) → 跳转到main.c
  2. 初始化阶段main.c调用interface.c中的GPIOCLKInit()UserLEDInit()
  3. 驱动调用阶段interface.c中的函数调用StdPeriph_Driver里的库函数(如RCC_APB2PeriphClockCmd()GPIO_Init())。
  4. 寄存器操作阶段:库函数最终操作CMSIS定义的寄存器地址,完成硬件配置。
  5. 业务运行阶段main.c在死循环中调用interface.h的宏(如LED_SETLED_RESET),实现 LED 闪烁。
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐