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 点亮(具体效果与硬件接法有关)。

img


三、软件设计

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 闪烁一次。


五、总结

本实验主要内容:

  1. 熟悉了 标准外设库配置 GPIO 的流程
  2. 学习了 SysTick 定时器实现延时的方法
  3. 掌握了多种 GPIO 输出控制方式(GPIO_SetBitsGPIO_ResetBitsGPIO_WriteBit

这是 STM32 学习中非常经典的入门实验,后续可以在此基础上扩展,例如:控制多个 LED、蜂鸣器,或者利用外部中断实现按键控制 LED。

posted @ 2025-08-30 11:28  jeikerxiao  阅读(92)  评论(0)    收藏  举报