STM32F103(标准库)LED 闪烁实验
STM32F103(标准库)LED 闪烁实验
在 STM32 的学习过程中,点亮第一个 LED 是一个“Hello World” 级别的实验。通过这个实验,可以帮助我们快速熟悉 GPIO 的配置流程以及延时函数的使用。本文将基于 STM32F103 标准外设库,实现一个 LED 的闪烁程序。
一、实验目标
- 使用 STM32F103 最小系统板(或开发板)
- 通过标准外设库配置 GPIO 引脚
- 控制 PA0 引脚输出高低电平,实现 LED 闪烁
- 使用 SysTick 定时器实现延时函数
二、硬件准备
- STM32F103C8T6 最小系统板
- LED + 电阻(也可直接使用开发板自带 LED)
- 下载器(ST-LINK 或 J-Link)
接线方式:
- PA0 → LED → 电阻 → GND
当 PA0 输出高电平时,LED 熄灭;
输出低电平时,LED 点亮(具体效果与硬件接法有关)。

三、软件设计
1. 主函数代码
#include "stm32f10x.h" // Device header
#include "Delay.h"
int main(void)
{
// 开启 GPIOA 时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
// 配置 PA0 为推挽输出
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 推挽输出
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; // 选择 PA0
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 输出速度 50MHz
GPIO_Init(GPIOA, &GPIO_InitStructure); // 初始化 GPIOA
while (1)
{
// 写法1:直接调用 Reset/SetBits
GPIO_ResetBits(GPIOA, GPIO_Pin_0); // PA0 = 0
Delay_ms(500);
GPIO_SetBits(GPIOA, GPIO_Pin_0); // PA0 = 1
Delay_ms(500);
// 写法2:使用 WriteBit,指定高低电平
GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_RESET);
Delay_ms(500);
GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_SET);
Delay_ms(500);
// 写法3:使用强制转换,直接写入 0/1
GPIO_WriteBit(GPIOA, GPIO_Pin_0, (BitAction)0);
Delay_ms(500);
GPIO_WriteBit(GPIOA, GPIO_Pin_0, (BitAction)1);
Delay_ms(500);
}
}
在这个程序中,分别展示了三种常见的 GPIO 控制写法。效果完全一样,只是代码风格不同。
2. 延时头文件(Delay.h)
#ifndef __DELAY_H
#define __DELAY_H
#include "stm32f10x.h"
void Delay_us(uint32_t us);
void Delay_ms(uint32_t ms);
void Delay_s(uint32_t s);
#endif
3. 延时函数实现(Delay.c)
#include "stm32f10x.h"
/**
* @brief 微秒级延时
* @param xus 延时时长,范围:0~233015
*/
void Delay_us(uint32_t xus)
{
SysTick->LOAD = 72 * xus; // 重装值
SysTick->VAL = 0x00; // 清空计数器
SysTick->CTRL = 0x00000005; // 选择时钟源,启动定时器
while(!(SysTick->CTRL & 0x00010000)); // 等待计数到 0
SysTick->CTRL = 0x00000004; // 关闭定时器
}
/**
* @brief 毫秒级延时
* @param xms 延时时长
*/
void Delay_ms(uint32_t xms)
{
while(xms--)
{
Delay_us(1000);
}
}
/**
* @brief 秒级延时
* @param xs 延时时长
*/
void Delay_s(uint32_t xs)
{
while(xs--)
{
Delay_ms(1000);
}
}
这里我们利用 SysTick 定时器实现延时。由于系统时钟为 72MHz,因此 Delay_us 中每个微秒需要 72 个时钟周期。
四、运行效果
将程序下载到 STM32F103C8T6 开发板后,PA0 引脚会周期性输出高低电平,LED 每隔 500ms 闪烁一次。
五、总结
本实验主要内容:
- 熟悉了 标准外设库配置 GPIO 的流程
- 学习了 SysTick 定时器实现延时的方法
- 掌握了多种 GPIO 输出控制方式(
GPIO_SetBits、GPIO_ResetBits、GPIO_WriteBit)
这是 STM32 学习中非常经典的入门实验,后续可以在此基础上扩展,例如:控制多个 LED、蜂鸣器,或者利用外部中断实现按键控制 LED。

浙公网安备 33010602011771号