2. LED闪烁控制
任务目标
在MCU上实现LED周期性闪烁控制,通过GPIO输出高低电平驱动LED,验证GPIO基本输出功能与延时逻辑的正确性。本案例以STM32F103系列为主控芯片,使用标准外设库完成寄存器级配置。
硬件连接
- LED正极串联330Ω限流电阻接至PC13(STM32F103最小系统板载LED)
- LED负极接GND
- 若使用其他GPIO引脚,需对应修改代码中的端口和引脚宏定义
完整实现代码
#include "stm32f10x.h"
#define LED_GPIO_PORT GPIOC
#define LED_GPIO_PIN GPIO_Pin_13
#define LED_GPIO_CLK RCC_APB2Periph_GPIOC
// 简单延时函数(约1ms @ 72MHz系统时钟)
void Delay_ms(uint32_t ms) {
uint32_t i, j;
for (i = 0; i < ms; i++) {
for (j = 0; j < 7200; j++) {
__NOP();
}
}
}
void LED_Init(void) {
GPIO_InitTypeDef GPIO_InitStructure;
// 使能GPIOC时钟
RCC_APB2PeriphClockCmd(LED_GPIO_CLK, ENABLE);
// 配置PC13为推挽输出,最大翻转速度2MHz
GPIO_InitStructure.GPIO_Pin = LED_GPIO_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(LED_GPIO_PORT, &GPIO_InitStructure);
}
int main(void) {
LED_Init();
while (1) {
GPIO_SetBits(LED_GPIO_PORT, LED_GPIO_PIN); // LED灭(高电平)
Delay_ms(500);
GPIO_ResetBits(LED_GPIO_PORT, LED_GPIO_PIN); // LED亮(低电平)
Delay_ms(500);
}
}
编译与烧录
- 工程配置:使用Keil MDK或IAR创建STM32F103C8工程,添加上述代码及标准外设库文件(stm32f10x_gpio.c、stm32f10x_rcc.c)。
- 编译:选择芯片型号STM32F103C8,勾选"Use MicroLIB"以减少代码体积,编译生成HEX文件。
- 烧录:通过ST-Link或串口ISP将HEX文件下载至MCU。
验证方法
- 观察现象:上电后板载LED应以约1Hz频率(每500ms翻转一次)持续闪烁。
- 逻辑分析仪验证(可选):将探头接至PC13,应测得周期为1s、占空比50%的方波信号。
- 通过标准:LED闪烁周期误差在±20%以内(即0.8s~1.2s),且持续运行无异常,即可判定GPIO输出功能正常。
常见问题
- LED不亮:检查LED极性是否接反,或GPIO配置是否与硬件连接一致。
- 闪烁频率异常:若系统时钟不是72MHz,需调整Delay_ms中的内层循环次数(7200 ≈ 72MHz/10kHz)。
- 编译报错:确认已包含标准外设库头文件路径,并正确添加对应.c源文件。
上图展示了PC13引脚输出波形的时序关系:高电平期间LED熄灭,低电平期间LED点亮,每个状态持续500ms,形成周期为1s的闪烁效果。