🔬 实验02:基于库函数的新建工程
📌 实验目标
- 掌握 STM32 标准外设库(固件库)的工程结构
- 学会基于固件库新建 STM32 工程模板
- 理解启动文件、系统文件和应用代码的关系
- 学习使用库函数控制 GPIO 输出
一、实验内容
- 下载 STM32F10x 标准外设库
- 创建基于固件库的工程模板
- 在工程模板中添加必要的文件
- 编写 GPIO 输出控制程序
二、固件库工程结构
标准外设库(Standard Peripherals Library)是 ST 官方提供的外设驱动库,封装了寄存器操作的底层代码,提供 API 函数供开发者使用。
一个完整的固件库工程包含以下文件:
| 文件/文件夹 | 说明 |
|---|---|
| Libraries/CMSIS | Cortex-M3 内核相关文件(core_cm3.h、startup 等) |
| Libraries/STM32F10x_StdPeriph_Driver | 标准外设库驱动(inc 头文件、src 源文件) |
| User/main.c | 用户主程序 |
| User/stm32f10x_it.c | 中断服务函数文件 |
| User/stm32f10x_conf.h | 外设配置文件 |
三、新建工程步骤
- 新建工程文件夹:创建 Template 目录,下建 User、Libraries、Project 等子文件夹
- 复制固件库文件:将固件库中相应的文件复制到 Libraries 目录
- 新建 Keil 工程:Project → New μVision Project,保存到 Project 文件夹
- 选择芯片型号:STM32F103C8
- 添加源文件到工程:分组(Groups)管理,分别添加启动文件、固件库源文件、用户代码
- 配置头文件路径:C/C++ → Include Paths 添加所有头文件目录
- 定义宏:C/C++ → Define 添加
STM32F10X_MD(大容量芯片为 STM32F10X_HD) - 编译测试:确保零错误零警告
四、示例程序
main.c(库函数方式)
#include "stm32f10x.h"
void Delay(uint32_t nCount)
{
for (uint32_t i = 0; i < nCount; i++);
}
int main(void)
{
// 1. 使能 GPIO 时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
// 2. GPIO 初始化结构体配置
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOB, &GPIO_InitStructure);
while (1)
{
GPIO_ResetBits(GPIOB, GPIO_Pin_0); // PB0 = 0, LED亮
Delay(0xFFFFF);
GPIO_SetBits(GPIOB, GPIO_Pin_0); // PB0 = 1, LED灭
Delay(0xFFFFF);
}
}
💡 这段代码怎么用?
- 这是实验 01 的进阶版:同样是 LED 闪烁,但改用固件库标准写法,并拆分了「初始化」与「主循环」
GPIO_InitStructure是「结构体填表式」配置——填好引脚/速度/模式再交给GPIO_Init(),这是 STM32 库函数编程的统一风格- 后续所有实验(串口、定时器…)都复用这套「结构体初始化 + 功能函数」的组织方式,先在这里建立肌肉记忆
五、参考资料
| 资料 | 文件名 |
|---|---|
| 库函数新建工程 PPT | 基于库函数的新建工程.pptx |
| 实验指导文档 | 基于库函数的新建工程.docx |
| 源码模板 | main函数源码.c |
| 实验1 熟悉开发环境 | 实验1 熟悉开发环境.docx |