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

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.dtcms.com/a/353077.html

相关文章:

  • Git-远程操作
  • 基于 Node.js 的淘宝 API 接口开发:快速构建异步数据采集服务
  • SFTP服务器可以通过同一个登录到SFTP服务器的账号密码连接上控制台吗
  • 【0420】Postgres内核 实现(借助 SMgrRelation)为指定 table(CREATE TABLE)创建 disk file
  • android证书相关
  • 天启录:Linux性能调优·混沌掌控者篇
  • Android中AAR、JAR文件
  • 具身导航助力果园种植!基于模仿学习的果园环境无人机视觉导航
  • Spring Boot项目集成日志系统使用完整指南
  • R-Zero:通过自博弈机制让大语言模型无需外部数据实现自我进化训练
  • Flutter桌面应用实战:Windows系统代理切换工具开发
  • 集成电路学习:什么是SSD单发多框检测器
  • 线性回归原理推导与应用(十一):多重共线性
  • 20250827的学习笔记
  • Kubernetes(k8s) 常用命令
  • 从零开始学习JavaWeb-19
  • 解决跨运营商限速:在飞牛OS系统上启用BBR算法优化网络速度
  • 数据结构:单链表的应用(力扣算法题)第一章
  • 腾讯云人脸识别API技术深度解析:从算法原理到工程实践
  • Diagnosing bias and variance|诊断偏差和方差
  • 文件系统中的核心数据结构
  • 链表-25.k个一组翻转链表-力扣(LeetCode)
  • 镜中万象:论观察即存在的递归拓扑与生命的意识本质
  • FPGA的工作原理
  • AI赋能CRM:纷享销客访销大脑重构快消品销售策略
  • d435i相机读取镜头内参和相对之间的外参
  • 三方相机问题分析八:【返帧异常导致性能卡顿】Snapchat后置使用特效预览出现卡顿
  • Jmeter5.3性能测试:文件下载脚本编写后,导出文件的接收
  • 第五章:Go运行时、内存管理与性能优化之栈与堆内存分配 (逃逸分析)
  • 在语言模型监督式微调(SFT)中的 负对数似然(Negative Log-Likelihood, NLL)等价于最大化似然