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 |
延时误差大 | 空循环不精确 | 后期换 SysTick 或 TIM2 |