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);
    }
}

编译与运行

  1. 创建STM32标准外设库工程,将上述代码放入main.c,并确保系统时钟已配置为72MHz(可使用SystemInit()默认配置)。
  2. 编译工程,通过ST-Link或J-Link将生成的HEX文件烧录至STM32F103开发板。
  3. 开发板上电或复位后,程序自动开始运行。

验证方法

观察PC13引脚连接的LED是否以1Hz频率闪烁(亮500ms、灭500ms)。若LED不亮或常亮/常灭,依次检查:

  • GPIO时钟是否已使能(RCC_APB2PeriphClockCmd调用是否正确);
  • 引脚号与硬件连接是否一致(本案例为PC13);
  • 延时函数是否因系统时钟不同而偏差过大(若使用8MHz内部时钟,需将内层循环次数改为800)。

判定通过条件:LED以肉眼可见的稳定节奏每秒闪烁一次(亮灭各占0.5秒),且无异常发热或引脚冲突。

关键说明

本案例的延时函数基于循环指令周期估算,未使用定时器中断,适用于对时序精度要求不高的LED闪烁场景。若需精确延时,应改用SysTick定时器或硬件定时器,但本案例目标仅需实现1Hz闪烁,循环延时已足够。PC13在多数开发板上连接板载LED,且低电平点亮,代码中已按此逻辑编写。