了解STM32最小系统核心板
2026/9/24 9:20:26 网站建设 项目流程

STM32F103C8T6 多端口流水灯实验报告
STM32F103C8T6 多端口流水灯实验报告
博客发布 / 学习通提交 Markdown,可直接导出 PDF;配套代码、git 操作说明,完整满足作业要求
芯片:STM32F103C8T6(Blue Pill 蓝板最小系统)
功能:GPIOA/GPIOB/GPIOC 三个端口各 1 只 LED + 板载 PC13 LED,4 个 LED 轮流闪烁,间隔 1s
一、实验目的

  1. 认识 STM32F103C8T6 最小系统(Blue Pill)硬件组成,了解最小系统核心电路。

  2. 掌握 STM32 GPIO 寄存器底层操作,理解 GPIO 端口时钟、模式、输出寄存器配置。

  3. 使用 GPIOA、GPIOB、GPIOC 三个不同端口引脚外接 LED,实现轮流闪烁;同时复用板载 PC13 LED 加入流水灯序列。

  4. 学会 Keil 工程创建、代码编译、程序烧录;掌握 Git 基础命令,将工程上传至 Gitee/GitHub 代码仓库。
    二、实验器材

  5. STM32F103C8T6 最小系统板(Blue Pill)

  6. 面包板、杜邦线

  7. LED 发光二极管 ×3(红、绿、蓝),220Ω 限流电阻 ×3

  8. ST-LINK 下载器

  9. Keil MDK5 开发环境

  10. Git 工具、Gitee/GitHub 账号
    三、硬件电路设计
    3.1 最小系统简介
    STM32F103C8T6 最小系统包含:主芯片、8MHz 外部高速晶振 HSE、32.768K RTC 晶振、复位电路、BOOT 启动配置电路、电源稳压、下载接口。板载 LED 连接在PC13 引脚,LED 是低电平点亮(PC13 输出 0,灯亮;输出 1,灯灭)。
    3.2 外接 LED 硬件接线
    全部 LED 采用灌电流接法:GPIO 引脚输出低电平点亮 LED,串联 220Ω 限流电阻保护 LED。
    | LED 编号 | 端口引脚 | 颜色 | 接线说明 |
    | ---- | ---- | ---- | ---- |
    | LED1 | PA0(GPIOA) | 红 | PA0 → 220Ω 电阻 → LED 阳极,LED 阴极 → GND |
    | LED2 | PB0(GPIOB) | 绿 | PB0 → 220Ω 电阻 → LED 阳极,LED 阴极 → GND |
    | LED3 | PC1(GPIOC) | 蓝 | PC1 → 220Ω 电阻 → LED 阳极,LED 阴极 → GND |
    | LED4(板载) | PC13(GPIOC) | 板载 | 板载自带,无需外接元件,低电平点亮 |
    原理:引脚输出低电平 0V,电流从 3.3V 经过 LED、电阻流入 GPIO 引脚,LED 点亮;引脚输出高电平 3.3V,两端无压差,LED 熄灭。
    3.3 电路原理图
    本实验电路原理图由STM32最小系统核心电路与多路LED流水灯驱动电路两部分组成,整体采用3.3V直流供电,所有LED均为灌电流驱动接法,电路结构简洁、稳定性高,适配本次多端口LED轮流点亮的实验需求。
    一、原理图整体架构

  11. 供电电路:由最小系统板5V/3.3V稳压电路输出稳定3.3V电压,为芯片及所有LED外设提供工作电源,杜绝电压波动导致的器件异常。

  12. 主控电路:以STM32F103C8T6主控芯片为核心,搭载8MHz外部晶振电路提供系统时钟、复位电路实现系统重启、BOOT配置电路保障正常上电启动,构成完整最小工作系统。

  13. 外设驱动电路:包含4路LED指示电路,其中3路为外接独立LED电路,1路为板载LED电路,分别对应不同GPIO端口,实现多端口独立控制。
    二、详细引脚电路连接(原理图核心参数)

  14. 外接LED电路:3路外设电路电路结构完全一致,均采用“GPIO引脚+220Ω限流电阻+LED指示灯+接地”的标准灌电流电路。PA0、PB0、PC1三个引脚分别串联1颗220Ω限流电阻,限流电阻可限制回路最大电流,避免过流烧毁LED灯珠及芯片GPIO引脚;电阻另一端对应接入红、绿、蓝三色LED阳极,所有LED阴极统一接入电路GND地端。

  15. 板载LED电路:板载LED固定连接主控芯片PC13引脚,电路内置限流保护元件,无需外接电阻,电路结构精简,默认低电平触发点亮、高电平熄灭。
    三、电路工作原理
    电路通电后,STM32最小系统正常上电启动,系统时钟初始化完成,GPIO端口配置为通用推挽输出模式。当对应GPIO引脚输出低电平(0V)时,3.3V电源、LED灯珠、限流电阻、GPIO引脚形成完整闭合回路,产生工作电流,LED点亮;当引脚输出高电平(3.3V)时,电路两端无电压压差,回路无电流,LED熄灭。
    通过程序循环控制PA0、PB0、PC1、PC13四个引脚的电平状态,分时拉低不同端口电平、其余端口保持高电平,即可实现四路LED依次轮流点亮、循环流水的实验效果。同时220Ω限流电阻起到核心保护作用,将回路电流控制在LED额定工作范围内,保障电路长期稳定运行。
    四、原理图设计要点

  16. 所有LED采用共地设计,电路布线规整,有效避免多路灯光串扰问题;

  17. 严格匹配限流电阻阻值,兼顾LED亮度与器件安全,无过流、欠流问题;

  18. 多端口GPIO独立布线,互不干扰,可实现单路独立控制,满足流水灯逻辑需求。
    四、程序设计思路 + 寄存器说明
    4.1 设计思路

  19. 开启 GPIO 端口时钟:RCC 寄存器,GPIOA/GPIOB/GPIOC 挂载在 APB2 总线上,打开对应端口时钟。

  20. 配置 GPIO 模式寄存器 CRL/CRH:将 PA0、PB0、PC1、PC13 设置为通用推挽输出模式,最大速度 2MHz。

  21. 输出控制:使用 ODR 输出寄存器,写 0 点亮 LED,写 1 熄灭 LED。

  22. 简单软件延时函数:循环空操作实现约 1s 延时(裸机无 SysTick,简单软件延时适合本实验)。

  23. 流水逻辑:依次点亮 1 个 LED,其余全部熄灭;延时 1s,切换下一个,循环:PA0 → PB0 → PC1 → PC13,循环往复。
    4.2 寄存器地址与详细参数(重点答题部分)
    STM32F103 内核:Cortex-M3,APB2 外设基地址 0x40010000

  24. RCC 时钟寄存器:RCC_APB2ENR

  • 地址:0x40021018
  • 位定义:
    • Bit2:IOPAEN = 1 → 开启 GPIOA 时钟
    • Bit3:IOPBEN = 1 → 开启 GPIOB 时钟
    • Bit4:IOPCEN = 1 → 开启 GPIOC 时钟
  1. GPIOA 寄存器组(基地址:0x40010800)
  • GPIOA_CRL(端口配置低寄存器):0x40010800,控制 PA0~PA7
    PA0:CNF=00 (通用推挽输出),MODE=01 (输出速度 2MHz),对应 bit0~bit3 = 0011
  • GPIOA_ODR(输出寄存器):0x4001080C,bit0 控制 PA0 输出电平
  1. GPIOB 寄存器组(基地址:0x40010C00)
  • GPIOB_CRL:0x40010C00,PB0:bit0~bit3 = 0011推挽输出 2MHz
  • GPIOB_ODR:0x40010C0C,bit0 控制 PB0
  1. GPIOC 寄存器组(基地址:0x40011000)
  • GPIOC_CRL:0x40011000,PC1 在 CRL,bit4~bit7=0011
  • GPIOC_CRH:0x40011004,PC13 在 CRH,bit20~bit23=0011
  • GPIOC_ODR:0x4001100C,bit1、bit13 分别控制 PC1、PC13
    CNF [1:0]:00 推挽输出;MODE [1:0]:01 → 2MHz 输出速度。
    五、C 语言 寄存器版完整代码(带详细注释)
    新建 main.c,直接复制,纯寄存器操作,不调用标准库函数
    //STM32F103C8T6 寄存器版本流水灯
    //PA0、PB0、PC1外接LED,PC13板载LED,轮流闪烁,间隔1s
    #include “stm32f10x.h”

