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
添加宏:

STM32F10X_MD
USE_STDPERIPH_DRIVER

3.添加库文件
把下列文件放入 Src/Inc 并加入编译:

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

四、核心源码

#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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值