STM32 入门实录:从 0 到 3 色 LED 呼吸式闪烁

一、需求 & 最终效果

  • 硬件:Blue-Pill(STM32F103C8T6)+ 3 只 LED(红 PA0、黄 PA1、绿 PA2)
  • 现象:上电后红→黄→绿→黄→全灭,每步 100 ms,循环往复。

二、硬件连接

LED 端 连接 说明
阴极 GND 共阴极接法
阳极 PA0 / PA1 / PA2 串 330 Ω 电阻

若为 共阳极,把 GPIO_SetBits/ResetBits 互换即可。

三、工程准备(CubeIDE 3 步)

1. 新建工程

File → New → STM32 Project → 搜索 STM32F103C8Tx → Finish

2. 解决库缺失

Project → Properties → C/C++ Build → Settings → MCU GCC Compiler → Preprocessor

添加宏:

c 复制代码
STM32F10X_MD
USE_STDPERIPH_DRIVER

3.添加库文件

把下列文件放入 Src/Inc 并加入编译:

c 复制代码
stm32f10x_gpio.c/.h
stm32f10x_rcc.c/.h
misc.c/.h

四、核心源码

c 复制代码
#include "stm32f10x.h"

#define RED_LIGHT    GPIO_Pin_0
#define YELLOW_LIGHT GPIO_Pin_1
#define GREEN_LIGHT  GPIO_Pin_2
#define ALL_LIGHTS   (RED_LIGHT | YELLOW_LIGHT | GREEN_LIGHT)

static void delay_ms(uint32_t ms)
{
    /* 72 MHz ≈ 18000 次/1 ms,实测微调 */
    while (ms--)
        for (volatile uint32_t i = 0; i < 18000; i++);
}

int main(void)
{
    /* 1. 时钟 */
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

    /* 2. GPIO 配置 */
    GPIO_InitTypeDef gpio = {
        .GPIO_Pin   = ALL_LIGHTS,
        .GPIO_Mode  = GPIO_Mode_Out_PP,
        .GPIO_Speed = GPIO_Speed_50MHz
    };
    GPIO_Init(GPIOA, &gpio);

    /* 3. 全灭(共阳:高电平灭) */
    GPIO_SetBits(GPIOA, ALL_LIGHTS);

    /* 4. 流水灯序列 */
    const uint16_t seq[] = {RED_LIGHT, YELLOW_LIGHT, GREEN_LIGHT, YELLOW_LIGHT};
    const uint8_t  len   = sizeof(seq) / sizeof(seq[0]);

    while (1)
    {
        for (uint8_t i = 0; i < len; i++)
        {
            GPIO_ResetBits(GPIOA, seq[i]);   // 亮
            delay_ms(100);
            GPIO_SetBits(GPIOA, seq[i]);     // 灭
        }
    }
}

五、编译 & 烧录

  • Build(锤子图标)→ Run → 选择 ST-Link(OpenOCD)
  • Console 出现 Programming Finished & Verify OK 即成功。

【CSDN 原创】STM32F103 流水灯实战:从 0 到 3 色 LED 呼吸式闪烁

------基于标准外设库(SPL)+ 寄存器级优化

作者:Ryan | 日期:2024-08-25

关键词:STM32F103、标准外设库、GPIO、流水灯、延时、寄存器

一、需求 & 最终效果

复制代码
硬件:Blue-Pill(STM32F103C8T6)+ 3 只 LED(红 PA0、黄 PA1、绿 PA2)
现象:上电后红→黄→绿→黄→全灭,每步 100 ms,循环往复。
视频:文末 GIF 演示(已上传)。

二、硬件连接

表格

复制

LED 端 连接 说明

阴极 GND 共阴极接法

阳极 PA0 / PA1 / PA2 串 330 Ω 电阻

复制代码
若为 共阳极,把 GPIO_SetBits/ResetBits 互换即可。

三、工程准备(CubeIDE 3 步)

复制代码
新建工程
File → New → STM32 Project → 搜索 STM32F103C8Tx → Finish
解决库缺失
Project → Properties → C/C++ Build → Settings → MCU GCC Compiler → Preprocessor
添加宏:

复制

STM32F10X_MD

USE_STDPERIPH_DRIVER

添加库文件

把下列文件放入 Src/Inc 并加入编译:

复制代码
复制

stm32f10x_gpio.c/.h
stm32f10x_rcc.c/.h
misc.c/.h

四、核心源码

c

复制

#include "stm32f10x.h"

#define RED_LIGHT GPIO_Pin_0

#define YELLOW_LIGHT GPIO_Pin_1

#define GREEN_LIGHT GPIO_Pin_2

#define ALL_LIGHTS (RED_LIGHT | YELLOW_LIGHT | GREEN_LIGHT)

static void delay_ms(uint32_t ms)

{

/* 72 MHz ≈ 18000 次/1 ms,实测微调 */

while (ms--)

for (volatile uint32_t i = 0; i < 18000; i++);

}

int main(void)

{

/* 1. 时钟 */

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

复制代码
/* 2. GPIO 配置 */
GPIO_InitTypeDef gpio = {
    .GPIO_Pin   = ALL_LIGHTS,
    .GPIO_Mode  = GPIO_Mode_Out_PP,
    .GPIO_Speed = GPIO_Speed_50MHz
};
GPIO_Init(GPIOA, &gpio);

/* 3. 全灭(共阳:高电平灭) */
GPIO_SetBits(GPIOA, ALL_LIGHTS);

/* 4. 流水灯序列 */
const uint16_t seq[] = {RED_LIGHT, YELLOW_LIGHT, GREEN_LIGHT, YELLOW_LIGHT};
const uint8_t  len   = sizeof(seq) / sizeof(seq[0]);

while (1)
{
    for (uint8_t i = 0; i < len; i++)
    {
        GPIO_ResetBits(GPIOA, seq[i]);   // 亮
        delay_ms(100);
        GPIO_SetBits(GPIOA, seq[i]);     // 灭
        delay_ms(100);
    }
}

}

五、编译 & 烧录

  • Build(锤子图标)→ Run → 选择 ST-Link(OpenOCD)
  • Console 出现 Programming Finished & Verify OK 即成功。

六、踩坑记录

现象 根因 解决
undefined reference to assert_param 未定义宏 添加 STM32F10X_MD + USE_STDPERIPH_DRIVER
灯不亮 共阳极接反 互换 SetBits/ResetBits
延时误差大 空循环不精确 后期换 SysTickTIM2