//寄存器宏定义,直接映射地址
#define RCC_APB2ENR (*(volatile unsigned int *)0x40021018)

//GPIOA 寄存器
#define GPIOA_CRL (*(volatile unsigned int)0x40010800)
#define GPIOA_ODR (
(volatile unsigned int *)0x4001080C)

//GPIOB 寄存器
#define GPIOB_CRL (*(volatile unsigned int)0x40010C00)
#define GPIOB_ODR (
(volatile unsigned int *)0x40010C0C)

//GPIOC 寄存器
#define GPIOC_CRL (*(volatile unsigned int)0x40011000)
#define GPIOC_CRH (
(volatile unsigned int)0x40011004)
#define GPIOC_ODR (
(volatile unsigned int *)0x4001100C)

/**

  • @brief 软件延时函数,简单空循环,大约延时1s(72MHz系统时钟)
    */
    void Delay1s(void)
    {
    unsigned int i,j;
    for(i=0;i<1000;i++)
    for(j=0;j<7200;j++);
    }

/**

  • @brief GPIO初始化:PA0 PB0 PC1 PC13 推挽输出
    */
    void LED_GPIO_Init(void)
    {
    //1. 开启APB2端口时钟,Bit2 IOPA、Bit3 IOPB、Bit4 IOPC置1
    RCC_APB2ENR |= (1<<2) | (1<<3) | (1<<4);

    //==== GPIOA PA0配置:推挽输出,2MHz
    GPIOA_CRL &= ~(0x0F << 0); //清空PA0对应的4位
    GPIOA_CRL |= (0x03 << 0); //MODE=01,CNF=00 →0011=0x03
    GPIOA_ODR |= (1<<0); //PA0初始高电平,LED熄灭

    //==== GPIOB PB0配置:推挽输出,2MHz
    GPIOB_CRL &= ~(0x0F << 0);
    GPIOB_CRL |= (0x03 << 0);
    GPIOB_ODR |= (1<<0); //PB0初始高电平,LED熄灭

    //==== GPIOC PC1配置:推挽输出,2MHz
    GPIOC_CRL &= ~(0x0F << 4); //PC1对应bit4~bit7
    GPIOC_CRL |= (0x03 << 4);
    GPIOC_ODR |= (1<<1); //PC1初始高电平,LED熄灭

    //==== GPIOC PC13配置:推挽输出,2MHz,PC13在CRH寄存器,每组4bit,13号引脚对应第5组(bit20~23)
    GPIOC_CRH &= ~(0x0F << 20);
    GPIOC_CRH |= (0x03 << 20);
    GPIOC_ODR |= (1<<13); //PC13初始高电平,板载LED熄灭
    }

