当前位置: 首页 > ai >正文

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
http://www.xdnf.cn/news/18859.html

相关文章:

  • 【C++】菱形继承深度解析+实际内存分布
  • 2025.8.27链表_链表逆置
  • 科技赋能生态,智慧守护农林,汇岭生态开启农林产业现代化新篇章
  • TensorFlow 面试题及详细答案 120道(21-30)-- 模型构建与神经网络
  • 斯塔克工业技术日志:用基础模型打造 “战甲级” 结构化 AI 功能
  • uniapp H5禁止微信浏览器长按出菜单,只针对图片
  • 全球首款Al勒索软件PromptLock:跨平台攻击新威胁, Windows/macOs/Linux均受影响
  • 【生产事故处理--kafka日志策略保留】
  • 深入解析达梦数据库:模式分类、状态管理与实操指南
  • 【数据分享】安徽省安庆市地理基础数据(道路、水系、铁路、行政边界(含乡镇)、DEM等)
  • 如何用Renix实现网络测试自动化: 从配置分离到多厂商设备支持
  • WebConfig的登录与放行
  • 对比视频处理单元(VPU)、图形处理器(GPU)与中央处理器(CPU)
  • 前端-从零开始在本机部署一个前端项目
  • 流程控制语句(1)
  • Dify 从入门到精通(第 59/100 篇):Dify 的自动化测试(进阶篇)
  • 野火STM32Modbus主机读取寄存器/线圈失败(一)-解决接收中断不触发的问题
  • 嵌入式-定时器的时基单元,自制延迟函数-Day21
  • AI驱动的前端性能优化:从监控到自动化修复
  • C# 字符和字符串
  • 《信息检索与论文写作》实验报告三 中文期刊文献检索
  • 【算法速成课1 | 题解】洛谷P3366 【模板】最小生成树 MST(Prim Kruskal)
  • GitHub 宕机自救指南:保障开发工作连续性
  • Android中点击链接跳转到对应App页面的底层原理
  • 信号线串扰仿真
  • 【C++】类和对象 --- 类中的6个默认成员函数
  • 达梦数据库-控制文件 (二)
  • 如何在开发工具中使用钉钉MCP
  • 数据结构:在堆中插入元素(Inserting In a Heap)
  • 深度学习-----详解MNIST手写数字数据集的神经网络实现过程