5.1 GPIO输入项目:按键控制LED灯亮灭

# 5.1 GPIO输入项目:按键控制LED灯亮灭

本项目通过GPIO实现按键控制蜂鸣器的交互功能。PC13连接按键(常态高电平,触发低电平),PB5驱动无源蜂鸣器(初始低电平)。软件采用轮询检测按键状态,通过消抖处理确保触发有效,生成方波驱动蜂鸣器发声,实现"按下发声-松开静音"的精准控制。

# 5.1.1 硬件设计

# 按键电路

  • 常开型设计:KEY1~KEY4共地连接,经10KΩ上拉电阻接入PC13/PB12/PB14/PB15,并联电容抑制抖动。
    按键开关硬件电路

# 蜂鸣器电路

  • 无源蜂鸣器驱动:PB5通过NPN三极管控制电流通路,输出方波驱动发声。
    蜂鸣器硬件电路

# 5.1.2 STM32CubeMX配置

# 1. 新建工程

创建工程"05 GPIO_INPUT",选择芯片STM32F103C8T6:
设置工程名称

# 2. 配置Debug模式

启用SWD调试功能:
Debug模式配置

# 3. 引脚配置

  • PC13设为GPIO_Input(标签KEY1)
  • PB5设为GPIO_Output(标签BEEP)
    I/O引脚配置图

# 4. 生成代码

勾选生成外设独立文件:
勾选生成单独外设文件

# 5.1.3 软件设计

# 1. 变量初始化

定义消抖时间及状态变量:

/* USER CODE BEGIN PD */
#define DEBOUNCE_TIME 100   // 消抖时间(ms)
/* USER CODE END PD */

/* USER CODE BEGIN PV */
volatile uint8_t beep_state = 0;  // 蜂鸣器状态(0关闭,1开启)
volatile uint32_t key_press_time = 0; // 按键计时
/* USER CODE END PV */
1
2
3
4
5
6
7
8

# 2. 主循环逻辑

实现按键检测、消抖处理与蜂鸣器控制:

while (1)
{
  // 检测按键按下(低电平有效)
  if (HAL_GPIO_ReadPin(KEY1_GPIO_Port, KEY1_Pin) == GPIO_PIN_RESET) {
    key_press_time = HAL_GetTick();
    // 消抖检测
    while(HAL_GetTick() - key_press_time < DEBOUNCE_TIME){
      if (HAL_GPIO_ReadPin(KEY1_GPIO_Port, KEY1_Pin)) {
        break;
      }
    }
    // 确认有效触发
    if (HAL_GPIO_ReadPin(KEY1_GPIO_Port, KEY1_Pin) == GPIO_PIN_RESET) {
      // 等待按键释放并生成方波
      while(HAL_GPIO_ReadPin(KEY1_GPIO_Port, KEY1_Pin) == GPIO_PIN_RESET) {
        beep_state ^= 1;
        HAL_GPIO_WritePin(BEEP_GPIO_Port, BEEP_Pin, beep_state ? GPIO_PIN_SET : GPIO_PIN_RESET);
        HAL_Delay(1);
      }
    }
  }
  HAL_Delay(10);  // 降低CPU占用
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

# 5.1.4 项目验证

  • 现象:按下KEY1蜂鸣器持续发声,松开即停止。
  • 视频演示