🔬 实验02:基于库函数的新建工程

📌 实验目标
  • 掌握 STM32 标准外设库(固件库)的工程结构
  • 学会基于固件库新建 STM32 工程模板
  • 理解启动文件、系统文件和应用代码的关系
  • 学习使用库函数控制 GPIO 输出

一、实验内容

  1. 下载 STM32F10x 标准外设库
  2. 创建基于固件库的工程模板
  3. 在工程模板中添加必要的文件
  4. 编写 GPIO 输出控制程序

二、固件库工程结构

标准外设库(Standard Peripherals Library)是 ST 官方提供的外设驱动库,封装了寄存器操作的底层代码,提供 API 函数供开发者使用。

一个完整的固件库工程包含以下文件:

文件/文件夹说明
Libraries/CMSISCortex-M3 内核相关文件(core_cm3.h、startup 等)
Libraries/STM32F10x_StdPeriph_Driver标准外设库驱动(inc 头文件、src 源文件)
User/main.c用户主程序
User/stm32f10x_it.c中断服务函数文件
User/stm32f10x_conf.h外设配置文件

三、新建工程步骤

  1. 新建工程文件夹:创建 Template 目录,下建 User、Libraries、Project 等子文件夹
  2. 复制固件库文件:将固件库中相应的文件复制到 Libraries 目录
  3. 新建 Keil 工程:Project → New μVision Project,保存到 Project 文件夹
  4. 选择芯片型号:STM32F103C8
  5. 添加源文件到工程:分组(Groups)管理,分别添加启动文件、固件库源文件、用户代码
  6. 配置头文件路径:C/C++ → Include Paths 添加所有头文件目录
  7. 定义宏:C/C++ → Define 添加 STM32F10X_MD(大容量芯片为 STM32F10X_HD)
  8. 编译测试:确保零错误零警告

四、示例程序

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);
    }
}
💡 这段代码怎么用?
  1. 这是实验 01 的进阶版:同样是 LED 闪烁,但改用固件库标准写法,并拆分了「初始化」与「主循环」
  2. GPIO_InitStructure 是「结构体填表式」配置——填好引脚/速度/模式再交给 GPIO_Init(),这是 STM32 库函数编程的统一风格
  3. 后续所有实验(串口、定时器…)都复用这套「结构体初始化 + 功能函数」的组织方式,先在这里建立肌肉记忆

五、参考资料

资料文件名
库函数新建工程 PPT基于库函数的新建工程.pptx
实验指导文档基于库函数的新建工程.docx
源码模板main函数源码.c
实验1 熟悉开发环境实验1 熟悉开发环境.docx