一、需求 & 最終效果
- 硬件: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 |