int main(void)
{
LED_GPIO_Init(); //初始化GPIO

while(1) { //第1步:点亮PA0,其余全部熄灭 GPIOA_ODR &= ~(1<<0); //PA0输出低,亮 GPIOB_ODR |= (1<<0); GPIOC_ODR |= (1<<1) | (1<<13); Delay1s(); //第2步:点亮PB0,其余熄灭 GPIOA_ODR |= (1<<0); GPIOB_ODR &= ~(1<<0); GPIOC_ODR |= (1<<1) | (1<<13); Delay1s(); //第3步:点亮PC1,其余熄灭 GPIOA_ODR |= (1<<0); GPIOB_ODR |= (1<<0); GPIOC_ODR &= ~(1<<1); GPIOC_ODR |= (1<<13); Delay1s(); //第4步:点亮PC13板载LED,其余熄灭 GPIOA_ODR |= (1<<0); GPIOB_ODR |= (1<<0); GPIOC_ODR |= (1<<1); GPIOC_ODR &= ~(1<<13); Delay1s(); }

}
六、实验步骤

  1. 硬件搭建:面包板接入 3 只 LED+220Ω 电阻,分别连接 PA0、PB0、PC1 到 LED 阳极,LED 阴极接 GND。
  2. Keil MDK 新建 STM32F103C8 工程,添加 main.c,选择芯片 STM32F103C8T6,配置 ST-LINK 下载。
  3. 编译工程,检查无报错,将程序烧录进最小系统板。
  4. 上电测试:4 个 LED 按照 PA0→PB0→PC1→PC13 顺序轮流点亮,间隔 1 秒循环。
  5. 现象观察:每时刻只有 1 个灯亮,其余熄灭,循环流水。
    七、实验现象与结果
    烧录程序上电后:

八、实验分析与问题总结

  1. PC13 板载 LED 特性:Blue Pill 板上 PC13LED 是低电平点亮,很多新手容易写反电平,出现常亮 / 不亮。
  2. 软件延时:本实验是简单循环延时,精度不高,适合演示;高精度延时需要使用 SysTick 定时器。
  3. 寄存器配置注意:CRL 控制引脚 0\7,CRH 控制引脚 8\15,PC13 属于 CRH,不能写到 CRL。
  4. 必须开启端口时钟!不开启 RCC 时钟,GPIO 寄存器无法读写,LED 完全不动作,是最常见错误。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询