登录/注册

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;      // 清除标志
            // 执行按键操作
        }
    }
}

关键注意事项

  1. 硬件设计:按键建议接10kΩ上拉/下拉电阻,确保空闲电平稳定。
  2. 消抖时间:通常10-50ms,可根据实际按键特性调整。
  3. 非阻塞处理:优先选择定时器中断法,避免主循环卡顿。
  4. 长按/短按扩展:可通过记录按键持续时间实现更多功能。

根据需求选择合适方案,定时器法更适合复杂系统!

STM32F103VET6

1970-01-01 08:00:00 至 1970-01-01 08:00:00

ARM系列STM32F103芯片的解密方法

破解STM32F103芯片的方法

2023-09-19 09:03:40

ch32v103stm32f103的区别

ch32v103与stm32f103的区别  Ch32v103与STM32f103

2023-08-22 15:49:00

STM32F103用户使用手册

STM32F103用户使用手册

资料下载 倚東聽海 2021-12-06 09:47:21

基于STM32f103的输入捕获测频率和占空比

基于STM32f103的输入捕获测频率和占空比

资料下载 shyshyshy 2021-08-02 10:10:24

基于STM32f103的FFT频率测试程序下载

基于STM32f103的FFT频率测试程序下载

资料下载 shyshyshy 2021-08-02 10:07:20

基于STM32f103使用的DAC正弦波

基于STM32f103使用的DAC正弦波

资料下载 shyshyshy 2021-08-02 10:05:00

STM32F103按键控制数码管加减仿真

STM32F103的按键控制数码管加减仿真

资料下载 Gd12 2021-06-21 09:12:50

STM32F103 GPIO内部电路图讲解

STM32F103 GPIO内部电路图讲解

2023-02-01 16:32:14

基于STM32F103单片机的矩阵按键设计

本实验使用STM32F103单片机,主题代码通用的。

2022-12-09 17:18:46

STM32F103的外部中断要怎样使用呢

STM32F103的外部中断有多少呢?如何对STM32F103的外部中断进行初始化呢?STM32F103的外部中断要怎样

2022-03-01 07:00:54

如何实现STM32F103按键控制的设计呢

如何去实现STM32F103按键控制的设计呢?主要有哪几个步骤呢?

2021-11-25 08:25:42

如何设置STM32F103的死区时间呢

STM32F103单片机有多少定时器呢?通用定时器PWM的工作原理是什么?如何去设置STM32F103的死区时间呢?

2021-11-24 06:36:52

怎样使用基于stm32F103的门禁系统呢?

怎样去使用基于stm32F103的门禁系统呢?怎样去设计一种基于stm32F103

2021-10-19 10:18:20

stm32f030和stm32f103功能差异

stm32f030和stm32f103功能差异主要表现在哪?

2021-07-22 09:35:47

7天热门专题 换一换
相关标签