STM32F103 按键控制LED灯

STM32F103C8T6 最小系统开发板使用 HAL 库通过 PC12 按键控制 PC13 LED

1. 项目概述

在本项目中,我们将使用 STM32F103C8T6 最小系统开发板,通过 HAL(Hardware Abstraction Layer)库 实现 PC12 按键控制 PC13 LED 的亮灭

2. 硬件设计

1. 硬件需求

  1. STM32F103C8T6 最小系统开发板
  2. STLink-V2 下载器(用于烧录程序)
  3. 杜邦线
  4. LED(若开发板无板载 LED)
  5. 220Ω 电阻(若使用外部 LED)
  6. 按键(若开发板无板载按键)
  7. 10kΩ 上拉电阻(若使用外部按键)

2. 硬件连接

  1. PC13 → LED 正极
  2. LED 负极 → 220Ω 电阻 → GND
  3. PC12 → 按键
  4. 按键另一端 → GND
  5. PC12 上拉 10kΩ 电阻 → VCC

3. 软件设计

1. STM32 HAL 库简介

HAL 库是 ST 官方提供的 硬件抽象库,封装了底层寄存器操作,使开发更加简单。

2. 工程创建步骤(基于 STM32CubeMX)

  1. 打开 STM32CubeMX,创建新工程,选择 STM32F103C8T6
  2. 配置 PC13 作为 GPIO 输出模式
    • 找到 "PC13",设置为 GPIO_Output
  3. 配置 PC12 作为 GPIO 输入模式
    • 找到 "PC12",设置为 GPIO_Input,启用 上拉模式
  4. 配置时钟(默认 72MHz,无需修改)。
  5. 生成代码,选择 IDE 为 STM32CubeIDE 或 Keil

4. 代码实现

1. main.c 代码

#include "main.h"

void SystemClock_Config(void);
static void MX_GPIO_Init(void);

int main(void)
{
    HAL_Init();             // 1.初始化 HAL 库
    SystemClock_Config();   // 2.配置  系统时钟
    MX_GPIO_Init();         // 3.初始化 GPIO

    while (1)
    {
        if (HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_12) == GPIO_PIN_RESET)     // 读取 PC12 按键 状态
        {
            HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13);                     // 翻转 PC13 LED 状态
            HAL_Delay(300);                                             // 延时处理
            while (HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_12) == GPIO_PIN_RESET);  // 等待按键释放
        }
    }
}

/**
  * @brief GPIO 初始化
  */
static void MX_GPIO_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStruct = {0};
    __HAL_RCC_GPIOC_CLK_ENABLE();  // 使能 GPIOC 时钟
    
    // 配置 PC13 为推挽输出
    GPIO_InitStruct.Pin = GPIO_PIN_13;
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);                 // 初始化 GPIOC

    HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_SET);    // 默认关闭 LED
    
    // 配置 PC12 为上拉输入模式
    GPIO_InitStruct.Pin = GPIO_PIN_12;
    GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
    GPIO_InitStruct.Pull = GPIO_PULLUP;
    HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);                 // 初始化 GPIOC
}

2. 代码解析

  1. HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_12) == GPIO_PIN_RESET:检测按键是否被按下。
  2. HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13):每次按键按下 切换 LED 状态
  3. HAL_Delay(300):简单消抖,避免按键抖动误触。
  4. while (HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_12) == GPIO_PIN_RESET);:等待按键释放,避免重复触发。

5. 烧录与测试

  1. 连接 STLink-V2
    • STLink-V2 SWDIO → STM32 SWDIO
    • STLink-V2 SWCLK → STM32 SWCLK
    • STLink-V2 GND → STM32 GND
    • STLink-V2 3.3V → STM32 3.3V
  2. 使用 STM32CubeProgrammer 或 Keil 进行烧录
  3. 烧录完成后,按下 RESET 运行程序

6. 总结

本教程介绍了 STM32F103C8T6 最小系统开发板 通过 PC12 按键控制 PC13 LED 亮灭 的详细过程,包括 硬件设计、软件配置、代码编写、烧录步骤,适用于 STM32 HAL 库 开发。希望能帮助你快速入门 STM32 按键控制 LED 的开发!

posted @ 2025-02-07 11:26  jeikerxiao  阅读(392)  评论(0)    收藏  举报