独立按键单击检测(延时消抖+定时器扫描)

目录

独立按键简介

按键抖动

模块接线

延时消抖

Key.h

Key.c

定时器扫描按键代码

Key.h

Key.c

main.c

思考 

MultiButton按键驱动


独立按键简介

​ 轻触按键相当于一种电子开关,按下时开关接通,松开时开关断开,实现原理是通过轻触按键内部的金属弹片受力弹动来实现接通与断开。  ​

按键抖动

由于按键内部使用的是机械式弹簧片来进行通断的,所以在按下和松手的瞬间会伴随有一连串的抖动

当机械触点断开、闭合时,由于机械触点的弹性作用,一个按键开关在闭合时不会马上就稳定的接通,在断开时也不会一下子彻底断开,而是在闭合和断开的瞬间伴随了一连串的抖动。由于单片机检测 IO口速度非常快,超过弹片抖动的频率,所以在检测按键状态时。从而对按键的判断产生一些误操作(比如按一下会产生按多下的效果),因此必须要消除抖动才能正常使用按键。要消除按键抖动的影响。抖动时间的长短由按键的机械特性决定的,一般为5ms 到10ms。

硬件消抖
本节不涉及

软件消抖
延时消抖
定时器消抖

模块接线

按键 STM32F103C8T6
KEY1 PB11
KEY2 PB1

另一端接入GND

延时消抖

按键松手后判定

Key.h

#ifndef       _KEY_H_
#define		  _KEY_H_

void  Key_Init(void);
uint8_t Key_GetNum(void);

#endif

Key.c

#include "stm32f10x.h"                  // Device header
#include "Key.h"
#include "Delay.h"


#define KEY1   GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_11)
#define KEY2   GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1)

void  Key_Init(void)
{
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11 | GPIO_Pin_1;
	GPIO_InitStructure.GPIO_Speed = 
<think>好的,用户想了解STM32定时器用于扫描按键的优势及原理。我需要结合提供的引用内容来组织答案。首先,我需要回顾一下现有的引用资料。 引用1提到定时器间隔扫描模式,每隔一段时间扫描按键是否按下,类似于定时检查。引用2讨论了按键扫描的GPIO配置、状态轮询和优缺点。引用3详细描述了按键的方法,包括延时和两次检测。 用户的问题集中在定时器扫描按键的优势和原理。首先,我需要解释定时器扫描的基本原理,可能涉及定时中断触发扫描,而不是主循环轮询。然后,优势方面应该包括降低CPU占用、提高系统实时性、精确的处理等。 原理部分可能需要分步骤说明:定时器配置、中断触发扫描、状态检测处理。引用3中的方法使用的是软件延时,而定时器可能提供硬件级的精确延时,或者通过周期性的检测来替代软件延时。 优势方面,引用2提到了轮询的缺点,如高CPU占用,而定时器扫描可以解决这个问题。同时,定时器的精确性可以提高的可靠性,避免因主循环阻塞导致的检测不及时。此外,模块化设计可能也是一个优势,便于维护和扩展。 需要注意将技术术语用中文清晰表达,并适当引用提供的资料。例如,定时器中断扫描代替轮询,可以引用[^1]中的定时器间隔扫描模式。部分可以结合引用[^3]的方法,说明如何在定时器中断中实现两次检测。 还需要考虑用户可能的背景,他们可能对STM32的HAL库和定时器有一定了解,但需要明确解释原理和优势,帮助理解为什么定时器扫描更有效。可能还需要对比传统的扫描方法,如主循环轮询,来突出定时器的优势。 最后,生成相关问题时要围绕该主题,比如如何配置定时器的其他方法、多任务处理中的应用等。</think>### STM32定时器扫描按键的优势及原理分析 #### 一、定时器扫描按键的原理 1. **定时器中断驱动** 通过配置定时器产生周期性中断(例如每10ms触发一次),在中断服务函数中执行按键状态检测[^1]。例如: ```c void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { if (htim == &htim3) { Key_Scan(); // 在定时器中断中调用按键扫描函数 } } ``` 2. **状态检测机制** 每次中断触发时读取GPIO引脚电平,并通过**两次间隔检测**实现。例如: ```c if (按键按下) { 记录当前时间戳; // 首次检测到按下 if (连续两次检测均为按下 && 时间差≥阈值) { 标记有效按键事件; // 引用的优化实现 } } ``` 3. **非阻塞式设计** 与主循环轮询不同,定时器扫描无需占用主程序执行时间,适合多任务系统[^2]。 --- #### 二、定时器扫描的四大优势 1. **降低CPU占用率** 传统轮询需持续检查GPIO状态,而定时器仅在中断触发时执行扫描,减少CPU空闲等待时间。 2. **精确控制** 定时器中断间隔可精确设定(如5ms),通过多次采样避免机械动干扰。例如: $$ \text{时间} = N \times T_{\text{中断周期}} \quad (N \geq 2) $$ 3. **实时性提升** 中断响应优先级高于普通任务,确保按键事件及时处理,尤其适合高实时性场景。 4. **模块化与可扩展性** 将按键扫描封装为独立模块,便于移植和维护。支持多按键并行检测,代码结构更清晰。 --- #### 三、典型应用场景 - **低功耗设备**:通过定时器唤醒+扫描,减少常态下的CPU活动 - **复杂系统**:与RTOS结合,避免按键扫描阻塞其他任务 - **高精度需求**:如工业控制中需要ms级响应的按键操作 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值