
03_STM32_固件库
第一章 开发模式介绍
1.1 直接操作寄存器
在没有库的概念时,最传统的方式是直接操作寄存器:每个外设(如 GPIO、UART、SPI 等)都有一组寄存器来配置和控制其功能与状态。开发者需要:
- 查阅数据手册或技术文档:确认寄存器地址、位定义及功能。
- 编写寄存器操作代码:使用 C 或汇编语言直接对寄存器进行读写,实现外设初始化与控制。
1.1.1 优点
- 性能高:直接操作寄存器,执行效率更优。
- 灵活性高:可以根据实际需求对外设进行精准、细致的控制。
1.1.2 缺点
- 难度较大:需要深入理解单片机硬件架构和寄存器细节。
- 开发周期长:手动配置寄存器,过程繁琐、耗时。
- 可移植性差:不同型号或系列的单片机,寄存器地址及功能各不相同,代码移植非常不便。
1.2 CMSIS 标准
随着 Cortex-M 内核在各家厂商的广泛应用,“硬件外设差异化”导致软件移植、维护等方面面临较大挑战。为了让在同样的 Cortex-M 内核上开发的应用更容易移植与复用,ARM 联合编译器厂商和 MCU 厂商提出了 CMSIS(Cortex Microcontroller Software Interface Standard)标准。
目的:提供一套通用接口,让不同厂商生产的 Cortex-M 微控制器在内核级操作、中断管理、外设访问及 RTOS 等方面具有一致性,减少重复移植工作。
在 STM32 中的作用:STM32 的各类官方库(SPL、HAL、LL)都遵循 CMSIS,在启动文件、寄存器头文件、内核抽象函数等方面与该标准保持一致。因此,开发者可以在同一基础上针对不同 STM32 芯片进行开发,而不必从零开始编写底层文件。
下图体现了 CMSIS 在架构层的作用:
1.3 STM32 固件库概述
基于 CMSIS 标准,意法半导体(ST)面向 STM32 系列微控制器编写了三套主流的 C 语言驱动库:
标准外设库(Standard Peripheral Library,简称 SPL)
硬件抽象层(Hardware Abstraction Layer,简称 HAL)
底层驱动库(Low Layer Library,简称 LL)
它们的核心目标是一致的:减轻开发者直接操作寄存器的负担,通过官方编写的函数接口来进行外设初始化和控制。
[!NOTE]
然而,这三种库在抽象层次、维护现状、适用场景等方面又各有区别。在课堂教学中,应帮助学生理清各自特点与选型依据。
1.4 SPL库
SPL库即标准外设库。
SPL 是 STM32 较早推出的一套官方驱动库,它将直接寄存器操作进行了一定程度的函数化封装,让开发者无需直接读写寄存器即可配置外设。
函数命名风格
通常以 GPIO_
、USART_
、SPI_
等前缀开头,对应外设初始化和操作的 API。
编程模型
依旧保留了相对较多的寄存器思路,用户必须了解各外设的配置流程和关键寄存器原理,但比完全裸寄存器要容易。
1.4.1 SPL 的特点
贴近底层:对于理解 STM32 外设寄存器结构、配置过程仍能提供较好的学习和调试体验。
100%覆盖外设:几乎涵盖早期 STM32 系列的所有外设驱动。
过程化便于调试:将复杂的寄存器配置封装成可读性较好的函数,便于排查问题或分步测试。
中间件扩展:可与 ST 提供的一些中间件(例如 USB、TCP-IP、图形库等)结合使用。
1.4.2 SPL 的局限
官方维护度下降:ST 官方已停止对 SPL 的更新,倾向于推广 HAL 与 LL;
学习曲线依旧陡峭:要学好 SPL,需要了解不少寄存器和硬件原理;
缺乏统一的HAL API:在不同 STM32 系列/型号之间,SPL 并不保证完全一致的函数命名或接口;
对新系列支持不足:如 STM32 L0、L4、F7 等,SPL 并无完善适配。
适用场景:对早期 STM32 系列或有历史项目延续需求的场合;也适合想更深入了解底层配置流程、习惯 SPL 接口的开发者。
1.5 HAL 库
HAL(Hardware Abstraction Layer) 是 ST 目前主推的开发库,提供了较高层次的硬件抽象接口。相比 SPL,HAL 更注重跨系列移植性和高级功能支持。
1.5.1 HAL 的特点
高抽象:用户无需理会过多寄存器细节,通过函数和结构体配置外设;
跨系列可移植:相同或相似的外设初始化与操作接口,在不同的 STM32 系列间具有更好的一致性;
全面覆盖:对绝大部分 STM32 外设都提供了驱动接口;
内置高级中间件:如 USB、TCP-IP、图形/触摸感应、RTOS 适配等;
与 STM32CubeMX 配合:可通过图形化配置生成初始化代码,大幅减少开发周期。
1.5.2 HAL 的局限
开销相对较大:在某些资源紧张或极高性能场合,HAL 的“适配层”可能显得冗余;
抽象程度高:对习惯底层寄存器操作的开发者来说,“一口气”跳到高层 API 可能在调试和优化上需要一定适应;
执行效率:相比直接寄存器或更底层库(如 LL),运行效率会略低一些,但通常能满足绝大多数通用场合。
适用场景:新项目或想快速开发、追求可移植性和功能完整性(尤其需要 USB、以太网、RTOS 等中间件)的场合。初学者可通过 HAL + CubeMX 快速上手,减少出错。
1.6 LL 库
LL(Low Layer Library) 库是 ST 在 HAL 体系下推出的一套更接近寄存器的驱动库。它弥补了 HAL 在性能优化方面的不足,提供了更轻量级且高速的外设配置接口。
1.6.1 LL 的特点
贴近寄存器:函数多以 LL_
前缀命名,对应外设的寄存器配置;
高执行效率:由于封装层级较浅,代码更紧凑,适合资源敏感或高实时性需求的场景;
严格对应参考手册:与外设寄存器及位域名称几乎完全一致,学习或排查时与文档对照非常方便;
与 CubeMX 配合:对多数新系列(如 L0、F0、F3、L4 等)可以使用 CubeMX 生成初始化代码。
1.6.2 LL 的局限
针对特定系列:LL 对部分 STM32 系列提供了完整支持,对少数尚未覆盖系列也可能存在接口差异;
对高级中间件支持不足:某些复杂外设(例如 USB、以太网等)HAL 提供完整封装,而 LL 层级往往更原始;
需要理解底层:LL 虽然对寄存器做了函数化封装,但对外设的控制流程和配置思路需要开发者具备一定基础;
移植性不如 HAL:在不同 STM32 产品间切换,需要更多关注寄存器级的变化。
适用场景:对性能和资源要求高、需更精细化控制外设的项目;对于熟悉硬件底层、希望追求代码“轻量”和“高效率”的开发者而言是不错的选择。
1.7 选择建议
STM32 的三大官方固件库(SPL、HAL、LL)各有优劣,选型时主要取决于项目需求与开发者熟悉度:
SPL:
- 适合已有老项目维护或想学习寄存器编程思路的场合。
- 不再更新,若是新项目或对中间件需求大,建议优先考虑 HAL/LL。
HAL:
- ST 的重点推广方案,适合需要快速开发、完备功能和跨系列移植的应用。
- 对资源非常紧张或追求极致性能的场合,可能需要结合 LL 或直接寄存器。
LL:
- 适用于对底层性能、资源占用有更高要求或想自行掌控配置细节的场合。
- 与 CubeMX 结合生成初始化代码,便于快速上手,但对底层理解有一定门槛。
第二章 固件库-环境搭建
2.1 固件库-文件系统架构
2.1.1 启动文件(汇编)
文件名: startup_stm32f4xx.s
(具体后缀可能因型号差异而不同,如 .hd
表示大容量型号)
| 后缀 | 含义 | 适用芯片示例 | 备注 |
| :——- | :————————– | :———————– | :——————————————- |
| ld | Low Density(低容量) | STM32F103C8, STM32F103T8 | Flash ≤ 64KB,SRAM ≤ 20KB |
| md | Medium Density(中容量) | STM32F103RC, STM32F103VC | Flash ≤ 128KB,SRAM ≤ 64KB |
| hd | High Density(高容量) | STM32F103ZE, STM32F407VG | Flash ≥ 256KB,SRAM ≥ 64KB |
| xl | Extra Large(超大容量) | STM32F417IG, STM32F429BI | Flash ≥ 512KB,SRAM ≥ 256KB |
| cl | Connectivity Line(连接线) | STM32F105VC, STM32F107VC | 专用于带USB OTG、以太网等外设的型号 |
| xx | 通用型号占位符 | STM32F407xx, STM32F746xx | 表示同一系列中的多种型号(如F407VG、F407ZE) |
| h7 | H7系列专用 | STM32H743VI, STM32H750VB | 高性能系列,支持双核、大内存 |
| wb | Wireless系列专用 | STM32WB55CE, STM32WB35CC | 集成蓝牙/无线功能的型号 |
功能:
- 设置堆栈指针(SP)
- 设置程序计数器(PC)
- 初始化中断向量表(需根据芯片型号调整向量表地址)
- 调用
SystemInit()
配置系统时钟 - 进入 C 语言环境,调用
_main
函数
2.1.2 时钟配置文件
文件名: system_stm32f4xx.c
功能:
- 配置外部高速时钟(HSE = 8MHz),通过 PLL 分频/倍频生成系统时钟(最高 168MHz)。
- 关键函数:
SystemInit()
(初始化时钟树,包括 HSI/HSE 选择、PLL 配置、AHB/APB 分频)。
2.1.3 外设驱动相关
文件:
stm32f4xx.h
: 定义 STM32F407 所有外设的寄存器映射及基地址。
外设驱动库:
- 源文件:
stm32f4xx_xx.c
(如stm32f4xx_gpio.c
、stm32f4xx_usart.c
、stm32f4xx_spi.c
)。 - 头文件:
stm32f4xx_xx.h
(包含初始化结构体、宏定义和函数声明,如GPIO_InitTypeDef
)。
2.1.4 内核相关(CMSIS 标准)
文件:
core_cm4.h
/core_cm4.c
: Cortex-M4 内核的寄存器映射及操作函数(如 NVIC、SysTick)。misc.h
/misc.c
: 实现中断优先级配置(NVIC)、系统时钟配置辅助函数。
2.1.5 头文件配置
文件名 : stm32f4xx_conf.h
功能 :
- 管理外设头文件的包含关系(通过宏定义启用/禁用外设模块):
#include "stm32f4xx_gpio.h" #include "stm32f4xx_usart.h" // #include "stm32f4xx_eth.h" // 按需启用
2.1.6 中断服务函数
文件:
stm32f4xx_it.c
/stm32f4xx_it.h
: 默认存放中断服务函数(如TIM2_IRQHandler
)。
说明:
- 中断服务函数可自定义存放位置,但需确保与启动文件中的中断向量表一致。
2.1 固件库-目录介绍
文件说明:
// 重要
Libraries:
CMSIS:
作用:ARM 官方提供的微控制器软件接口标准,为不同厂商的 Cortex-M 芯片提供统一的编程接口,确保代码可移植性。
内容:包含与 Cortex-M4 内核相关的
启动文件
设备描述文件(如 stm32f4xx.h)
系统初始化代码(如系统时钟配置)
STM32F4xx_StdPeriph_Driver:
作用:ST 官方提供的标准外设驱动库,开发者可直接调用这些封装好的函数操作硬件外设,无需直接读写寄存器。
内容:外设驱动源代码(.c 和 .h 文件),例如 GPIO、UART、SPI、I2C 等。
// 一般重要
Project:
STM32F4xx_StdPeriph_Examples:
作用:ST 官方提供的标准外设使用示例,适合开发者快速上手外设配置,也可作为调试参考。
内容:针对每个外设(如 ADC、TIM、DMA)的独立示例工程,演示何初始化外设并实现特定功能(如 PWM 输出、中断处理)。
STM32F4xx_StdPeriph_Templates:
作用:ST 官方提供的空白工程模板,新建项目时可直接复制此模板,避免手动搭建工程框架。
内容:
支持不同开发环境(如 Keil、IAR、STM32CubeIDE)的工程文件。
最小化的工程结构,包含必要的驱动库文件、链接脚本(.ld)和基础配置文件(如 stm32f4xx_conf.h)。
// 不关注
Utilities:ST 官方实验板的示例代码及第三方库,如 emWin 图形库、FatFs 文件系统等。
提供与 ST 官方开发板(如 Discovery、Nucleo 系列)配套的示例代码及第三方库支持。
作用:提供与 ST 官方开发板(如 Discovery、Nucleo 系列)配套的示例代码及第三方库支持。
内容:
评估板示例:针对特定硬件外设(如 LCD 显示屏、触摸按键)的完整驱动代码。
第三方库:
emWin:嵌入式图形界面库,用于开发 GUI 应用。
FatFs:开源 FAT 文件系统模块,支持 SD 卡、Flash 存储的文件读写。
适用场景:需要复杂功能(如图形显示、文件管理)时可直接集成这些库。
// 不关注
MCD-ST Liberty SW License Agreement V2.pdf:
驱动库的许可协议说明。
// 不关注
Release_Notes.html:
固件库的更新说明。
// 不关注
stm32f4xx_dsp_stdperiph_lib_um.chm:
HTML 格式的库帮助文档,详细介绍驱动库的使用方法。
// 不关注
stm32f4xx_dsp_stdperiph_lib_um.chw:
CHM 帮助文档的索引文件,加速查询。
注意:CHM 文档介绍了 ST 提供的外设驱动用法,CHW 文件是其索引文件,请勿删除!
2.1.1 Libraries 目录
1、CMSIS
文件夹
Include
文件夹
该文件夹存放的是 CMSIS 的核心头文件,主要用于定义 Cortex-M 处理器的核心寄存器、指令及数学计算相关的内容。
Include
├── arm_common_tables.h
├── arm_const_structs.h
├── arm_math.h
├── core_cm0.h
├── core_cm0plus.h
├── core_cm3.h
├── core_cm4.h
├── core_cm7.h
├── core_cmFunc.h
├── core_cmInstr.h
├── core_cmSimd.h
├── core_sc000.h
└── core_sc300.h
下面是我们的工程项目中,需要用到的4个文件:
core_cm4.h
:针对 Cortex-M4 处理器的核心寄存器定义和系统级函数。
core_cmFunc.h
:提供核心功能函数的定义,如 NVIC(中断控制)操作。
core_cmInstr.h
:封装了一些内联汇编指令,例如 __NOP()
、__WFI()
等低功耗模式指令。
core_cmSimd.h
:包含 SIMD(单指令多数据)运算支持,用于加速 DSP 相关计算。
Device
文件夹
该文件夹存放的是针对特定芯片(如 STM32F4)适配的 CMSIS 设备层代码,包括寄存器定义、系统初始化代码及各编译器的启动文件。
Device
└── ST
└── STM32F4xx
├── Include
│ ├── stm32f4xx.h # 定义了 STM32F4 系列芯片的全局寄存器映射、外设地址及核心数据类型
│ └── system_stm32f4xx.h # 声明了系统初始化函数(如 SystemInit())和时钟配置参数
├── Release_Notes.html
└── Source
└── Templates
├── SW4STM32
│ ├── startup_stm32f401xx.s
│ ├── 。。。。。。。 #代表省略后面的文件
├── TASKING
│ └── cstart_thumb2.asm
├── TrueSTUDIO
│ ├── startup_stm32f401xx.s
│ ├── 。。。。。。。
├── arm
│ ├── startup_stm32f401xx.s
│ ├── startup_stm32f40_41xxx.s
│ ├── startup_stm32f40xx.s
│ ├── startup_stm32f410xx.s
│ ├── startup_stm32f411xe.s
│ ├── startup_stm32f412xg.s
│ ├── startup_stm32f413_423xx.s
│ ├── startup_stm32f427_437xx.s
│ ├── startup_stm32f427x.s
│ ├── startup_stm32f429_439xx.s
│ ├── startup_stm32f446xx.s
│ └── startup_stm32f469_479xx.s
├── gcc_ride7
│ ├── startup_stm32f401xx.s
│ ├── 。。。。。。。
├── iar
│ ├── startup_stm32f401xx.s
│ ├── 。。。。。。。
└── system_stm32f4xx.c #
system_stm32f4xx.c
/ system_stm32f4xx.h
这个文件包含了 STM32 芯片上电后初始化系统时钟、扩展外部存储器用的函数,例如我们前两章提到供启动文件调的“SystemInit”函数,用于上电后初始化时钟,该函数的定义就存储在system_stm32f4xx.c 文件。
stm32f4xx.h
这个文件包含了 STM32 中所有的外设寄存器地址和结构体类型定义,在使用到 STM32 标准库的地方都要包含这个头文件。
启动文件
在这个目录下,还有很多文件夹,如“ARM”、“SW4STM32”、“TASKING”等,这些文件夹下包含了对应编译平台的汇编启动文件,在实际使用时要根据编译平台来选择。
各编译器(ARM、IAR、GCC)对应的启动汇编文件,负责复位向量表设置、堆栈初始化及程序入口跳转,其中的“strartup_stm32f40xx.s”即为 STM32F407 芯片的启动文件。
2、STM32F4xx_StdPeriph_Driver
文件夹
STM32F4xx_StdPeriph_Driver
文件夹内部分为 inc
(头文件)和 src
(源文件)两个子目录,存放与 STM32 芯片底层硬件直接相关的核心代码和定义。
STM32F4xx_StdPeriph_Driver/
├── Release_Notes.html
├── inc
│ ├── misc.h
│ ├── stm32f4xx_adc.h
│ ├── stm32f4xx_can.h
│ ├── stm32f4xx_cec.h
│ ├── 。。。。。。。。
└── src
├── misc.c
├── stm32f4xx_adc.c
├── stm32f4xx_can.c
├── stm32f4xx_cec.c
├── 。。。。。。。。
对这两个文件的解释如下:
inc
:定义芯片硬件相关的寄存器映射、数据类型、宏及系统配置。
src
:实现芯片启动流程、时钟初始化及底层硬件操作。
misc.c
、misc.h
文件
文件位置:STM32F4xx_DSP_StdPeriph_Lib_V1.8.0\Libraries\STM32F4xx_StdPeriph_Driver
文件说明:misc.c/h
文件在前面也提到了,主要用于实现中断优先级配置(NVIC)、系统时钟配置辅助函数。
stm32f4xx_xxxx.c
stm32f4xx_xxxx.h
文件
文件位置:STM32F4xx_DSP_StdPeriph_Lib_V1.8.0\Libraries\STM32F4xx_StdPeriph_Driver
文件说明:而 stm32f4xx_xxxx.c/h
这些文件是 STM32F4 系列芯片外设驱动的核心实现,按功能模块化划分,每个外设对应独立的 .c
和 .h
文件。
外设驱动分类
- 核心系统:
misc.c/h
(中断优先级)、stm32f4xx_rcc.c/h
(时钟管理) - GPIO 控制:
stm32f4xx_gpio.c/h
- 通信接口:
stm32f4xx_usart.c/h
(串口)、stm32f4xx_i2c.c/h
(I2C)、stm32f4xx_spi.c/h
(SPI)、stm32f4xx_can.c/h
(CAN 总线) - 定时器与计时:
stm32f4xx_tim.c/h
- 存储控制:
stm32f4xx_flash.c/h
(FLASH)、stm32f4xx_crc.c/h
(CRC 校验) - 电源管理:
stm32f4xx_pwr.c/h
(低功耗模式) - 模拟外设:
stm32f4xx_adc.c/h
(ADC)、stm32f4xx_dac.c/h
(DAC)
2.1.3 Project 目录
STM32F4xx_StdPeriph_Templates/
├── EWARM
│ ├── Project.ewd
│ ├── 。。。。。。。。。。。
├── MDK-ARM
│ ├── Project.uvoptx
│ ├── 。。。。。。。。。。。
├── Release_Notes.html
├── SW4STM32
│ ├── STM32F401xx
│ │ └── STM32F401VCTx_FLASH.ld
│ ├── 。。。。。。。。。。。
├── TrueSTUDIO
│ ├── STM32F401xx
│ │ ├── STM32F401VC_FLASH.ld
│ │ └── STM32F401xx.elf.launch
│ ├── 。。。。。。。。。。。
├── main.c
├── main.h
├── readme.txt
├── stm32f4xx_conf.h
├── stm32f4xx_it.c
├── stm32f4xx_it.h
└── system_stm32f4xx.c
1、 stm32f4xx_it.c
/stm32f4xx_it.c
该文件定义了 STM32F4 系列 MCU 的中断服务函数(ISR),用于处理外部中断、定时器中断、串口中断等。
stm32f4xx_it.c
:提供各中断服务函数的具体实现,例如SysTick_Handler()
、EXTI0_IRQHandler()
等。stm32f4xx_it.h
:对应的头文件,声明了中断服务函数。
2、 stm32f4xx_conf.h
该文件是 STM32 标准外设库的配置文件,用户可通过该文件选择是否启用某些外设模块的头文件。例如:
#define USE_FULL_ASSERT 1 // 启用完整的断言功能
#include "stm32f4xx_gpio.h" // 使能 GPIO 相关库
#include "stm32f4xx_usart.h" // 使能 USART 串口相关库
此文件用于灵活配置外设库,减少无用代码的编译,提高程序效率。
3、system_stm32f4xx.c
该文件用于系统初始化,提供 SystemInit()
函数,主要完成:
- 配置 STM32F4 的时钟系统(HSE、PLL、SYSCLK)
- 配置 Flash 预取、等待状态等
- 设置向量表地址
2.2 库各文件间的关系
图库各文件关系 描述了 STM32 库各文件之间的调用关系,这个图省略了 DSP 核和实时系统层部分的文件关系。在实际的使用库开发工程的过程中,我们把位于 CMSIS 层的文件包含进工程。
除了特殊系统时钟需要修改 system_stm32f4xx.c,其它文件丝毫不用修改,也不建议修改。对于位于用户层的几个文件,就是我们在使用库的时候,针对不同的应用对库文件进行增删(用条件编译的方法增删)和改动的文件。
2.3 帮助文档
2.3.1 技术手册介绍
《STM32F4xx 中文参考手册》
这个文件全方位介绍了 STM32 芯片的各种片上外设,它把 STM32 的时钟、存储器架构、及各种外设、寄存器都描述得清清楚楚。当我们对 STM32 的外设感到困惑时,可查阅这个文档。以直接配置寄存器方式开发的话,查阅这个文档寄存器部分的频率会相当高,但这样效率太低了。
《STM32F4xx 英文数据手册》
本文档相当于 STM32 的 datasheet,包含了 STM32 芯片所有的引脚功能说明及存储器架构、芯片外设架构说明。后面我们使用 STM32 其它外设时,常常需要查找这个手册,了解外设对应到 STM32 的哪个 GPIO 引脚。
《Cortex™-M4 内核参考手册》
本文档由 ST 公司提供,主要讲解 STM32 内核寄存器相关的说明,例如系统定时器、中断等寄存器。这部分的内容是《STM32F4xx 参考手册》没涉及到的内核部分的补充。相对来说,本文档虽然介绍了内核寄存器,但不如以下两个文档详细,要了解内核时,可作为以下两个手册的配合资料使用。
《Cortex-M3 权威指南》、《cortex_m4_Technical Reference Manual》
这两个手册是由 ARM 公司提供的,它详细讲解了 Cortex 内核的架构和特性,要深入了解 Cortex-M 内核,这是首选,经典中的经典,其中 Cortex-M3 版本有中文版,方便学习。因为 Cortex-M4 内核与 Cortex-M3 内核大部分相同,可用它来学习,而 Cortex-M4 新增的特性,则必须参考《cortex_m4_Technical Reference Manual》文档了,目前只有英文版。
《stm32f4xx_dsp_stdperiph_lib_um.chm》
这个就是本章提到的库的帮助文档,在使用库函数时,我们最好通过查阅此文件来了解标准库提供了哪些外设、函数原型或库函数的调用的方法。也可以直接阅读源码里面的函数的函数说明。
2.3.2 库函数查询
所谓库函数,就是 STM32 的库文件中为我们编写好的函数接口,我们只要调用这些库函数,就可以对 STM32 进行配置,达到控制目的。我们可以不知道库函数是如何实现的,但我们调用函数必须要知道函数的功能、可传入的参数及其意义、和函数的返回值。于是,有读者就问那么多函数我怎么记呀?我的回答是:会查就行了,哪个人记得了那么多。所以我们学会查阅库帮助文档是很有必要的。打开库帮助文档《stm32f4xx_dsp_stdperiph_lib_um.chm》
层层打开文档的目录标签:
标签目录:Modules\STM32F4xx_StdPeriph_Driver\
可看到 STM32F4xx_StdPeriph_Driver 标签下有很多外设驱动文件的名字 MISC、ADC、BKP、CAN等标签。
我们试着查看 GPIO 的“位设置函数 GPIO_SetBits”看看,打开标签:
标签目录:Modules\STM32F4xx_StdPeriph_Driver\GPIO\Functions\GPIO_SetBits 见图库帮助文档的函数说明 。
1、汇编编写的启动文件
startup_stm32f4xx_hd.s
2、时钟配置文件
system_stm32f
2.3 创建工程
整体框架设计如下:
.
├── BSP # 板级支持包
│ ├── Inc # 外设驱动的头文件
│ │ └── Bsp_Led.h # LED控制接口(如初始化、开关函数)
│ └── Src # 外设驱动的源码
│ └── Bsp_Led.c # LED具体实现(如GPIO配置、电平控制)
├── Core # 核心系统文件
│ ├── main.c # 主程序入口(应用逻辑起点)
│ ├── stm32f4xx_it.c # 中断服务函数(如SysTick、外设中断)
│ └── system_stm32f4xx.c # 系统时钟初始化(配置HCLK、PLL等)
├── Drivers # ST官方库驱动
│ ├── CMSIS # ARM Cortex-M核心支持库(定义寄存器、内核函数)
│ ├── Inc # ST标准外设库头文件(需清理未使用的头文件)
│ └── Src # ST标准外设库源码(保留GPIO、RCC等必要驱动)
├── Output # 编译输出文件
│ ├── Listings # 链接器生成的映射文件(用于调试内存分配)
│ └── Objects # 编译中间文件(应通过.gitignore忽略)
├── Project # IDE工程配置
│ ├── DebugConfig # 调试器配置文件(如ST-Link/J-Link配置)
│ └── *.uvprojx # Keil工程文件(项目设置、文件索引)
└── Startup # 芯片启动文件
└── startup_stm32f40_41xxx.s # 芯片启动汇编代码(初始化堆栈、中断向量表)
2.3.1 创建工程
1、目录初始化
建立工作空间
注意,下面所编写的对于工作空间和工程文件夹两者的存放位置与文件命名可以按照读者自己的风格进行设定,无需完全参照笔者的设定,下面观点仅代表笔者自己的风格。
首先,我们需要创建工作空间目录,在你的D
盘中创建一个工作空间的目录,用于存放我们后续学习的工程,命名为[Project]STM32IGH6
。
然后,我们需要在内部创建一个标准工程的文件夹,命名为00_Template
,我们的标准工程就放在其中。
D/:
└── [Project]STM32IGH6
└── 00_Template
建立工程内部文件夹
这里的命名请读者直接参照参照。
在00_Template
文件夹下建立以下文件夹。
00_Template
├── BSP # 板级支持包
│ ├── Inc # 外设驱动的头文件
│ └── Src # 外设驱动的源码
├── Core # 核心系统文件
├── Drivers # ST官方库驱动
├── Output # 编译输出文件
├── Project # IDE工程配置
└── Startup # 芯片启动文件
如下图:
2、IDE操作
创建工程
我们需要在keil
软件中创建工程,放到工程模板目录下的Project
目录。
- 点击软件菜单栏上方的
Project -> New uVision Project
- 找到路径,输入工程名称
- 选择芯片,本次所使用的芯片为
STM32F407IGH6
- 会出现一个在线库的文件,我们这里不需要,所以可以直接关闭
2.3.2 裁剪标准库
首先我们需要打开标准库,在前面已经对标准库内的文件有所介绍了,所以现在我们就开始直接复制文件到我们的工程中。
1、复制芯片外设驱动文件
复制 Libraries\TM32F4xx_StdPeriph_Driver
内的 Inc
和Src
,到模板工程的Drivers
文件夹中。
2、复制内核文件
首先,工程模板的目录下创建一个 CMSIS
文件夹。
然后,将Libraries\CMSIS\Include
标准库内的 core_cm4.h
、core_cmFunc.h
、core_cminstr.h
、core_smSind.h
四个文件,复制到模板工程的Drivers\CMSIS
目录下。
3、复制启动文件
标准库文件中的启动文件位置为Libraries\CMSIS\Device\ST\STM32F4xx\Source\Templates\arm
,复制到模板工程的Startup
文件夹下面。
4、复制CMSIs
中的用户文件
从固件库中的Libraries\CMSIS\Device\ST\STM32F4xx\Include
下,拷贝文件到Core
文件中。
5、复制Project
中的用户文件
从固件库的\Project\STM32F4xx_StdPeriph_Templates
文件夹中,复制文件到Core
文件夹中。
2.3.3 工程配置
1、头文件路径配置
将我们工程中的头文件路径全部添加进去。
2、宏定义配置
在魔法棒的C/C++(AC6)
中添加以下宏,不添加则会出现很多报错。
STM32F40_41xxx,USE_STDPERIPH_DRIVER
3、源代码关联
- 设置工程目录
- 添加
CORE
文件
- 添加
DRIVERS
内的文件,从工程目录中的Drivers\Src
中获取
注意:需要删除 stm32f4xx_fmc.h 文件
当然了,为了提高编译效率,我们也可以不需要这么多的文件加入,以下是基础的文件,加入下面的内容就可以使用了
#include "stm32f4xx_gpio.h"
#include "stm32f4xx_rcc.h"
#include "stm32f4xx_usart.h"
#include “stm32f4xx_syscfg.h”
#include "misc.h"
- 添加启动文件,需要注意的是,选择系统文件的时候,需要将文件类型选择为
All files
2.3.4 选项配置
1、编译配置
在编译配置中,我们需要启动微库
以及修改arm编译器的版本
2、输出配置
这里需要将编译时产生的二进制文件以及过程性文件,全部放到Output
文件夹下
在Output
文件夹下创建两个文件夹如下,当然,也可以去Project
目录下面去复制。
- 配置输出
修改输出位置,编译后输出HEX文件。
- 修改过程性文件输出位置
3、下载配置
和前面一样。
4、编辑配置
和前面一样。
2.3.5 报错处理
- 感谢你赐予我前进的力量