蓝桥杯嵌入式学习笔记按键
时间: 2025-04-16 17:39:21 浏览: 31
### 蓝桥杯嵌入式竞赛中按键操作的学习笔记
#### 按键硬件连接与初始化
STM32单片机上的四个按键分别连接至PB0~PB2以及PA0引脚。这些按键的一端通过外部上拉电阻连接到电源,另一端接地。当按键被按下时,对应的GPIO引脚电平会被拉低[^1]。
```c
// 初始化GPIO引脚用于按键输入
void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
/* Configure PB0-PB2 and PA0 as input with pull-up */
GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_PULLUP;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
GPIO_InitStruct.Pin = GPIO_PIN_0;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}
```
#### 中断优先级处理
为了防止在按键消抖过程中受到其他中断的影响,特别是SysTick定时器的中断,应当调整其相对于外部中断线(EXTI)的优先级。确保SysTick中断具有更高的抢占优先级可以有效避免因毛刺引起的误触发问题[^2]。
```c
// 配置SysTick中断优先级高于按键中断
void SystemClock_Config(void)
{
...
// 设置SysTick中断优先级为最高
NVIC_SetPriority(SysTick_IRQn, 0);
...
}
```
#### 定时扫描机制实现消抖及长短按识别
采用滴答计数器(Tick Timer),即每过一定周期(如10毫秒),执行一次按键状态检查。这种方法不仅能够完成基本的去抖动工作,还可以区分短按和长按事件。对于长时间保持按下的情况,可以通过记录连续几次扫描期间按键的状态来判定具体的动作类型[^3]。
```c
volatile uint8_t key_status = KEY_RELEASED; // 当前按键状态,默认释放态
volatile uint16_t press_duration = 0; // 按下持续时间计数值
/* 私有化的按键检测函数 */
static void KeyScan(void)
{
static uint8_t last_key_state = KEY_RELEASED;
if (HAL_GPIO_ReadPin(KEY_BUTTON_PORT, KEY_BUTTON_PIN) == GPIO_PIN_RESET)
{
if (last_key_state != KEY_PRESSED)
press_duration = 0; // 清零计数器
++press_duration; // 更新计数器
last_key_state = KEY_PRESSED;
if(press_duration >= SHORT_PRESS_THRESHOLD &&
press_duration < LONG_PRESS_THRESHOLD)
{
key_status = KEY_SHORT_PRESS;
}
else if(press_duration >= LONG_PRESS_THRESHOLD)
{
key_status = KEY_LONG_PRESS;
}
}else{
last_key_state = KEY_RELEASED;
key_status = KEY_RELEASED;
}
}
/* 主循环内调用 */
while (1)
{
if(key_status == KEY_SHORT_PRESS){
// 处理短按逻辑...
key_status = KEY_RELEASED;
}
if(key_status == KEY_LONG_PRESS){
// 处理长按逻辑...
key_status = KEY_RELEASED;
}
}
```
阅读全文
相关推荐









