1. 点亮LED

点亮LED 学习卡片

任务说明

本案例目标为最小系统验证:在一块可用的MCU最小系统板上,通过GPIO输出控制点亮一颗LED。完成本案例即证明MCU的电源、时钟、复位、调试接口及GPIO外设均工作正常,是后续所有硬件调试的基础。

硬件连接

以STM32F103C8T6蓝色药丸板为例,板载LED(PC13)已连接至GPIO PC13,低电平点亮。若使用自定义板,请按下表连接:

MCU引脚LED阳极LED阴极限流电阻
PC13通过电阻接PC13GND330Ω~1kΩ
验证观测点:LED点亮/熄灭状态、电源指示灯、调试器连接状态。

SVG:最小系统验证拓扑

STM32F103C8T6 3.3V / GND SWD: SWDIO, SWCLK PC13 (GPIO 输出) LED 阳极 ── 电阻 ── PC13 阴极 ── GND 控制信号 ST-Link SWD 调试器 SWD 3.3V 电源 VDD/GND

软件实现

使用STM32标准外设库,直接操作GPIO寄存器实现最小代码量。核心逻辑:使能GPIOC时钟→配置PC13为推挽输出→循环翻转PC13电平。

/* main.c — 最小系统验证:点亮LED (PC13) */
#include "stm32f10x.h"

void delay(void) {
    volatile uint32_t i;
    for (i = 0; i < 500000; i++);  /* 软件延时 */
}

int main(void) {
    /* 1. 使能 GPIOC 时钟 (APB2) */
    RCC->APB2ENR |= RCC_APB2ENR_IOPCEN;

    /* 2. 配置 PC13 为推挽输出,最大速度 2MHz */
    GPIOC->CRH &= ~(GPIO_CRH_MODE13 | GPIO_CRH_CNF13);
    GPIOC->CRH |= GPIO_CRH_MODE13_1;   /* 输出模式,2MHz */
    /* CNF13 = 00 → 通用推挽输出 */

    while (1) {
        GPIOC->BSRR = GPIO_BSRR_BR13;   /* 置低电平 → LED 亮 */
        delay();
        GPIOC->BSRR = GPIO_BSRR_BS13;   /* 置高电平 → LED 灭 */
        delay();
    }
}

工程配置与烧录

依赖:STM32F10x标准外设库(仅需启动文件与系统时钟初始化)。若使用Keil MDK,创建工程时选择芯片型号STM32F103C8,添加上述main.c及启动文件startup_stm32f10x_md.s。

/* 编译烧录命令(使用STM32CubeProgrammer或ST-Link工具) */
# 使用 ST-Link 烧录生成的 .hex 文件
STM32_Programmer_CLI -c port=SWD mode=UR -w build/led.hex -v

验证方法与判定标准

  1. 硬件检查:上电后板载电源指示灯亮,3.3V电压正常。
  2. 烧录验证:烧录过程无错误,提示“Download verified successfully”。
  3. 功能判定:观察LED以约1Hz频率闪烁(亮灭各约0.5秒)。若LED常亮或常灭,检查PC13连接极性及GPIO配置是否正确。
  4. 调试接口验证:使用ST-Link连接后,在Keil中点击“Download”能识别芯片ID(0x410),说明SWD通信正常。

判定标准:LED按预期频率闪烁即表示最小系统(电源、时钟、复位、GPIO)全部工作正常,本案例通过。