1. GPIO输出控制LED闪烁
任务目标
使用STM32F103系列微控制器的GPIO引脚驱动一个LED,使其以1Hz频率闪烁(即每500ms翻转一次电平)。通过本案例掌握GPIO输出模式的配置方法以及基础延时函数的实现。
硬件准备
- STM32F103C8T6最小系统板(蓝色药丸板)
- LED一个(推荐红色,工作电压2V,电流5-10mA)
- 限流电阻一个(220Ω~1kΩ均可)
- 面包板及杜邦线若干
接线方式:LED阳极通过限流电阻连接至PC13引脚,阴极接地。PC13为STM32F103C8T6板载LED所在引脚,若使用外部LED,接线方式相同。
软件环境
- STM32CubeIDE 或 Keil MDK-ARM(本文以STM32CubeIDE为例)
- STM32CubeMX固件包(F1系列)
- 标准外设库或HAL库(本案例使用HAL库)
核心代码实现
以下代码基于STM32CubeMX生成的HAL工程,在main.c中完成LED闪烁逻辑。若使用寄存器操作,原理相同,仅配置方式不同。
/* main.c - 关键代码部分 */
/* 私有变量定义 */
GPIO_InitTypeDef GPIO_InitStruct = {0};
/* GPIO端口时钟使能 */
__HAL_RCC_GPIOC_CLK_ENABLE();
/* 配置PC13为推挽输出模式 */
GPIO_InitStruct.Pin = GPIO_PIN_13;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; // 推挽输出
GPIO_InitStruct.Pull = GPIO_NOPULL; // 无上下拉
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; // 低速即可
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
/* 主循环 */
while (1)
{
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET); // LED亮(低电平有效)
HAL_Delay(500); // 延时500ms
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_SET); // LED灭
HAL_Delay(500); // 延时500ms
}
若使用寄存器方式实现,核心代码等价于:
/* 寄存器版本 - 仅展示关键配置 */
RCC->APB2ENR |= RCC_APB2ENR_IOPCEN; // 使能GPIOC时钟
GPIOC->CRH &= ~(0xF << 20); // 清除CNF13[1:0]和MODE13[1:0]
GPIOC->CRH |= (0x2 << 20); // CNF=10(推挽输出), MODE=10(2MHz)
while (1)
{
GPIOC->BSRR = GPIO_BSRR_BR13; // 置低电平,LED亮
Delay_ms(500);
GPIOC->BSRR = GPIO_BSRR_BS13; // 置高电平,LED灭
Delay_ms(500);
}
编译与烧录
- 在STM32CubeIDE中创建新工程,选择芯片型号STM32F103C8Tx。
- 将上述代码填入
main.c的对应位置(HAL版本需保留CubeMX生成的初始化代码)。 - 点击编译按钮(锤子图标),确认无错误。
- 通过ST-Link或USB转串口(需配合Bootloader)连接开发板,点击烧录按钮。
验证方法
烧录成功后,观察LED状态:
- LED应以1Hz频率(每秒一次)交替亮灭,即亮500ms、灭500ms。
- 若LED常亮或常灭,检查接线极性(PC13低电平点亮)及GPIO配置是否正确。
- 若闪烁频率明显偏快或偏慢,检查HAL_Delay的时钟配置——系统时钟应为72MHz(HAL库默认配置)。
通过条件:LED稳定地以约1Hz频率闪烁,无异常发热或复位现象。
常见问题
- LED不亮:检查限流电阻是否过大(超过10kΩ可能导致电流不足),或LED引脚接反。
- 编译报错:确认已包含
stm32f1xx_hal_gpio.h头文件,且HAL库已正确初始化(调用HAL_Init()和SystemClock_Config())。 - 延时不准:若使用寄存器版本,需确保系统时钟配置为72MHz,否则延时函数需按实际时钟调整。