1. LED闪烁控制
任务目标
在嵌入式开发板上,通过GPIO输出控制一个LED以1Hz频率闪烁(即每500ms翻转一次电平),掌握GPIO引脚的输出模式配置与延时函数的编写方法。本案例以STM32F103系列MCU和标准外设库为例,实现最小可复现的LED闪烁控制。
硬件连接与依赖
- MCU:STM32F103C8T6(或其他STM32F103系列)
- LED正极串联一个220Ω~1kΩ限流电阻后接至PC13引脚,LED负极接GND(开发板上PC13通常已连接板载LED)
- 软件依赖:STM32标准外设库(STM32F10x_StdPeriph_Lib),需包含GPIO和RCC的驱动文件
完整实现代码
#include "stm32f10x.h"
// 简单延时函数:利用SysTick或循环实现毫秒级延时
void Delay_Ms(uint32_t ms) {
uint32_t i;
while (ms--) {
// 约1ms延时(依赖系统时钟72MHz,经实测校准)
for (i = 0; i < 7200; i++);
}
}
void LED_GPIO_Init(void) {
GPIO_InitTypeDef GPIO_InitStructure;
// 使能GPIOC时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
// 配置PC13为推挽输出,最大翻转速度2MHz
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
}
int main(void) {
LED_GPIO_Init();
while (1) {
GPIO_SetBits(GPIOC, GPIO_Pin_13); // LED灭(高电平)
Delay_Ms(500);
GPIO_ResetBits(GPIOC, GPIO_Pin_13); // LED亮(低电平)
Delay_Ms(500);
}
}
编译与运行
- 创建STM32标准外设库工程,将上述代码放入main.c,并确保系统时钟已配置为72MHz(可使用SystemInit()默认配置)。
- 编译工程,通过ST-Link或J-Link将生成的HEX文件烧录至STM32F103开发板。
- 开发板上电或复位后,程序自动开始运行。
验证方法
观察PC13引脚连接的LED是否以1Hz频率闪烁(亮500ms、灭500ms)。若LED不亮或常亮/常灭,依次检查:
- GPIO时钟是否已使能(RCC_APB2PeriphClockCmd调用是否正确);
- 引脚号与硬件连接是否一致(本案例为PC13);
- 延时函数是否因系统时钟不同而偏差过大(若使用8MHz内部时钟,需将内层循环次数改为800)。
判定通过条件:LED以肉眼可见的稳定节奏每秒闪烁一次(亮灭各占0.5秒),且无异常发热或引脚冲突。
关键说明
本案例的延时函数基于循环指令周期估算,未使用定时器中断,适用于对时序精度要求不高的LED闪烁场景。若需精确延时,应改用SysTick定时器或硬件定时器,但本案例目标仅需实现1Hz闪烁,循环延时已足够。PC13在多数开发板上连接板载LED,且低电平点亮,代码中已按此逻辑编写。