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调试功能:
# 3. 引脚配置
- PC13设为GPIO_Input(标签KEY1)
- PB5设为GPIO_Output(标签BEEP)
# 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
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
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蜂鸣器持续发声,松开即停止。
- 视频演示: