stm32f103 按键去抖
更多
在STM32F103中实现按键去抖,主要通过软件方法消除机械开关的触点抖动。以下是两种常用方案及示例代码:
方案一:延时检测法(简单阻塞式)
// 按键GPIO配置(以PA0为例,接下拉电阻,按下时高电平)
void Key_Init(void) {
GPIO_InitTypeDef GPIO_InitStruct = {0};
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPD; // 下拉输入
GPIO_Init(GPIOA, &GPIO_InitStruct);
}
// 按键检测函数(返回1表示有效按下)
uint8_t Key_GetState(void) {
if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == SET) { // 检测到高电平
HAL_Delay(20); // 延时20ms去抖
if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == SET) {
while (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == SET); // 等待释放
return 1;
}
}
return 0;
}
// 主循环中使用
int main(void) {
Key_Init();
while (1) {
if (Key_GetState()) {
// 执行按键操作
}
}
}
方案二:定时器中断法(非阻塞式,高效)
// 全局变量记录按键状态
volatile uint8_t key_stable = 0;
uint8_t key_counter = 0;
// 定时器初始化(10ms中断一次)
void Timer_Init(void) {
TIM_TimeBaseInitTypeDef TIM_InitStruct;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
TIM_InitStruct.TIM_Prescaler = 7200 - 1; // 72MHz / 7200 = 10kHz
TIM_InitStruct.TIM_Period = 100 - 1; // 10kHz / 100 = 100Hz (10ms)
TIM_InitStruct.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2, &TIM_InitStruct);
TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
TIM_Cmd(TIM2, ENABLE);
NVIC_EnableIRQ(TIM2_IRQn);
}
// 定时器中断服务函数
void TIM2_IRQHandler(void) {
if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) {
TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
// 按键状态检测
static uint8_t last_state = 0;
uint8_t current_state = GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0);
if (current_state == last_state) {
key_counter++;
if (key_counter >= 3) { // 连续3次检测到相同状态(30ms稳定)
key_stable = current_state;
key_counter = 0;
}
} else {
key_counter = 0;
last_state = current_state;
}
}
}
// 主函数中查询稳定状态
int main(void) {
Key_Init();
Timer_Init();
while (1) {
if (key_stable == SET) { // 按键稳定按下
key_stable = 0; // 清除标志
// 执行按键操作
}
}
}
关键注意事项
- 硬件设计:按键建议接10kΩ上拉/下拉电阻,确保空闲电平稳定。
- 消抖时间:通常10-50ms,可根据实际按键特性调整。
- 非阻塞处理:优先选择定时器中断法,避免主循环卡顿。
- 长按/短按扩展:可通过记录按键持续时间实现更多功能。
根据需求选择合适方案,定时器法更适合复杂系统!
STM32F103VET6
1970-01-01 08:00:00 至 1970-01-01 08:00:00
STM32F103的外部中断要怎样去使用呢
STM32F103的外部中断有多少呢?如何对STM32F103的外部中断进行初始化呢?STM32F103的外部中断要怎样
2022-03-01 07:00:54
7天热门专题
换一换
换一换
- 如何分清usb-c和type-c的区别
- 中国芯片现状怎样?芯片发展分析
- vga接口接线图及vga接口定义
- 芯片的工作原理是什么?
- 华为harmonyos是什么意思,看懂鸿蒙OS系统!
- ssd是什么意思
- 什么是蓝牙?它的主要作用是什么?
- 汽车电子包含哪些领域?
- TWS蓝牙耳机是什么意思?你真的了解吗
- 什么是单片机?有什么用?
- 升压电路图汇总解析
- plc的工作原理是什么?
- 再次免费公开一肖一吗
- 充电桩一般是如何收费的?有哪些收费标准?
- ADC是什么?高精度ADC是什么意思?
- EDA是什么?有什么作用?
- dtmb信号覆盖城市查询
- 中科院研发成功2nm光刻机
- 苹果手机哪几个支持无线充电的?
- type-c四根线接法图解
- 华为芯片为什么受制于美国?
- 怎样挑选路由器?
- 元宇宙概念股龙头一览
- 锂电池和铅酸电池哪个好?
- 什么是场效应管?它的作用是什么?
- 如何进行编码器的正确接线?接线方法介绍
- 虚短与虚断的概念介绍及区别
- 晶振的作用是什么?
- 大疆无人机的价格贵吗?大约在什么价位?
- 苹果nfc功能怎么复制门禁卡
- 单片机和嵌入式的区别是什么
- amoled屏幕和oled区别
- 复位电路的原理及作用
- BLDC电机技术分析
- dsp是什么意思?有什么作用?
- 苹果无线充电器怎么使用?
- iphone13promax电池容量是多少毫安
- 芯片的组成材料有什么
- 特斯拉充电桩充电是如何收费的?收费标准是什么?
- 直流电机驱动电路及原理图
- 传感器常见类型有哪些?
- 自举电路图
- 通讯隔离作用
- 苹果笔记本macbookpro18款与19款区别
- 新斯的指纹芯片供哪些客户
- 伺服电机是如何进行工作的?它的原理是什么?
- 无人机价钱多少?为什么说无人机烧钱?
- 以太网VPN技术概述
- 手机nfc功能打开好还是关闭好
- 十大公认音质好的无线蓝牙耳机